Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
139,695,925.028003169762486677 EverETH_Dividend_Tracker
Holders
84
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0 EverETH_Dividend_TrackerValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
EverETHDividendTracker
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-10-16 */ /** *Submitted for verification at Etherscan.io on 2023-10-16 */ /** *Submitted for verification at Etherscan.io on 2023-10-16 */ /** ███████ ███████ ████████ ██ ██ ██ ██ ██ ██ ██ █████ █████ ██ ███████ ██ ██ ██ ██ ██ ███████ ███████ ██ ██ ██ */ pragma solidity 0.8.19; // SPDX-License-Identifier: MIT interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } 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; } } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor() { _setOwner(_msgSender()); } function owner() public view virtual returns (address) { return _owner; } modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @title SafeMathInt * @dev Math operations for int256 with overflow safety checks. */ library SafeMathInt { int256 private constant MIN_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; } function toUint256Safe(int256 a) internal pure returns (uint256) { require(a >= 0); return uint256(a); } } /** * @title SafeMathUint * @dev Math operations with safety checks that revert on error */ library SafeMathUint { function toInt256Safe(uint256 a) internal pure returns (int256) { int256 b = int256(a); require(b >= 0); return b; } } interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } contract ERC20 is Context, IERC20, IERC20Metadata { using SafeMath for uint256; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve( sender, _msgSender(), _allowances[sender][_msgSender()].sub( amount, "ERC20: transfer amount exceeds allowance" ) ); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub( amount, "ERC20: transfer amount exceeds balance" ); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub( amount, "ERC20: burn amount exceeds balance" ); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } contract EverETH is Context, ERC20, Ownable { using SafeMath for uint256; EverETHDividendTracker public dividendTracker; address constant deadWallet = 0x000000000000000000000000000000000000dEaD; constructor() ERC20("EverETH", "EETH"){ dividendTracker = new EverETHDividendTracker(); // exclude from receiving dividends dividendTracker.excludeFromDividends(address(dividendTracker)); dividendTracker.excludeFromDividends(address(this)); dividendTracker.excludeFromDividends(deadWallet); _mint(owner(), 1000000000 * (10**18)); } receive() external payable {} /// @dev It will send all ETH to dev which are sended accidentally function recoverETH() external onlyOwner { uint256 ETHbalance = address(this).balance; (bool success, ) = payable(owner()).call{value: ETHbalance}(""); require(success); } function recoverERC20(address tokenAddress, uint256 tokenAmount) external onlyOwner { require(tokenAddress != address(this), "Cannot withdraw contract's own tokens"); IERC20(tokenAddress).transfer(owner(), tokenAmount); } function excludeFromDividends(address account) public onlyOwner { dividendTracker.excludeFromDividends(account); } function updateDividendTracker(address newAddress) public onlyOwner { dividendTracker.recoverETH(); EverETHDividendTracker newDividendTracker = EverETHDividendTracker(payable(newAddress)); newDividendTracker.excludeFromDividends( address(newDividendTracker) ); newDividendTracker.excludeFromDividends(address(this)); newDividendTracker.excludeFromDividends(owner()); newDividendTracker.excludeFromDividends(deadWallet); dividendTracker = newDividendTracker; } function updateClaimWait(uint256 claimWait) external onlyOwner { dividendTracker.updateClaimWait(claimWait); } function getTotalDividendsDistributed() external view returns (uint256) { return dividendTracker.totalDividendsDistributed(); } function withdrawableDividendOf(address account) public view returns (uint256) { return dividendTracker.withdrawableDividendOf(account); } function dividendTokenBalanceOf(address account) public view returns (uint256) { return dividendTracker.balanceOf(account); } function getAccountDividendsInfo(address account) external view returns ( address, int256, uint256, uint256, uint256, uint256, uint256 ) { return dividendTracker.getAccount(account); } function getAccountDividendsInfoAtIndex(uint256 index) external view returns ( address, int256, uint256, uint256, uint256, uint256, uint256 ) { return dividendTracker.getAccountAtIndex(index); } function claim() external { dividendTracker.processAccount(payable(msg.sender), false); } function getNumberOfDividendTokenHolders() external view returns (uint256) { return dividendTracker.getNumberOfTokenHolders(); } function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0), "ERC20: transfer from the zero address"); if (amount == 0) { super._transfer(from, to, 0); return; } super._transfer(from, to, amount); try dividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {} try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {} } } interface DividendPayingTokenOptionalInterface { /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function withdrawableDividendOf(address _owner) external view returns (uint256); /// @notice View the amount of dividend in wei that an address has withdrawn. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has withdrawn. function withdrawnDividendOf(address _owner) external view returns (uint256); /// @notice View the amount of dividend in wei that an address has earned in total. /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner) /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has earned in total. function accumulativeDividendOf(address _owner) external view returns (uint256); } interface DividendPayingTokenInterface { /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function dividendOf(address _owner) external view returns (uint256); /// @notice Distributes ether to token holders as dividends. /// @dev SHOULD distribute the paid ether to token holders as dividends. /// SHOULD NOT directly transfer ether to token holders in this function. /// MUST emit a `DividendsDistributed` event when the amount of distributed ether is greater than 0. function distributeDividends() external payable; /// @notice Withdraws the ether distributed to the sender. /// @dev SHOULD transfer `dividendOf(msg.sender)` wei to `msg.sender`, and `dividendOf(msg.sender)` SHOULD be 0 after the transfer. /// MUST emit a `DividendWithdrawn` event if the amount of ether transferred is greater than 0. function withdrawDividend() external; /// @dev This event MUST emit when ether is distributed to token holders. /// @param from The address which sends ether to this contract. /// @param weiAmount The amount of distributed ether in wei. event DividendsDistributed(address indexed from, uint256 weiAmount); /// @dev This event MUST emit when an address withdraws their dividend. /// @param to The address which withdraws ether from this contract. /// @param weiAmount The amount of withdrawn ether in wei. event DividendWithdrawn(address indexed to, uint256 weiAmount); } contract DividendPayingToken is ERC20, DividendPayingTokenInterface, DividendPayingTokenOptionalInterface { 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 internal constant magnitude = 2**128; uint256 internal magnifiedDividendPerShare; // About dividendCorrection: // If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with: // `dividendOf(_user) = dividendPerShare * balanceOf(_user)`. // When `balanceOf(_user)` is changed (via minting/burning/transferring tokens), // `dividendOf(_user)` should not be changed, // but the computed value of `dividendPerShare * balanceOf(_user)` is changed. // To keep the `dividendOf(_user)` unchanged, we add a correction term: // `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`, // where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed: // `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`. // So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed. mapping(address => int256) internal magnifiedDividendCorrections; mapping(address => uint256) internal withdrawnDividends; uint256 public totalDividendsDistributed; constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {} /// @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 payable override { require(totalSupply() > 0); if (msg.value > 0) { magnifiedDividendPerShare = magnifiedDividendPerShare.add( (msg.value).mul(magnitude) / totalSupply() ); emit DividendsDistributed(msg.sender, msg.value); totalDividendsDistributed = totalDividendsDistributed.add( msg.value ); } } /// @notice Withdraws the ether distributed to the sender. /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0. function withdrawDividend() public virtual override { _withdrawDividendOfUser(payable(msg.sender)); } /// @notice Withdraws the ether distributed to the sender. /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0. function _withdrawDividendOfUser(address payable user) internal virtual returns (uint256) { uint256 _withdrawableDividend = withdrawableDividendOf(user); if (_withdrawableDividend > 0) { withdrawnDividends[user] = withdrawnDividends[user].add( _withdrawableDividend ); emit DividendWithdrawn(user, _withdrawableDividend); (bool success, ) = user.call{ value: _withdrawableDividend, gas: 3000 }(""); if (!success) { withdrawnDividends[user] = withdrawnDividends[user].sub( _withdrawableDividend ); return 0; } return _withdrawableDividend; } return 0; } /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function dividendOf(address _owner) public view override returns (uint256) { return withdrawableDividendOf(_owner); } /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function withdrawableDividendOf(address _owner) public view override returns (uint256) { return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]); } /// @notice View the amount of dividend in wei that an address has withdrawn. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has withdrawn. function withdrawnDividendOf(address _owner) public view override returns (uint256) { return withdrawnDividends[_owner]; } /// @notice View the amount of dividend in wei that an address has earned in total. /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner) /// = (magnifiedDividendPerShare * balanceOf(_owner) + magnifiedDividendCorrections[_owner]) / magnitude /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has earned in total. function accumulativeDividendOf(address _owner) public view override returns (uint256) { return magnifiedDividendPerShare .mul(balanceOf(_owner)) .toInt256Safe() .add(magnifiedDividendCorrections[_owner]) .toUint256Safe() / magnitude; } /// @dev Internal function that mints 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 _mint(address account, uint256 value) internal override { super._mint(account, value); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[ account ].sub((magnifiedDividendPerShare.mul(value)).toInt256Safe()); } /// @dev Internal function that burns 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 _burn(address account, uint256 value) internal override { super._burn(account, value); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[ account ].add((magnifiedDividendPerShare.mul(value)).toInt256Safe()); } function _setBalance(address account, uint256 newBalance) internal { uint256 currentBalance = balanceOf(account); if (newBalance > currentBalance) { uint256 mintAmount = newBalance.sub(currentBalance); _mint(account, mintAmount); } else if (newBalance < currentBalance) { uint256 burnAmount = currentBalance.sub(newBalance); _burn(account, burnAmount); } } } library IterableMapping { // Iterable mapping from address to uint; struct Map { address[] keys; mapping(address => uint) values; mapping(address => uint) indexOf; mapping(address => bool) inserted; } function get(Map storage map, address key) public view returns (uint) { return map.values[key]; } function getIndexOfKey(Map storage map, address key) public view returns (int) { if(!map.inserted[key]) { return -1; } return int(map.indexOf[key]); } function getKeyAtIndex(Map storage map, uint index) public view returns (address) { return map.keys[index]; } function size(Map storage map) public view returns (uint) { return map.keys.length; } function set(Map storage map, address key, uint val) public { if (map.inserted[key]) { map.values[key] = val; } else { map.inserted[key] = true; map.values[key] = val; map.indexOf[key] = map.keys.length; map.keys.push(key); } } function remove(Map storage map, address key) public { if (!map.inserted[key]) { return; } delete map.inserted[key]; delete map.values[key]; uint index = map.indexOf[key]; uint lastIndex = map.keys.length - 1; address lastKey = map.keys[lastIndex]; map.indexOf[lastKey] = index; delete map.indexOf[key]; map.keys[index] = lastKey; map.keys.pop(); } } 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 EverETHDividendTracker is DividendPayingToken, Ownable { using SafeMath for uint256; using SafeMathInt for int256; using IterableMapping for IterableMapping.Map; IterableMapping.Map private tokenHoldersMap; mapping (address => bool) public excludedFromDividends; mapping (address => uint256) public lastClaimTimes; uint256 public claimWait; uint256 public minimumTokenBalanceForDividends; event ExcludeFromDividends(address indexed account); event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue); event Claim(address indexed account, uint256 amount, bool indexed automatic); constructor() DividendPayingToken("EverETH_Dividend_Tracker", "EverETH_Dividend_Tracker") { claimWait = 24 hours; minimumTokenBalanceForDividends = 10000 * (10**18); //must hold 10000+ tokens } function _transfer(address, address, uint256) internal pure override { require(false, "EverETH_Dividend_Tracker: No transfers allowed"); } function withdrawDividend() public pure override { require(false, "EverETH_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main EverETH contract."); } function updateMinimumTokenBalanceForDividends(uint256 _newMinimumBalance) external onlyOwner { minimumTokenBalanceForDividends = _newMinimumBalance * (10**18); } /// @dev It will send all ETH to curent contracty owner function recoverETH() external onlyOwner { uint256 ETHbalance = address(this).balance; (bool success, ) = payable(owner()).call{value: ETHbalance}(""); require(success); } function excludeFromDividends(address account) external onlyOwner { require(!excludedFromDividends[account]); excludedFromDividends[account] = true; _setBalance(account, 0); tokenHoldersMap.remove(account); emit ExcludeFromDividends(account); } function updateClaimWait(uint256 newClaimWait) external onlyOwner { require(newClaimWait >= 24 hours && newClaimWait <= 7 days, "EverETH_Dividend_Tracker: claimWait must be updated to between 24 hours and 7 days"); require(newClaimWait != claimWait, "EverETH_Dividend_Tracker: Cannot update claimWait to same value"); emit ClaimWaitUpdated(newClaimWait, claimWait); claimWait = newClaimWait; } function getNumberOfTokenHolders() external view returns(uint256) { return tokenHoldersMap.keys.length; } function getAccount(address _account) public view returns ( address account, int256 index, uint256 withdrawableDividends, uint256 totalDividends, uint256 lastClaimTime, uint256 nextClaimTime, uint256 secondsUntilNextClaimAvailable) { account = _account; index = tokenHoldersMap.getIndexOfKey(account); withdrawableDividends = withdrawableDividendOf(account); totalDividends = accumulativeDividendOf(account); lastClaimTime = lastClaimTimes[account]; nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0; secondsUntilNextClaimAvailable = nextClaimTime > block.timestamp ? nextClaimTime.sub(block.timestamp) : 0; } function getAccountAtIndex(uint256 index) public view returns ( address, int256, uint256, uint256, uint256, uint256, uint256) { if(index >= tokenHoldersMap.size()) { return (0x0000000000000000000000000000000000000000, -1, 0, 0, 0, 0, 0); } address account = tokenHoldersMap.getKeyAtIndex(index); return getAccount(account); } function setBalance(address payable account, uint256 newBalance) external onlyOwner { if(excludedFromDividends[account]) { return; } if(newBalance >= minimumTokenBalanceForDividends) { _setBalance(account, newBalance); tokenHoldersMap.set(account, newBalance); } else { _setBalance(account, 0); tokenHoldersMap.remove(account); } } function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) { uint256 amount = _withdrawDividendOfUser(account); if(amount > 0) { lastClaimTimes[account] = block.timestamp; emit Claim(account, amount, automatic); return true; } return false; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"ClaimWaitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"DividendWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"DividendsDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"ExcludeFromDividends","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":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"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"accumulativeDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributeDividends","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"dividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromDividends","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getAccount","outputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"int256","name":"index","type":"int256"},{"internalType":"uint256","name":"withdrawableDividends","type":"uint256"},{"internalType":"uint256","name":"totalDividends","type":"uint256"},{"internalType":"uint256","name":"lastClaimTime","type":"uint256"},{"internalType":"uint256","name":"nextClaimTime","type":"uint256"},{"internalType":"uint256","name":"secondsUntilNextClaimAvailable","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"getNumberOfTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastClaimTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokenBalanceForDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"bool","name":"automatic","type":"bool"}],"name":"processAccount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"setBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","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":[{"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":[{"internalType":"uint256","name":"newClaimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMinimumBalance","type":"uint256"}],"name":"updateMinimumTokenBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawDividend","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"withdrawnDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280601881526020017f457665724554485f4469766964656e645f547261636b657200000000000000008152506040518060400160405280601881526020017f457665724554485f4469766964656e645f547261636b657200000000000000008152508181816003908162000091919062000431565b508060049081620000a3919062000431565b5050505050620000c8620000bc620000e960201b60201c565b620000f160201b60201c565b6201518060108190555069021e19e0c9bab240000060118190555062000518565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200023957607f821691505b6020821081036200024f576200024e620001f1565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002b97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200027a565b620002c586836200027a565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003126200030c6200030684620002dd565b620002e7565b620002dd565b9050919050565b6000819050919050565b6200032e83620002f1565b620003466200033d8262000319565b84845462000287565b825550505050565b600090565b6200035d6200034e565b6200036a81848462000323565b505050565b5b8181101562000392576200038660008262000353565b60018101905062000370565b5050565b601f821115620003e157620003ab8162000255565b620003b6846200026a565b81016020851015620003c6578190505b620003de620003d5856200026a565b8301826200036f565b50505b505050565b600082821c905092915050565b60006200040660001984600802620003e6565b1980831691505092915050565b6000620004218383620003f3565b9150826002028217905092915050565b6200043c82620001b7565b67ffffffffffffffff811115620004585762000457620001c2565b5b62000464825462000220565b6200047182828562000396565b600060209050601f831160018114620004a9576000841562000494578287015190505b620004a0858262000413565b86555062000510565b601f198416620004b98662000255565b60005b82811015620004e357848901518255600182019150602085019450602081019050620004bc565b86831015620005035784890151620004ff601f891682620003f3565b8355505b6001600288020188555050505b505050505050565b61373b80620005286000396000f3fe6080604052600436106101e75760003560e01c806370a0823111610102578063aafd847a11610095578063e30443bc11610064578063e30443bc1461073e578063e98030c714610767578063f2fde38b14610790578063fbcbc0f1146107b9576101f6565b8063aafd847a1461065c578063bc4c4b3714610699578063be10b614146106d6578063dd62ed3e14610701576101f6565b806391b89fba116100d157806391b89fba1461057a57806395d89b41146105b7578063a8b9d240146105e2578063a9059cbb1461061f576101f6565b806370a08231146104d0578063715018a61461050d57806385a6b3ae146105245780638da5cb5b1461054f576101f6565b806323b872dd1161017a5780634e7b827f116101495780634e7b827f1461040e5780635183d6fd1461044b5780636a4740021461048e5780636f2789ec146104a5576101f6565b806323b872dd1461034057806327ce01471461037d578063313ce567146103ba57806331e79db0146103e5576101f6565b806309bbedde116101b657806309bbedde146102845780630dcb2e89146102af57806318160ddd146102d8578063226cfa3d14610303576101f6565b806303c83302146101fb5780630614117a1461020557806306fdde031461021c578063095ea7b314610247576101f6565b366101f6576101f46107fc565b005b600080fd5b6102036107fc565b005b34801561021157600080fd5b5061021a6108d5565b005b34801561022857600080fd5b506102316109d7565b60405161023e9190612734565b60405180910390f35b34801561025357600080fd5b5061026e600480360381019061026991906127ef565b610a69565b60405161027b919061284a565b60405180910390f35b34801561029057600080fd5b50610299610a87565b6040516102a69190612874565b60405180910390f35b3480156102bb57600080fd5b506102d660048036038101906102d1919061288f565b610a97565b005b3480156102e457600080fd5b506102ed610b30565b6040516102fa9190612874565b60405180910390f35b34801561030f57600080fd5b5061032a600480360381019061032591906128bc565b610b3a565b6040516103379190612874565b60405180910390f35b34801561034c57600080fd5b50610367600480360381019061036291906128e9565b610b52565b604051610374919061284a565b60405180910390f35b34801561038957600080fd5b506103a4600480360381019061039f91906128bc565b610c2b565b6040516103b19190612874565b60405180910390f35b3480156103c657600080fd5b506103cf610cce565b6040516103dc9190612958565b60405180910390f35b3480156103f157600080fd5b5061040c600480360381019061040791906128bc565b610cd7565b005b34801561041a57600080fd5b50610435600480360381019061043091906128bc565b610ebf565b604051610442919061284a565b60405180910390f35b34801561045757600080fd5b50610472600480360381019061046d919061288f565b610edf565b604051610485979695949392919061299b565b60405180910390f35b34801561049a57600080fd5b506104a361104e565b005b3480156104b157600080fd5b506104ba611091565b6040516104c79190612874565b60405180910390f35b3480156104dc57600080fd5b506104f760048036038101906104f291906128bc565b611097565b6040516105049190612874565b60405180910390f35b34801561051957600080fd5b506105226110df565b005b34801561053057600080fd5b50610539611167565b6040516105469190612874565b60405180910390f35b34801561055b57600080fd5b5061056461116d565b6040516105719190612a0a565b60405180910390f35b34801561058657600080fd5b506105a1600480360381019061059c91906128bc565b611197565b6040516105ae9190612874565b60405180910390f35b3480156105c357600080fd5b506105cc6111a9565b6040516105d99190612734565b60405180910390f35b3480156105ee57600080fd5b50610609600480360381019061060491906128bc565b61123b565b6040516106169190612874565b60405180910390f35b34801561062b57600080fd5b50610646600480360381019061064191906127ef565b61129e565b604051610653919061284a565b60405180910390f35b34801561066857600080fd5b50610683600480360381019061067e91906128bc565b6112bc565b6040516106909190612874565b60405180910390f35b3480156106a557600080fd5b506106c060048036038101906106bb9190612a8f565b611305565b6040516106cd919061284a565b60405180910390f35b3480156106e257600080fd5b506106eb611444565b6040516106f89190612874565b60405180910390f35b34801561070d57600080fd5b5061072860048036038101906107239190612acf565b61144a565b6040516107359190612874565b60405180910390f35b34801561074a57600080fd5b5061076560048036038101906107609190612b0f565b6114d1565b005b34801561077357600080fd5b5061078e6004803603810190610789919061288f565b6116a1565b005b34801561079c57600080fd5b506107b760048036038101906107b291906128bc565b6117f0565b005b3480156107c557600080fd5b506107e060048036038101906107db91906128bc565b6118e7565b6040516107f3979695949392919061299b565b60405180910390f35b6000610806610b30565b1161081057600080fd5b60003411156108d357610863610824610b30565b61084870010000000000000000000000000000000034611a2290919063ffffffff16565b6108529190612bad565b600554611a9c90919063ffffffff16565b6005819055503373ffffffffffffffffffffffffffffffffffffffff167fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d78454116511346040516108af9190612874565b60405180910390a26108cc34600854611a9c90919063ffffffff16565b6008819055505b565b6108dd611afa565b73ffffffffffffffffffffffffffffffffffffffff166108fb61116d565b73ffffffffffffffffffffffffffffffffffffffff1614610951576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094890612c2a565b60405180910390fd5b6000479050600061096061116d565b73ffffffffffffffffffffffffffffffffffffffff168260405161098390612c7b565b60006040518083038185875af1925050503d80600081146109c0576040519150601f19603f3d011682016040523d82523d6000602084013e6109c5565b606091505b50509050806109d357600080fd5b5050565b6060600380546109e690612cbf565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1290612cbf565b8015610a5f5780601f10610a3457610100808354040283529160200191610a5f565b820191906000526020600020905b815481529060010190602001808311610a4257829003601f168201915b5050505050905090565b6000610a7d610a76611afa565b8484611b02565b6001905092915050565b6000600a60000180549050905090565b610a9f611afa565b73ffffffffffffffffffffffffffffffffffffffff16610abd61116d565b73ffffffffffffffffffffffffffffffffffffffff1614610b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0a90612c2a565b60405180910390fd5b670de0b6b3a764000081610b279190612cf0565b60118190555050565b6000600254905090565b600f6020528060005260406000206000915090505481565b6000610b5f848484611ccb565b610c2084610b6b611afa565b610c1b856040518060600160405280602881526020016136de60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610bd1611afa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d119092919063ffffffff16565b611b02565b600190509392505050565b6000700100000000000000000000000000000000610cbd610cb8600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610caa610ca5610c9488611097565b600554611a2290919063ffffffff16565b611d75565b611d9290919063ffffffff16565b611ddd565b610cc79190612bad565b9050919050565b60006012905090565b610cdf611afa565b73ffffffffffffffffffffffffffffffffffffffff16610cfd61116d565b73ffffffffffffffffffffffffffffffffffffffff1614610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a90612c2a565b60405180910390fd5b600e60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610daa57600080fd5b6001600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610e0d816000611df4565b600a733e83c94127a6a31caf05c8e4998178acea7066ce634c60db9c9091836040518363ffffffff1660e01b8152600401610e49929190612d48565b60006040518083038186803b158015610e6157600080fd5b505af4158015610e75573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff167fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2560405160405180910390a250565b600e6020528060005260406000206000915054906101000a900460ff1681565b6000806000806000806000600a733e83c94127a6a31caf05c8e4998178acea7066ce63deb3d89690916040518263ffffffff1660e01b8152600401610f249190612d71565b602060405180830381865af4158015610f41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f659190612da1565b8810610fa95760007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008060008060009650965096509650965096509650611043565b6000600a733e83c94127a6a31caf05c8e4998178acea7066ce63d1aa9e7e90918b6040518363ffffffff1660e01b8152600401610fe7929190612ddd565b602060405180830381865af4158015611004573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110289190612e1b565b9050611033816118e7565b9750975097509750975097509750505b919395979092949650565b600061108f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108690612f06565b60405180910390fd5b565b60105481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110e7611afa565b73ffffffffffffffffffffffffffffffffffffffff1661110561116d565b73ffffffffffffffffffffffffffffffffffffffff161461115b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115290612c2a565b60405180910390fd5b6111656000611e61565b565b60085481565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006111a28261123b565b9050919050565b6060600480546111b890612cbf565b80601f01602080910402602001604051908101604052809291908181526020018280546111e490612cbf565b80156112315780601f1061120657610100808354040283529160200191611231565b820191906000526020600020905b81548152906001019060200180831161121457829003601f168201915b5050505050905090565b6000611297600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461128984610c2b565b611f2790919063ffffffff16565b9050919050565b60006112b26112ab611afa565b8484611ccb565b6001905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600061130f611afa565b73ffffffffffffffffffffffffffffffffffffffff1661132d61116d565b73ffffffffffffffffffffffffffffffffffffffff1614611383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137a90612c2a565b60405180910390fd5b600061138e84611f71565b905060008111156114385742600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508215158473ffffffffffffffffffffffffffffffffffffffff167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092836040516114269190612874565b60405180910390a3600191505061143e565b60009150505b92915050565b60115481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6114d9611afa565b73ffffffffffffffffffffffffffffffffffffffff166114f761116d565b73ffffffffffffffffffffffffffffffffffffffff161461154d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154490612c2a565b60405180910390fd5b600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661169d576011548110611624576115b18282611df4565b600a733e83c94127a6a31caf05c8e4998178acea7066ce63bc2b405c909184846040518463ffffffff1660e01b81526004016115ef93929190612f85565b60006040518083038186803b15801561160757600080fd5b505af415801561161b573d6000803e3d6000fd5b5050505061169c565b61162f826000611df4565b600a733e83c94127a6a31caf05c8e4998178acea7066ce634c60db9c9091846040518363ffffffff1660e01b815260040161166b929190612fbc565b60006040518083038186803b15801561168357600080fd5b505af4158015611697573d6000803e3d6000fd5b505050505b5b5050565b6116a9611afa565b73ffffffffffffffffffffffffffffffffffffffff166116c761116d565b73ffffffffffffffffffffffffffffffffffffffff161461171d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171490612c2a565b60405180910390fd5b620151808110158015611733575062093a808111155b611772576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117699061307d565b60405180910390fd5b60105481036117b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ad9061310f565b60405180910390fd5b601054817f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f60405160405180910390a38060108190555050565b6117f8611afa565b73ffffffffffffffffffffffffffffffffffffffff1661181661116d565b73ffffffffffffffffffffffffffffffffffffffff161461186c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186390612c2a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d2906131a1565b60405180910390fd5b6118e481611e61565b50565b6000806000806000806000879650600a733e83c94127a6a31caf05c8e4998178acea7066ce6317e142d19091896040518363ffffffff1660e01b8152600401611931929190612d48565b602060405180830381865af415801561194e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197291906131ed565b955061197d8761123b565b945061198887610c2b565b9350600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600083116119db5760006119f1565b6119f060105484611a9c90919063ffffffff16565b5b9150428211611a01576000611a15565b611a144283611f2790919063ffffffff16565b5b9050919395979092949650565b6000808303611a345760009050611a96565b60008284611a429190612cf0565b9050828482611a519190612bad565b14611a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a889061328c565b60405180910390fd5b809150505b92915050565b6000808284611aab91906132ac565b905083811015611af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae79061332c565b60405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b68906133be565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd790613450565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611cbe9190612874565b60405180910390a3505050565b6000611d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d03906134e2565b60405180910390fd5b505050565b6000838311158290611d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d509190612734565b60405180910390fd5b5060008385611d689190613502565b9050809150509392505050565b6000808290506000811215611d8957600080fd5b80915050919050565b6000808284611da19190613536565b905060008312158015611db45750838112155b80611dca5750600083128015611dc957508381125b5b611dd357600080fd5b8091505092915050565b600080821215611dec57600080fd5b819050919050565b6000611dff83611097565b905080821115611e30576000611e1e8284611f2790919063ffffffff16565b9050611e2a8482612196565b50611e5c565b80821015611e5b576000611e4d8383611f2790919063ffffffff16565b9050611e598482612255565b505b5b505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000611f6983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611d11565b905092915050565b600080611f7d8361123b565b9050600081111561218b57611fda81600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a9c90919063ffffffff16565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d826040516120639190612874565b60405180910390a260008373ffffffffffffffffffffffffffffffffffffffff1682610bb89060405161209590612c7b565b600060405180830381858888f193505050503d80600081146120d3576040519150601f19603f3d011682016040523d82523d6000602084013e6120d8565b606091505b50509050806121815761213382600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f2790919063ffffffff16565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600092505050612191565b8192505050612191565b60009150505b919050565b6121a08282612314565b61220e6121c06121bb83600554611a2290919063ffffffff16565b611d75565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124a790919063ffffffff16565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b61225f82826124f2565b6122cd61227f61227a83600554611a2290919063ffffffff16565b611d75565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d9290919063ffffffff16565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237a906135c6565b60405180910390fd5b61238f6000838361269f565b6123a481600254611a9c90919063ffffffff16565b6002819055506123fb816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a9c90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161249b9190612874565b60405180910390a35050565b60008082846124b691906135e6565b9050600083121580156124c95750838113155b806124df57506000831280156124de57508381135b5b6124e857600080fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612561576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125589061369b565b60405180910390fd5b61256d8260008361269f565b6125d8816040518060600160405280602281526020016136bc602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d119092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061262f81600254611f2790919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516126939190612874565b60405180910390a35050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156126de5780820151818401526020810190506126c3565b60008484015250505050565b6000601f19601f8301169050919050565b6000612706826126a4565b61271081856126af565b93506127208185602086016126c0565b612729816126ea565b840191505092915050565b6000602082019050818103600083015261274e81846126fb565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127868261275b565b9050919050565b6127968161277b565b81146127a157600080fd5b50565b6000813590506127b38161278d565b92915050565b6000819050919050565b6127cc816127b9565b81146127d757600080fd5b50565b6000813590506127e9816127c3565b92915050565b6000806040838503121561280657612805612756565b5b6000612814858286016127a4565b9250506020612825858286016127da565b9150509250929050565b60008115159050919050565b6128448161282f565b82525050565b600060208201905061285f600083018461283b565b92915050565b61286e816127b9565b82525050565b60006020820190506128896000830184612865565b92915050565b6000602082840312156128a5576128a4612756565b5b60006128b3848285016127da565b91505092915050565b6000602082840312156128d2576128d1612756565b5b60006128e0848285016127a4565b91505092915050565b60008060006060848603121561290257612901612756565b5b6000612910868287016127a4565b9350506020612921868287016127a4565b9250506040612932868287016127da565b9150509250925092565b600060ff82169050919050565b6129528161293c565b82525050565b600060208201905061296d6000830184612949565b92915050565b61297c8161277b565b82525050565b6000819050919050565b61299581612982565b82525050565b600060e0820190506129b0600083018a612973565b6129bd602083018961298c565b6129ca6040830188612865565b6129d76060830187612865565b6129e46080830186612865565b6129f160a0830185612865565b6129fe60c0830184612865565b98975050505050505050565b6000602082019050612a1f6000830184612973565b92915050565b6000612a308261275b565b9050919050565b612a4081612a25565b8114612a4b57600080fd5b50565b600081359050612a5d81612a37565b92915050565b612a6c8161282f565b8114612a7757600080fd5b50565b600081359050612a8981612a63565b92915050565b60008060408385031215612aa657612aa5612756565b5b6000612ab485828601612a4e565b9250506020612ac585828601612a7a565b9150509250929050565b60008060408385031215612ae657612ae5612756565b5b6000612af4858286016127a4565b9250506020612b05858286016127a4565b9150509250929050565b60008060408385031215612b2657612b25612756565b5b6000612b3485828601612a4e565b9250506020612b45858286016127da565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612bb8826127b9565b9150612bc3836127b9565b925082612bd357612bd2612b4f565b5b828204905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612c146020836126af565b9150612c1f82612bde565b602082019050919050565b60006020820190508181036000830152612c4381612c07565b9050919050565b600081905092915050565b50565b6000612c65600083612c4a565b9150612c7082612c55565b600082019050919050565b6000612c8682612c58565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612cd757607f821691505b602082108103612cea57612ce9612c90565b5b50919050565b6000612cfb826127b9565b9150612d06836127b9565b9250828202612d14816127b9565b91508282048414831517612d2b57612d2a612b7e565b5b5092915050565b8082525050565b612d428161277b565b82525050565b6000604082019050612d5d6000830185612d32565b612d6a6020830184612d39565b9392505050565b6000602082019050612d866000830184612d32565b92915050565b600081519050612d9b816127c3565b92915050565b600060208284031215612db757612db6612756565b5b6000612dc584828501612d8c565b91505092915050565b612dd7816127b9565b82525050565b6000604082019050612df26000830185612d32565b612dff6020830184612dce565b9392505050565b600081519050612e158161278d565b92915050565b600060208284031215612e3157612e30612756565b5b6000612e3f84828501612e06565b91505092915050565b7f457665724554485f4469766964656e645f547261636b65723a2077697468647260008201527f61774469766964656e642064697361626c65642e20557365207468652027636c60208201527f61696d272066756e6374696f6e206f6e20746865206d61696e2045766572455460408201527f4820636f6e74726163742e000000000000000000000000000000000000000000606082015250565b6000612ef0606b836126af565b9150612efb82612e48565b608082019050919050565b60006020820190508181036000830152612f1f81612ee3565b9050919050565b6000819050919050565b6000612f4b612f46612f418461275b565b612f26565b61275b565b9050919050565b6000612f5d82612f30565b9050919050565b6000612f6f82612f52565b9050919050565b612f7f81612f64565b82525050565b6000606082019050612f9a6000830186612d32565b612fa76020830185612f76565b612fb46040830184612dce565b949350505050565b6000604082019050612fd16000830185612d32565b612fde6020830184612f76565b9392505050565b7f457665724554485f4469766964656e645f547261636b65723a20636c61696d5760008201527f616974206d757374206265207570646174656420746f206265747765656e203260208201527f3420686f75727320616e64203720646179730000000000000000000000000000604082015250565b60006130676052836126af565b915061307282612fe5565b606082019050919050565b600060208201905081810360008301526130968161305a565b9050919050565b7f457665724554485f4469766964656e645f547261636b65723a2043616e6e6f7460008201527f2075706461746520636c61696d5761697420746f2073616d652076616c756500602082015250565b60006130f9603f836126af565b91506131048261309d565b604082019050919050565b60006020820190508181036000830152613128816130ec565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061318b6026836126af565b91506131968261312f565b604082019050919050565b600060208201905081810360008301526131ba8161317e565b9050919050565b6131ca81612982565b81146131d557600080fd5b50565b6000815190506131e7816131c1565b92915050565b60006020828403121561320357613202612756565b5b6000613211848285016131d8565b91505092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b60006132766021836126af565b91506132818261321a565b604082019050919050565b600060208201905081810360008301526132a581613269565b9050919050565b60006132b7826127b9565b91506132c2836127b9565b92508282019050808211156132da576132d9612b7e565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000613316601b836126af565b9150613321826132e0565b602082019050919050565b6000602082019050818103600083015261334581613309565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006133a86024836126af565b91506133b38261334c565b604082019050919050565b600060208201905081810360008301526133d78161339b565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061343a6022836126af565b9150613445826133de565b604082019050919050565b600060208201905081810360008301526134698161342d565b9050919050565b7f457665724554485f4469766964656e645f547261636b65723a204e6f2074726160008201527f6e736665727320616c6c6f776564000000000000000000000000000000000000602082015250565b60006134cc602e836126af565b91506134d782613470565b604082019050919050565b600060208201905081810360008301526134fb816134bf565b9050919050565b600061350d826127b9565b9150613518836127b9565b92508282039050818111156135305761352f612b7e565b5b92915050565b600061354182612982565b915061354c83612982565b92508282019050828112156000831216838212600084121516171561357457613573612b7e565b5b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006135b0601f836126af565b91506135bb8261357a565b602082019050919050565b600060208201905081810360008301526135df816135a3565b9050919050565b60006135f182612982565b91506135fc83612982565b925082820390508181126000841216828213600085121516171561362357613622612b7e565b5b92915050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006136856021836126af565b915061369082613629565b604082019050919050565b600060208201905081810360008301526136b481613678565b905091905056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212207ec7d54126fa5b6b3728411dba7b04ef93278b0b98fc3459e6de61bf1aadca2864736f6c63430008130033
Deployed Bytecode
0x6080604052600436106101e75760003560e01c806370a0823111610102578063aafd847a11610095578063e30443bc11610064578063e30443bc1461073e578063e98030c714610767578063f2fde38b14610790578063fbcbc0f1146107b9576101f6565b8063aafd847a1461065c578063bc4c4b3714610699578063be10b614146106d6578063dd62ed3e14610701576101f6565b806391b89fba116100d157806391b89fba1461057a57806395d89b41146105b7578063a8b9d240146105e2578063a9059cbb1461061f576101f6565b806370a08231146104d0578063715018a61461050d57806385a6b3ae146105245780638da5cb5b1461054f576101f6565b806323b872dd1161017a5780634e7b827f116101495780634e7b827f1461040e5780635183d6fd1461044b5780636a4740021461048e5780636f2789ec146104a5576101f6565b806323b872dd1461034057806327ce01471461037d578063313ce567146103ba57806331e79db0146103e5576101f6565b806309bbedde116101b657806309bbedde146102845780630dcb2e89146102af57806318160ddd146102d8578063226cfa3d14610303576101f6565b806303c83302146101fb5780630614117a1461020557806306fdde031461021c578063095ea7b314610247576101f6565b366101f6576101f46107fc565b005b600080fd5b6102036107fc565b005b34801561021157600080fd5b5061021a6108d5565b005b34801561022857600080fd5b506102316109d7565b60405161023e9190612734565b60405180910390f35b34801561025357600080fd5b5061026e600480360381019061026991906127ef565b610a69565b60405161027b919061284a565b60405180910390f35b34801561029057600080fd5b50610299610a87565b6040516102a69190612874565b60405180910390f35b3480156102bb57600080fd5b506102d660048036038101906102d1919061288f565b610a97565b005b3480156102e457600080fd5b506102ed610b30565b6040516102fa9190612874565b60405180910390f35b34801561030f57600080fd5b5061032a600480360381019061032591906128bc565b610b3a565b6040516103379190612874565b60405180910390f35b34801561034c57600080fd5b50610367600480360381019061036291906128e9565b610b52565b604051610374919061284a565b60405180910390f35b34801561038957600080fd5b506103a4600480360381019061039f91906128bc565b610c2b565b6040516103b19190612874565b60405180910390f35b3480156103c657600080fd5b506103cf610cce565b6040516103dc9190612958565b60405180910390f35b3480156103f157600080fd5b5061040c600480360381019061040791906128bc565b610cd7565b005b34801561041a57600080fd5b50610435600480360381019061043091906128bc565b610ebf565b604051610442919061284a565b60405180910390f35b34801561045757600080fd5b50610472600480360381019061046d919061288f565b610edf565b604051610485979695949392919061299b565b60405180910390f35b34801561049a57600080fd5b506104a361104e565b005b3480156104b157600080fd5b506104ba611091565b6040516104c79190612874565b60405180910390f35b3480156104dc57600080fd5b506104f760048036038101906104f291906128bc565b611097565b6040516105049190612874565b60405180910390f35b34801561051957600080fd5b506105226110df565b005b34801561053057600080fd5b50610539611167565b6040516105469190612874565b60405180910390f35b34801561055b57600080fd5b5061056461116d565b6040516105719190612a0a565b60405180910390f35b34801561058657600080fd5b506105a1600480360381019061059c91906128bc565b611197565b6040516105ae9190612874565b60405180910390f35b3480156105c357600080fd5b506105cc6111a9565b6040516105d99190612734565b60405180910390f35b3480156105ee57600080fd5b50610609600480360381019061060491906128bc565b61123b565b6040516106169190612874565b60405180910390f35b34801561062b57600080fd5b50610646600480360381019061064191906127ef565b61129e565b604051610653919061284a565b60405180910390f35b34801561066857600080fd5b50610683600480360381019061067e91906128bc565b6112bc565b6040516106909190612874565b60405180910390f35b3480156106a557600080fd5b506106c060048036038101906106bb9190612a8f565b611305565b6040516106cd919061284a565b60405180910390f35b3480156106e257600080fd5b506106eb611444565b6040516106f89190612874565b60405180910390f35b34801561070d57600080fd5b5061072860048036038101906107239190612acf565b61144a565b6040516107359190612874565b60405180910390f35b34801561074a57600080fd5b5061076560048036038101906107609190612b0f565b6114d1565b005b34801561077357600080fd5b5061078e6004803603810190610789919061288f565b6116a1565b005b34801561079c57600080fd5b506107b760048036038101906107b291906128bc565b6117f0565b005b3480156107c557600080fd5b506107e060048036038101906107db91906128bc565b6118e7565b6040516107f3979695949392919061299b565b60405180910390f35b6000610806610b30565b1161081057600080fd5b60003411156108d357610863610824610b30565b61084870010000000000000000000000000000000034611a2290919063ffffffff16565b6108529190612bad565b600554611a9c90919063ffffffff16565b6005819055503373ffffffffffffffffffffffffffffffffffffffff167fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d78454116511346040516108af9190612874565b60405180910390a26108cc34600854611a9c90919063ffffffff16565b6008819055505b565b6108dd611afa565b73ffffffffffffffffffffffffffffffffffffffff166108fb61116d565b73ffffffffffffffffffffffffffffffffffffffff1614610951576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094890612c2a565b60405180910390fd5b6000479050600061096061116d565b73ffffffffffffffffffffffffffffffffffffffff168260405161098390612c7b565b60006040518083038185875af1925050503d80600081146109c0576040519150601f19603f3d011682016040523d82523d6000602084013e6109c5565b606091505b50509050806109d357600080fd5b5050565b6060600380546109e690612cbf565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1290612cbf565b8015610a5f5780601f10610a3457610100808354040283529160200191610a5f565b820191906000526020600020905b815481529060010190602001808311610a4257829003601f168201915b5050505050905090565b6000610a7d610a76611afa565b8484611b02565b6001905092915050565b6000600a60000180549050905090565b610a9f611afa565b73ffffffffffffffffffffffffffffffffffffffff16610abd61116d565b73ffffffffffffffffffffffffffffffffffffffff1614610b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0a90612c2a565b60405180910390fd5b670de0b6b3a764000081610b279190612cf0565b60118190555050565b6000600254905090565b600f6020528060005260406000206000915090505481565b6000610b5f848484611ccb565b610c2084610b6b611afa565b610c1b856040518060600160405280602881526020016136de60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610bd1611afa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d119092919063ffffffff16565b611b02565b600190509392505050565b6000700100000000000000000000000000000000610cbd610cb8600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610caa610ca5610c9488611097565b600554611a2290919063ffffffff16565b611d75565b611d9290919063ffffffff16565b611ddd565b610cc79190612bad565b9050919050565b60006012905090565b610cdf611afa565b73ffffffffffffffffffffffffffffffffffffffff16610cfd61116d565b73ffffffffffffffffffffffffffffffffffffffff1614610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a90612c2a565b60405180910390fd5b600e60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610daa57600080fd5b6001600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610e0d816000611df4565b600a733e83c94127a6a31caf05c8e4998178acea7066ce634c60db9c9091836040518363ffffffff1660e01b8152600401610e49929190612d48565b60006040518083038186803b158015610e6157600080fd5b505af4158015610e75573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff167fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2560405160405180910390a250565b600e6020528060005260406000206000915054906101000a900460ff1681565b6000806000806000806000600a733e83c94127a6a31caf05c8e4998178acea7066ce63deb3d89690916040518263ffffffff1660e01b8152600401610f249190612d71565b602060405180830381865af4158015610f41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f659190612da1565b8810610fa95760007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008060008060009650965096509650965096509650611043565b6000600a733e83c94127a6a31caf05c8e4998178acea7066ce63d1aa9e7e90918b6040518363ffffffff1660e01b8152600401610fe7929190612ddd565b602060405180830381865af4158015611004573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110289190612e1b565b9050611033816118e7565b9750975097509750975097509750505b919395979092949650565b600061108f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108690612f06565b60405180910390fd5b565b60105481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110e7611afa565b73ffffffffffffffffffffffffffffffffffffffff1661110561116d565b73ffffffffffffffffffffffffffffffffffffffff161461115b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115290612c2a565b60405180910390fd5b6111656000611e61565b565b60085481565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006111a28261123b565b9050919050565b6060600480546111b890612cbf565b80601f01602080910402602001604051908101604052809291908181526020018280546111e490612cbf565b80156112315780601f1061120657610100808354040283529160200191611231565b820191906000526020600020905b81548152906001019060200180831161121457829003601f168201915b5050505050905090565b6000611297600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461128984610c2b565b611f2790919063ffffffff16565b9050919050565b60006112b26112ab611afa565b8484611ccb565b6001905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600061130f611afa565b73ffffffffffffffffffffffffffffffffffffffff1661132d61116d565b73ffffffffffffffffffffffffffffffffffffffff1614611383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137a90612c2a565b60405180910390fd5b600061138e84611f71565b905060008111156114385742600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508215158473ffffffffffffffffffffffffffffffffffffffff167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092836040516114269190612874565b60405180910390a3600191505061143e565b60009150505b92915050565b60115481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6114d9611afa565b73ffffffffffffffffffffffffffffffffffffffff166114f761116d565b73ffffffffffffffffffffffffffffffffffffffff161461154d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154490612c2a565b60405180910390fd5b600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661169d576011548110611624576115b18282611df4565b600a733e83c94127a6a31caf05c8e4998178acea7066ce63bc2b405c909184846040518463ffffffff1660e01b81526004016115ef93929190612f85565b60006040518083038186803b15801561160757600080fd5b505af415801561161b573d6000803e3d6000fd5b5050505061169c565b61162f826000611df4565b600a733e83c94127a6a31caf05c8e4998178acea7066ce634c60db9c9091846040518363ffffffff1660e01b815260040161166b929190612fbc565b60006040518083038186803b15801561168357600080fd5b505af4158015611697573d6000803e3d6000fd5b505050505b5b5050565b6116a9611afa565b73ffffffffffffffffffffffffffffffffffffffff166116c761116d565b73ffffffffffffffffffffffffffffffffffffffff161461171d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171490612c2a565b60405180910390fd5b620151808110158015611733575062093a808111155b611772576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117699061307d565b60405180910390fd5b60105481036117b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ad9061310f565b60405180910390fd5b601054817f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f60405160405180910390a38060108190555050565b6117f8611afa565b73ffffffffffffffffffffffffffffffffffffffff1661181661116d565b73ffffffffffffffffffffffffffffffffffffffff161461186c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186390612c2a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d2906131a1565b60405180910390fd5b6118e481611e61565b50565b6000806000806000806000879650600a733e83c94127a6a31caf05c8e4998178acea7066ce6317e142d19091896040518363ffffffff1660e01b8152600401611931929190612d48565b602060405180830381865af415801561194e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197291906131ed565b955061197d8761123b565b945061198887610c2b565b9350600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600083116119db5760006119f1565b6119f060105484611a9c90919063ffffffff16565b5b9150428211611a01576000611a15565b611a144283611f2790919063ffffffff16565b5b9050919395979092949650565b6000808303611a345760009050611a96565b60008284611a429190612cf0565b9050828482611a519190612bad565b14611a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a889061328c565b60405180910390fd5b809150505b92915050565b6000808284611aab91906132ac565b905083811015611af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae79061332c565b60405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b68906133be565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd790613450565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611cbe9190612874565b60405180910390a3505050565b6000611d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d03906134e2565b60405180910390fd5b505050565b6000838311158290611d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d509190612734565b60405180910390fd5b5060008385611d689190613502565b9050809150509392505050565b6000808290506000811215611d8957600080fd5b80915050919050565b6000808284611da19190613536565b905060008312158015611db45750838112155b80611dca5750600083128015611dc957508381125b5b611dd357600080fd5b8091505092915050565b600080821215611dec57600080fd5b819050919050565b6000611dff83611097565b905080821115611e30576000611e1e8284611f2790919063ffffffff16565b9050611e2a8482612196565b50611e5c565b80821015611e5b576000611e4d8383611f2790919063ffffffff16565b9050611e598482612255565b505b5b505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000611f6983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611d11565b905092915050565b600080611f7d8361123b565b9050600081111561218b57611fda81600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a9c90919063ffffffff16565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d826040516120639190612874565b60405180910390a260008373ffffffffffffffffffffffffffffffffffffffff1682610bb89060405161209590612c7b565b600060405180830381858888f193505050503d80600081146120d3576040519150601f19603f3d011682016040523d82523d6000602084013e6120d8565b606091505b50509050806121815761213382600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f2790919063ffffffff16565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600092505050612191565b8192505050612191565b60009150505b919050565b6121a08282612314565b61220e6121c06121bb83600554611a2290919063ffffffff16565b611d75565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124a790919063ffffffff16565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b61225f82826124f2565b6122cd61227f61227a83600554611a2290919063ffffffff16565b611d75565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d9290919063ffffffff16565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237a906135c6565b60405180910390fd5b61238f6000838361269f565b6123a481600254611a9c90919063ffffffff16565b6002819055506123fb816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a9c90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161249b9190612874565b60405180910390a35050565b60008082846124b691906135e6565b9050600083121580156124c95750838113155b806124df57506000831280156124de57508381135b5b6124e857600080fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612561576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125589061369b565b60405180910390fd5b61256d8260008361269f565b6125d8816040518060600160405280602281526020016136bc602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d119092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061262f81600254611f2790919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516126939190612874565b60405180910390a35050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156126de5780820151818401526020810190506126c3565b60008484015250505050565b6000601f19601f8301169050919050565b6000612706826126a4565b61271081856126af565b93506127208185602086016126c0565b612729816126ea565b840191505092915050565b6000602082019050818103600083015261274e81846126fb565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127868261275b565b9050919050565b6127968161277b565b81146127a157600080fd5b50565b6000813590506127b38161278d565b92915050565b6000819050919050565b6127cc816127b9565b81146127d757600080fd5b50565b6000813590506127e9816127c3565b92915050565b6000806040838503121561280657612805612756565b5b6000612814858286016127a4565b9250506020612825858286016127da565b9150509250929050565b60008115159050919050565b6128448161282f565b82525050565b600060208201905061285f600083018461283b565b92915050565b61286e816127b9565b82525050565b60006020820190506128896000830184612865565b92915050565b6000602082840312156128a5576128a4612756565b5b60006128b3848285016127da565b91505092915050565b6000602082840312156128d2576128d1612756565b5b60006128e0848285016127a4565b91505092915050565b60008060006060848603121561290257612901612756565b5b6000612910868287016127a4565b9350506020612921868287016127a4565b9250506040612932868287016127da565b9150509250925092565b600060ff82169050919050565b6129528161293c565b82525050565b600060208201905061296d6000830184612949565b92915050565b61297c8161277b565b82525050565b6000819050919050565b61299581612982565b82525050565b600060e0820190506129b0600083018a612973565b6129bd602083018961298c565b6129ca6040830188612865565b6129d76060830187612865565b6129e46080830186612865565b6129f160a0830185612865565b6129fe60c0830184612865565b98975050505050505050565b6000602082019050612a1f6000830184612973565b92915050565b6000612a308261275b565b9050919050565b612a4081612a25565b8114612a4b57600080fd5b50565b600081359050612a5d81612a37565b92915050565b612a6c8161282f565b8114612a7757600080fd5b50565b600081359050612a8981612a63565b92915050565b60008060408385031215612aa657612aa5612756565b5b6000612ab485828601612a4e565b9250506020612ac585828601612a7a565b9150509250929050565b60008060408385031215612ae657612ae5612756565b5b6000612af4858286016127a4565b9250506020612b05858286016127a4565b9150509250929050565b60008060408385031215612b2657612b25612756565b5b6000612b3485828601612a4e565b9250506020612b45858286016127da565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612bb8826127b9565b9150612bc3836127b9565b925082612bd357612bd2612b4f565b5b828204905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612c146020836126af565b9150612c1f82612bde565b602082019050919050565b60006020820190508181036000830152612c4381612c07565b9050919050565b600081905092915050565b50565b6000612c65600083612c4a565b9150612c7082612c55565b600082019050919050565b6000612c8682612c58565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612cd757607f821691505b602082108103612cea57612ce9612c90565b5b50919050565b6000612cfb826127b9565b9150612d06836127b9565b9250828202612d14816127b9565b91508282048414831517612d2b57612d2a612b7e565b5b5092915050565b8082525050565b612d428161277b565b82525050565b6000604082019050612d5d6000830185612d32565b612d6a6020830184612d39565b9392505050565b6000602082019050612d866000830184612d32565b92915050565b600081519050612d9b816127c3565b92915050565b600060208284031215612db757612db6612756565b5b6000612dc584828501612d8c565b91505092915050565b612dd7816127b9565b82525050565b6000604082019050612df26000830185612d32565b612dff6020830184612dce565b9392505050565b600081519050612e158161278d565b92915050565b600060208284031215612e3157612e30612756565b5b6000612e3f84828501612e06565b91505092915050565b7f457665724554485f4469766964656e645f547261636b65723a2077697468647260008201527f61774469766964656e642064697361626c65642e20557365207468652027636c60208201527f61696d272066756e6374696f6e206f6e20746865206d61696e2045766572455460408201527f4820636f6e74726163742e000000000000000000000000000000000000000000606082015250565b6000612ef0606b836126af565b9150612efb82612e48565b608082019050919050565b60006020820190508181036000830152612f1f81612ee3565b9050919050565b6000819050919050565b6000612f4b612f46612f418461275b565b612f26565b61275b565b9050919050565b6000612f5d82612f30565b9050919050565b6000612f6f82612f52565b9050919050565b612f7f81612f64565b82525050565b6000606082019050612f9a6000830186612d32565b612fa76020830185612f76565b612fb46040830184612dce565b949350505050565b6000604082019050612fd16000830185612d32565b612fde6020830184612f76565b9392505050565b7f457665724554485f4469766964656e645f547261636b65723a20636c61696d5760008201527f616974206d757374206265207570646174656420746f206265747765656e203260208201527f3420686f75727320616e64203720646179730000000000000000000000000000604082015250565b60006130676052836126af565b915061307282612fe5565b606082019050919050565b600060208201905081810360008301526130968161305a565b9050919050565b7f457665724554485f4469766964656e645f547261636b65723a2043616e6e6f7460008201527f2075706461746520636c61696d5761697420746f2073616d652076616c756500602082015250565b60006130f9603f836126af565b91506131048261309d565b604082019050919050565b60006020820190508181036000830152613128816130ec565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061318b6026836126af565b91506131968261312f565b604082019050919050565b600060208201905081810360008301526131ba8161317e565b9050919050565b6131ca81612982565b81146131d557600080fd5b50565b6000815190506131e7816131c1565b92915050565b60006020828403121561320357613202612756565b5b6000613211848285016131d8565b91505092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b60006132766021836126af565b91506132818261321a565b604082019050919050565b600060208201905081810360008301526132a581613269565b9050919050565b60006132b7826127b9565b91506132c2836127b9565b92508282019050808211156132da576132d9612b7e565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000613316601b836126af565b9150613321826132e0565b602082019050919050565b6000602082019050818103600083015261334581613309565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006133a86024836126af565b91506133b38261334c565b604082019050919050565b600060208201905081810360008301526133d78161339b565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061343a6022836126af565b9150613445826133de565b604082019050919050565b600060208201905081810360008301526134698161342d565b9050919050565b7f457665724554485f4469766964656e645f547261636b65723a204e6f2074726160008201527f6e736665727320616c6c6f776564000000000000000000000000000000000000602082015250565b60006134cc602e836126af565b91506134d782613470565b604082019050919050565b600060208201905081810360008301526134fb816134bf565b9050919050565b600061350d826127b9565b9150613518836127b9565b92508282039050818111156135305761352f612b7e565b5b92915050565b600061354182612982565b915061354c83612982565b92508282019050828112156000831216838212600084121516171561357457613573612b7e565b5b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006135b0601f836126af565b91506135bb8261357a565b602082019050919050565b600060208201905081810360008301526135df816135a3565b9050919050565b60006135f182612982565b91506135fc83612982565b925082820390508181126000841216828213600085121516171561362357613622612b7e565b5b92915050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006136856021836126af565b915061369082613629565b604082019050919050565b600060208201905081810360008301526136b481613678565b905091905056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212207ec7d54126fa5b6b3728411dba7b04ef93278b0b98fc3459e6de61bf1aadca2864736f6c63430008130033
Deployed Bytecode Sourcemap
34795:4856:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22132:21;:19;:21::i;:::-;34795:4856;;;;;23038:471;;;:::i;:::-;;36303:219;;;;;;;;;;;;;:::i;:::-;;5783:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8091:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37267:119;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36058:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6903:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35103:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8783:454;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26466:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6745:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36534:283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35040:54;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38388:480;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;35857:193;;;;;;;;;;;;;:::i;:::-;;35162:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7074:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2187:94;;;;;;;;;;;;;:::i;:::-;;21866:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1964:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25051:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6002:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25401:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7464;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25838:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39305:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35193:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7743:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38876:421;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36825:434;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2289:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37394:986;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;23038:471;23128:1;23112:13;:11;:13::i;:::-;:17;23104:26;;;;;;23159:1;23147:9;:13;23143:359;;;23205:105;23282:13;:11;:13::i;:::-;23253:26;20742:6;23254:9;23253:15;;:26;;;;:::i;:::-;:42;;;;:::i;:::-;23205:25;;:29;;:105;;;;:::i;:::-;23177:25;:133;;;;23351:10;23330:43;;;23363:9;23330:43;;;;;;:::i;:::-;;;;;;;;23418:72;23466:9;23418:25;;:29;;:72;;;;:::i;:::-;23390:25;:100;;;;23143:359;23038:471::o;36303:219::-;2110:12;:10;:12::i;:::-;2099:23;;:7;:5;:7::i;:::-;:23;;;2091:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36361:18:::1;36382:21;36361:42;;36415:12;36441:7;:5;:7::i;:::-;36433:21;;36462:10;36433:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36414:63;;;36496:7;36488:16;;;::::0;::::1;;36344:178;;36303:219::o:0;5783:100::-;5837:13;5870:5;5863:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5783:100;:::o;8091:210::-;8210:4;8232:39;8241:12;:10;:12::i;:::-;8255:7;8264:6;8232:8;:39::i;:::-;8289:4;8282:11;;8091:210;;;;:::o;37267:119::-;37324:7;37351:15;:20;;:27;;;;37344:34;;37267:119;:::o;36058:176::-;2110:12;:10;:12::i;:::-;2099:23;;:7;:5;:7::i;:::-;:23;;;2091:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36219:6:::1;36197:18;:29;;;;:::i;:::-;36163:31;:63;;;;36058:176:::0;:::o;6903:108::-;6964:7;6991:12;;6984:19;;6903:108;:::o;35103:50::-;;;;;;;;;;;;;;;;;:::o;8783:454::-;8923:4;8940:36;8950:6;8958:9;8969:6;8940:9;:36::i;:::-;8987:220;9010:6;9031:12;:10;:12::i;:::-;9058:138;9114:6;9058:138;;;;;;;;;;;;;;;;;:11;:19;9070:6;9058:19;;;;;;;;;;;;;;;:33;9078:12;:10;:12::i;:::-;9058:33;;;;;;;;;;;;;;;;:37;;:138;;;;;:::i;:::-;8987:8;:220::i;:::-;9225:4;9218:11;;8783:454;;;;;:::o;26466:372::-;26580:7;20742:6;26625:193;:159;26747:28;:36;26776:6;26747:36;;;;;;;;;;;;;;;;26625:99;:66;26673:17;26683:6;26673:9;:17::i;:::-;26625:25;;:47;;:66;;;;:::i;:::-;:97;:99::i;:::-;:121;;:159;;;;:::i;:::-;:191;:193::i;:::-;:205;;;;:::i;:::-;26605:225;;26466:372;;;:::o;6745:93::-;6803:5;6828:2;6821:9;;6745:93;:::o;36534:283::-;2110:12;:10;:12::i;:::-;2099:23;;:7;:5;:7::i;:::-;:23;;;2091:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36617:21:::1;:30;36639:7;36617:30;;;;;;;;;;;;;;;;;;;;;;;;;36616:31;36608:40;;;::::0;::::1;;36689:4;36656:21;:30;36678:7;36656:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;36703:23;36715:7;36724:1;36703:11;:23::i;:::-;36734:15;:22;;;;36757:7;36734:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;36801:7;36780:29;;;;;;;;;;;;36534:283:::0;:::o;35040:54::-;;;;;;;;;;;;;;;;;;;;;;:::o;38388:480::-;38474:7;38496:6;38517:7;38539;38561;38583;38605;38634:15;:20;;;;:22;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38625:5;:31;38622:133;;38681:42;38725:2;38729:1;38732;38735;38738;38741;38673:70;;;;;;;;;;;;;;;;38622:133;38767:15;38785;:29;;;;38815:5;38785:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38767:54;;38841:19;38852:7;38841:10;:19::i;:::-;38834:26;;;;;;;;;;;;;;;38388:480;;;;;;;;;;:::o;35857:193::-;35925:5;35917:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;35857:193::o;35162:24::-;;;;:::o;7074:177::-;7193:7;7225:9;:18;7235:7;7225:18;;;;;;;;;;;;;;;;7218:25;;7074:177;;;:::o;2187:94::-;2110:12;:10;:12::i;:::-;2099:23;;:7;:5;:7::i;:::-;:23;;;2091:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2252:21:::1;2270:1;2252:9;:21::i;:::-;2187:94::o:0;21866:40::-;;;;:::o;1964:87::-;2010:7;2037:6;;;;;;;;;;;2030:13;;1964:87;:::o;25051:131::-;25117:7;25144:30;25167:6;25144:22;:30::i;:::-;25137:37;;25051:131;;;:::o;6002:104::-;6058:13;6091:7;6084:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6002:104;:::o;25401:216::-;25515:7;25547:62;25582:18;:26;25601:6;25582:26;;;;;;;;;;;;;;;;25547:30;25570:6;25547:22;:30::i;:::-;:34;;:62;;;;:::i;:::-;25540:69;;25401:216;;;:::o;7464:::-;7586:4;7608:42;7618:12;:10;:12::i;:::-;7632:9;7643:6;7608:9;:42::i;:::-;7668:4;7661:11;;7464:216;;;;:::o;25838:177::-;25949:7;25981:18;:26;26000:6;25981:26;;;;;;;;;;;;;;;;25974:33;;25838:177;;;:::o;39305:343::-;39396:4;2110:12;:10;:12::i;:::-;2099:23;;:7;:5;:7::i;:::-;:23;;;2091:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39413:14:::1;39430:32;39454:7;39430:23;:32::i;:::-;39413:49;;39484:1;39475:6;:10;39472:147;;;39522:15;39496:14;:23;39511:7;39496:23;;;;;;;;;;;;;;;:41;;;;39580:9;39557:33;;39563:7;39557:33;;;39572:6;39557:33;;;;;;:::i;:::-;;;;;;;;39606:4;39599:11;;;;;39472:147;39635:5;39628:12;;;2170:1;39305:343:::0;;;;:::o;35193:47::-;;;;:::o;7743:201::-;7877:7;7909:11;:18;7921:5;7909:18;;;;;;;;;;;;;;;:27;7928:7;7909:27;;;;;;;;;;;;;;;;7902:34;;7743:201;;;;:::o;38876:421::-;2110:12;:10;:12::i;:::-;2099:23;;:7;:5;:7::i;:::-;:23;;;2091:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38971:21:::1;:30;38993:7;38971:30;;;;;;;;;;;;;;;;;;;;;;;;;39012:7;38968:59;39053:31;;39039:10;:45;39036:254;;39101:32;39113:7;39122:10;39101:11;:32::i;:::-;39142:15;:19;;;;39162:7;39171:10;39142:40;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;39036:254;;;39218:23;39230:7;39239:1;39218:11;:23::i;:::-;39250:15;:22;;;;39273:7;39250:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;39036:254;2170:1;38876:421:::0;;:::o;36825:434::-;2110:12;:10;:12::i;:::-;2099:23;;:7;:5;:7::i;:::-;:23;;;2091:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36926:8:::1;36910:12;:24;;:50;;;;;36954:6;36938:12;:22;;36910:50;36902:145;;;;;;;;;;;;:::i;:::-;;;;;;;;;37082:9;;37066:12;:25:::0;37058:101:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;37206:9;;37192:12;37175:41;;;;;;;;;;37239:12;37227:9;:24;;;;36825:434:::0;:::o;2289:192::-;2110:12;:10;:12::i;:::-;2099:23;;:7;:5;:7::i;:::-;:23;;;2091:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2398:1:::1;2378:22;;:8;:22;;::::0;2370:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2454:19;2464:8;2454:9;:19::i;:::-;2289:192:::0;:::o;37394:986::-;37476:15;37506:12;37533:29;37577:22;37614:21;37650;37686:38;37747:8;37737:18;;37776:15;:29;;;;37806:7;37776:38;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37768:46;;37851:31;37874:7;37851:22;:31::i;:::-;37827:55;;37910:31;37933:7;37910:22;:31::i;:::-;37893:48;;37970:14;:23;37985:7;37970:23;;;;;;;;;;;;;;;;37954:39;;38038:1;38022:13;:17;:126;;38147:1;38022:126;;;38079:28;38097:9;;38079:13;:17;;:28;;;;:::i;:::-;38022:126;38006:142;;38210:15;38194:13;:31;:178;;38371:1;38194:178;;;38281:34;38299:15;38281:13;:17;;:34;;;;:::i;:::-;38194:178;38161:211;;37394:986;;;;;;;;;:::o;31689:471::-;31747:7;31997:1;31992;:6;31988:47;;32022:1;32015:8;;;;31988:47;32047:9;32063:1;32059;:5;;;;:::i;:::-;32047:17;;32092:1;32087;32083;:5;;;;:::i;:::-;:10;32075:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;32151:1;32144:8;;;31689:471;;;;;:::o;30335:181::-;30393:7;30413:9;30429:1;30425;:5;;;;:::i;:::-;30413:17;;30454:1;30449;:6;;30441:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;30507:1;30500:8;;;30335:181;;;;:::o;1385:98::-;1438:7;1465:10;1458:17;;1385:98;:::o;12230:380::-;12383:1;12366:19;;:5;:19;;;12358:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12464:1;12445:21;;:7;:21;;;12437:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12548:6;12518:11;:18;12530:5;12518:18;;;;;;;;;;;;;;;:27;12537:7;12518:27;;;;;;;;;;;;;;;:36;;;;12586:7;12570:32;;12579:5;12570:32;;;12595:6;12570:32;;;;;;:::i;:::-;;;;;;;;12230:380;;;:::o;35697:152::-;35785:5;35777:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;35697:152;;;:::o;31238:192::-;31324:7;31357:1;31352;:6;;31360:12;31344:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;31384:9;31400:1;31396;:5;;;;:::i;:::-;31384:17;;31421:1;31414:8;;;31238:192;;;;;:::o;4403:134::-;4459:6;4474:8;4492:1;4474:20;;4514:1;4509;:6;;4501:15;;;;;;4530:1;4523:8;;;4403:134;;;:::o;3960:176::-;4016:6;4035:8;4050:1;4046;:5;;;;:::i;:::-;4035:16;;4076:1;4071;:6;;:16;;;;;4086:1;4081;:6;;4071:16;4070:38;;;;4097:1;4093;:5;:14;;;;;4106:1;4102;:5;4093:14;4070:38;4062:47;;;;;;4127:1;4120:8;;;3960:176;;;;:::o;4144:127::-;4200:7;4233:1;4228;:6;;4220:15;;;;;;4261:1;4246:17;;4144:127;;;:::o;27975:451::-;28053:22;28078:18;28088:7;28078:9;:18::i;:::-;28053:43;;28126:14;28113:10;:27;28109:310;;;28157:18;28178:30;28193:14;28178:10;:14;;:30;;;;:::i;:::-;28157:51;;28223:26;28229:7;28238:10;28223:5;:26::i;:::-;28142:119;28109:310;;;28284:14;28271:10;:27;28267:152;;;28315:18;28336:30;28355:10;28336:14;:18;;:30;;;;:::i;:::-;28315:51;;28381:26;28387:7;28396:10;28381:5;:26::i;:::-;28300:119;28267:152;28109:310;28042:384;27975:451;;:::o;2489:173::-;2545:16;2564:6;;;;;;;;;;;2545:25;;2590:8;2581:6;;:17;;;;;;;;;;;;;;;;;;2645:8;2614:40;;2635:8;2614:40;;;;;;;;;;;;2534:128;2489:173;:::o;30799:136::-;30857:7;30884:43;30888:1;30891;30884:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;30877:50;;30799:136;;;;:::o;23974:858::-;24082:7;24107:29;24139:28;24162:4;24139:22;:28::i;:::-;24107:60;;24206:1;24182:21;:25;24178:626;;;24251:83;24298:21;24251:18;:24;24270:4;24251:24;;;;;;;;;;;;;;;;:28;;:83;;;;:::i;:::-;24224:18;:24;24243:4;24224:24;;;;;;;;;;;;;;;:110;;;;24372:4;24354:46;;;24378:21;24354:46;;;;;;:::i;:::-;;;;;;;;24416:12;24434:4;:9;;24469:21;24514:4;24434:103;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24415:122;;;24559:7;24554:194;;24614:91;24665:21;24614:18;:24;24633:4;24614:24;;;;;;;;;;;;;;;;:28;;:91;;;;:::i;:::-;24587:18;:24;24606:4;24587:24;;;;;;;;;;;;;;;:118;;;;24731:1;24724:8;;;;;;24554:194;24771:21;24764:28;;;;;;24178:626;24823:1;24816:8;;;23974:858;;;;:::o;27114:284::-;27190:27;27202:7;27211:5;27190:11;:27::i;:::-;27270:120;27336:53;27337:36;27367:5;27337:25;;:29;;:36;;;;:::i;:::-;27336:51;:53::i;:::-;27270:28;:61;27313:7;27270:61;;;;;;;;;;;;;;;;:65;;:120;;;;:::i;:::-;27230:28;:37;27259:7;27230:37;;;;;;;;;;;;;;;:160;;;;27114:284;;:::o;27683:::-;27759:27;27771:7;27780:5;27759:11;:27::i;:::-;27839:120;27905:53;27906:36;27936:5;27906:25;;:29;;:36;;;;:::i;:::-;27905:51;:53::i;:::-;27839:28;:61;27882:7;27839:61;;;;;;;;;;;;;;;;:65;;:120;;;;:::i;:::-;27799:28;:37;27828:7;27799:37;;;;;;;;;;;;;;;:160;;;;27683:284;;:::o;10626:378::-;10729:1;10710:21;;:7;:21;;;10702:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10780:49;10809:1;10813:7;10822:6;10780:20;:49::i;:::-;10857:24;10874:6;10857:12;;:16;;:24;;;;:::i;:::-;10842:12;:39;;;;10913:30;10936:6;10913:9;:18;10923:7;10913:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;10892:9;:18;10902:7;10892:18;;;;;;;;;;;;;;;:51;;;;10980:7;10959:37;;10976:1;10959:37;;;10989:6;10959:37;;;;;;:::i;:::-;;;;;;;;10626:378;;:::o;3696:176::-;3752:6;3771:8;3786:1;3782;:5;;;;:::i;:::-;3771:16;;3812:1;3807;:6;;:16;;;;;3822:1;3817;:6;;3807:16;3806:38;;;;3833:1;3829;:5;:14;;;;;3842:1;3838;:5;3829:14;3806:38;3798:47;;;;;;3863:1;3856:8;;;3696:176;;;;:::o;11337:455::-;11440:1;11421:21;;:7;:21;;;11413:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;11493:49;11514:7;11531:1;11535:6;11493:20;:49::i;:::-;11576:105;11613:6;11576:105;;;;;;;;;;;;;;;;;:9;:18;11586:7;11576:18;;;;;;;;;;;;;;;;:22;;:105;;;;;:::i;:::-;11555:9;:18;11565:7;11555:18;;;;;;;;;;;;;;;:126;;;;11707:24;11724:6;11707:12;;:16;;:24;;;;:::i;:::-;11692:12;:39;;;;11773:1;11747:37;;11756:7;11747:37;;;11777:6;11747:37;;;;;;:::i;:::-;;;;;;;;11337:455;;:::o;13213:125::-;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:222::-;3663:4;3701:2;3690:9;3686:18;3678:26;;3714:71;3782:1;3771:9;3767:17;3758:6;3714:71;:::i;:::-;3570:222;;;;:::o;3798:329::-;3857:6;3906:2;3894:9;3885:7;3881:23;3877:32;3874:119;;;3912:79;;:::i;:::-;3874:119;4032:1;4057:53;4102:7;4093:6;4082:9;4078:22;4057:53;:::i;:::-;4047:63;;4003:117;3798:329;;;;:::o;4133:::-;4192:6;4241:2;4229:9;4220:7;4216:23;4212:32;4209:119;;;4247:79;;:::i;:::-;4209:119;4367:1;4392:53;4437:7;4428:6;4417:9;4413:22;4392:53;:::i;:::-;4382:63;;4338:117;4133:329;;;;:::o;4468:619::-;4545:6;4553;4561;4610:2;4598:9;4589:7;4585:23;4581:32;4578:119;;;4616:79;;:::i;:::-;4578:119;4736:1;4761:53;4806:7;4797:6;4786:9;4782:22;4761:53;:::i;:::-;4751:63;;4707:117;4863:2;4889:53;4934:7;4925:6;4914:9;4910:22;4889:53;:::i;:::-;4879:63;;4834:118;4991:2;5017:53;5062:7;5053:6;5042:9;5038:22;5017:53;:::i;:::-;5007:63;;4962:118;4468:619;;;;;:::o;5093:86::-;5128:7;5168:4;5161:5;5157:16;5146:27;;5093:86;;;:::o;5185:112::-;5268:22;5284:5;5268:22;:::i;:::-;5263:3;5256:35;5185:112;;:::o;5303:214::-;5392:4;5430:2;5419:9;5415:18;5407:26;;5443:67;5507:1;5496:9;5492:17;5483:6;5443:67;:::i;:::-;5303:214;;;;:::o;5523:118::-;5610:24;5628:5;5610:24;:::i;:::-;5605:3;5598:37;5523:118;;:::o;5647:76::-;5683:7;5712:5;5701:16;;5647:76;;;:::o;5729:115::-;5814:23;5831:5;5814:23;:::i;:::-;5809:3;5802:36;5729:115;;:::o;5850:882::-;6109:4;6147:3;6136:9;6132:19;6124:27;;6161:71;6229:1;6218:9;6214:17;6205:6;6161:71;:::i;:::-;6242:70;6308:2;6297:9;6293:18;6284:6;6242:70;:::i;:::-;6322:72;6390:2;6379:9;6375:18;6366:6;6322:72;:::i;:::-;6404;6472:2;6461:9;6457:18;6448:6;6404:72;:::i;:::-;6486:73;6554:3;6543:9;6539:19;6530:6;6486:73;:::i;:::-;6569;6637:3;6626:9;6622:19;6613:6;6569:73;:::i;:::-;6652;6720:3;6709:9;6705:19;6696:6;6652:73;:::i;:::-;5850:882;;;;;;;;;;:::o;6738:222::-;6831:4;6869:2;6858:9;6854:18;6846:26;;6882:71;6950:1;6939:9;6935:17;6926:6;6882:71;:::i;:::-;6738:222;;;;:::o;6966:104::-;7011:7;7040:24;7058:5;7040:24;:::i;:::-;7029:35;;6966:104;;;:::o;7076:138::-;7157:32;7183:5;7157:32;:::i;:::-;7150:5;7147:43;7137:71;;7204:1;7201;7194:12;7137:71;7076:138;:::o;7220:155::-;7274:5;7312:6;7299:20;7290:29;;7328:41;7363:5;7328:41;:::i;:::-;7220:155;;;;:::o;7381:116::-;7451:21;7466:5;7451:21;:::i;:::-;7444:5;7441:32;7431:60;;7487:1;7484;7477:12;7431:60;7381:116;:::o;7503:133::-;7546:5;7584:6;7571:20;7562:29;;7600:30;7624:5;7600:30;:::i;:::-;7503:133;;;;:::o;7642:484::-;7715:6;7723;7772:2;7760:9;7751:7;7747:23;7743:32;7740:119;;;7778:79;;:::i;:::-;7740:119;7898:1;7923:61;7976:7;7967:6;7956:9;7952:22;7923:61;:::i;:::-;7913:71;;7869:125;8033:2;8059:50;8101:7;8092:6;8081:9;8077:22;8059:50;:::i;:::-;8049:60;;8004:115;7642:484;;;;;:::o;8132:474::-;8200:6;8208;8257:2;8245:9;8236:7;8232:23;8228:32;8225:119;;;8263:79;;:::i;:::-;8225:119;8383:1;8408:53;8453:7;8444:6;8433:9;8429:22;8408:53;:::i;:::-;8398:63;;8354:117;8510:2;8536:53;8581:7;8572:6;8561:9;8557:22;8536:53;:::i;:::-;8526:63;;8481:118;8132:474;;;;;:::o;8612:490::-;8688:6;8696;8745:2;8733:9;8724:7;8720:23;8716:32;8713:119;;;8751:79;;:::i;:::-;8713:119;8871:1;8896:61;8949:7;8940:6;8929:9;8925:22;8896:61;:::i;:::-;8886:71;;8842:125;9006:2;9032:53;9077:7;9068:6;9057:9;9053:22;9032:53;:::i;:::-;9022:63;;8977:118;8612:490;;;;;:::o;9108:180::-;9156:77;9153:1;9146:88;9253:4;9250:1;9243:15;9277:4;9274:1;9267:15;9294:180;9342:77;9339:1;9332:88;9439:4;9436:1;9429:15;9463:4;9460:1;9453:15;9480:185;9520:1;9537:20;9555:1;9537:20;:::i;:::-;9532:25;;9571:20;9589:1;9571:20;:::i;:::-;9566:25;;9610:1;9600:35;;9615:18;;:::i;:::-;9600:35;9657:1;9654;9650:9;9645:14;;9480:185;;;;:::o;9671:182::-;9811:34;9807:1;9799:6;9795:14;9788:58;9671:182;:::o;9859:366::-;10001:3;10022:67;10086:2;10081:3;10022:67;:::i;:::-;10015:74;;10098:93;10187:3;10098:93;:::i;:::-;10216:2;10211:3;10207:12;10200:19;;9859:366;;;:::o;10231:419::-;10397:4;10435:2;10424:9;10420:18;10412:26;;10484:9;10478:4;10474:20;10470:1;10459:9;10455:17;10448:47;10512:131;10638:4;10512:131;:::i;:::-;10504:139;;10231:419;;;:::o;10656:147::-;10757:11;10794:3;10779:18;;10656:147;;;;:::o;10809:114::-;;:::o;10929:398::-;11088:3;11109:83;11190:1;11185:3;11109:83;:::i;:::-;11102:90;;11201:93;11290:3;11201:93;:::i;:::-;11319:1;11314:3;11310:11;11303:18;;10929:398;;;:::o;11333:379::-;11517:3;11539:147;11682:3;11539:147;:::i;:::-;11532:154;;11703:3;11696:10;;11333:379;;;:::o;11718:180::-;11766:77;11763:1;11756:88;11863:4;11860:1;11853:15;11887:4;11884:1;11877:15;11904:320;11948:6;11985:1;11979:4;11975:12;11965:22;;12032:1;12026:4;12022:12;12053:18;12043:81;;12109:4;12101:6;12097:17;12087:27;;12043:81;12171:2;12163:6;12160:14;12140:18;12137:38;12134:84;;12190:18;;:::i;:::-;12134:84;11955:269;11904:320;;;:::o;12230:410::-;12270:7;12293:20;12311:1;12293:20;:::i;:::-;12288:25;;12327:20;12345:1;12327:20;:::i;:::-;12322:25;;12382:1;12379;12375:9;12404:30;12422:11;12404:30;:::i;:::-;12393:41;;12583:1;12574:7;12570:15;12567:1;12564:22;12544:1;12537:9;12517:83;12494:139;;12613:18;;:::i;:::-;12494:139;12278:362;12230:410;;;;:::o;12646:129::-;12763:5;12758:3;12751:18;12646:129;;:::o;12781:126::-;12876:24;12894:5;12876:24;:::i;:::-;12871:3;12864:37;12781:126;;:::o;12913:400::-;13064:4;13102:2;13091:9;13087:18;13079:26;;13115:101;13213:1;13202:9;13198:17;13189:6;13115:101;:::i;:::-;13226:80;13302:2;13291:9;13287:18;13278:6;13226:80;:::i;:::-;12913:400;;;;;:::o;13319:282::-;13442:4;13480:2;13469:9;13465:18;13457:26;;13493:101;13591:1;13580:9;13576:17;13567:6;13493:101;:::i;:::-;13319:282;;;;:::o;13607:143::-;13664:5;13695:6;13689:13;13680:22;;13711:33;13738:5;13711:33;:::i;:::-;13607:143;;;;:::o;13756:351::-;13826:6;13875:2;13863:9;13854:7;13850:23;13846:32;13843:119;;;13881:79;;:::i;:::-;13843:119;14001:1;14026:64;14082:7;14073:6;14062:9;14058:22;14026:64;:::i;:::-;14016:74;;13972:128;13756:351;;;;:::o;14113:126::-;14208:24;14226:5;14208:24;:::i;:::-;14203:3;14196:37;14113:126;;:::o;14245:400::-;14396:4;14434:2;14423:9;14419:18;14411:26;;14447:101;14545:1;14534:9;14530:17;14521:6;14447:101;:::i;:::-;14558:80;14634:2;14623:9;14619:18;14610:6;14558:80;:::i;:::-;14245:400;;;;;:::o;14651:143::-;14708:5;14739:6;14733:13;14724:22;;14755:33;14782:5;14755:33;:::i;:::-;14651:143;;;;:::o;14800:351::-;14870:6;14919:2;14907:9;14898:7;14894:23;14890:32;14887:119;;;14925:79;;:::i;:::-;14887:119;15045:1;15070:64;15126:7;15117:6;15106:9;15102:22;15070:64;:::i;:::-;15060:74;;15016:128;14800:351;;;;:::o;15157:368::-;15297:34;15293:1;15285:6;15281:14;15274:58;15366:34;15361:2;15353:6;15349:15;15342:59;15435:34;15430:2;15422:6;15418:15;15411:59;15504:13;15499:2;15491:6;15487:15;15480:38;15157:368;:::o;15531:::-;15673:3;15694:68;15758:3;15753;15694:68;:::i;:::-;15687:75;;15771:93;15860:3;15771:93;:::i;:::-;15889:3;15884;15880:13;15873:20;;15531:368;;;:::o;15905:419::-;16071:4;16109:2;16098:9;16094:18;16086:26;;16158:9;16152:4;16148:20;16144:1;16133:9;16129:17;16122:47;16186:131;16312:4;16186:131;:::i;:::-;16178:139;;15905:419;;;:::o;16330:60::-;16358:3;16379:5;16372:12;;16330:60;;;:::o;16396:142::-;16446:9;16479:53;16497:34;16506:24;16524:5;16506:24;:::i;:::-;16497:34;:::i;:::-;16479:53;:::i;:::-;16466:66;;16396:142;;;:::o;16544:126::-;16594:9;16627:37;16658:5;16627:37;:::i;:::-;16614:50;;16544:126;;;:::o;16676:134::-;16734:9;16767:37;16798:5;16767:37;:::i;:::-;16754:50;;16676:134;;;:::o;16816:155::-;16919:45;16958:5;16919:45;:::i;:::-;16914:3;16907:58;16816:155;;:::o;16977:534::-;17164:4;17202:2;17191:9;17187:18;17179:26;;17215:101;17313:1;17302:9;17298:17;17289:6;17215:101;:::i;:::-;17326:88;17410:2;17399:9;17395:18;17386:6;17326:88;:::i;:::-;17424:80;17500:2;17489:9;17485:18;17476:6;17424:80;:::i;:::-;16977:534;;;;;;:::o;17517:416::-;17676:4;17714:2;17703:9;17699:18;17691:26;;17727:101;17825:1;17814:9;17810:17;17801:6;17727:101;:::i;:::-;17838:88;17922:2;17911:9;17907:18;17898:6;17838:88;:::i;:::-;17517:416;;;;;:::o;17939:306::-;18079:34;18075:1;18067:6;18063:14;18056:58;18148:34;18143:2;18135:6;18131:15;18124:59;18217:20;18212:2;18204:6;18200:15;18193:45;17939:306;:::o;18251:366::-;18393:3;18414:67;18478:2;18473:3;18414:67;:::i;:::-;18407:74;;18490:93;18579:3;18490:93;:::i;:::-;18608:2;18603:3;18599:12;18592:19;;18251:366;;;:::o;18623:419::-;18789:4;18827:2;18816:9;18812:18;18804:26;;18876:9;18870:4;18866:20;18862:1;18851:9;18847:17;18840:47;18904:131;19030:4;18904:131;:::i;:::-;18896:139;;18623:419;;;:::o;19048:250::-;19188:34;19184:1;19176:6;19172:14;19165:58;19257:33;19252:2;19244:6;19240:15;19233:58;19048:250;:::o;19304:366::-;19446:3;19467:67;19531:2;19526:3;19467:67;:::i;:::-;19460:74;;19543:93;19632:3;19543:93;:::i;:::-;19661:2;19656:3;19652:12;19645:19;;19304:366;;;:::o;19676:419::-;19842:4;19880:2;19869:9;19865:18;19857:26;;19929:9;19923:4;19919:20;19915:1;19904:9;19900:17;19893:47;19957:131;20083:4;19957:131;:::i;:::-;19949:139;;19676:419;;;:::o;20101:225::-;20241:34;20237:1;20229:6;20225:14;20218:58;20310:8;20305:2;20297:6;20293:15;20286:33;20101:225;:::o;20332:366::-;20474:3;20495:67;20559:2;20554:3;20495:67;:::i;:::-;20488:74;;20571:93;20660:3;20571:93;:::i;:::-;20689:2;20684:3;20680:12;20673:19;;20332:366;;;:::o;20704:419::-;20870:4;20908:2;20897:9;20893:18;20885:26;;20957:9;20951:4;20947:20;20943:1;20932:9;20928:17;20921:47;20985:131;21111:4;20985:131;:::i;:::-;20977:139;;20704:419;;;:::o;21129:120::-;21201:23;21218:5;21201:23;:::i;:::-;21194:5;21191:34;21181:62;;21239:1;21236;21229:12;21181:62;21129:120;:::o;21255:141::-;21311:5;21342:6;21336:13;21327:22;;21358:32;21384:5;21358:32;:::i;:::-;21255:141;;;;:::o;21402:349::-;21471:6;21520:2;21508:9;21499:7;21495:23;21491:32;21488:119;;;21526:79;;:::i;:::-;21488:119;21646:1;21671:63;21726:7;21717:6;21706:9;21702:22;21671:63;:::i;:::-;21661:73;;21617:127;21402:349;;;;:::o;21757:220::-;21897:34;21893:1;21885:6;21881:14;21874:58;21966:3;21961:2;21953:6;21949:15;21942:28;21757:220;:::o;21983:366::-;22125:3;22146:67;22210:2;22205:3;22146:67;:::i;:::-;22139:74;;22222:93;22311:3;22222:93;:::i;:::-;22340:2;22335:3;22331:12;22324:19;;21983:366;;;:::o;22355:419::-;22521:4;22559:2;22548:9;22544:18;22536:26;;22608:9;22602:4;22598:20;22594:1;22583:9;22579:17;22572:47;22636:131;22762:4;22636:131;:::i;:::-;22628:139;;22355:419;;;:::o;22780:191::-;22820:3;22839:20;22857:1;22839:20;:::i;:::-;22834:25;;22873:20;22891:1;22873:20;:::i;:::-;22868:25;;22916:1;22913;22909:9;22902:16;;22937:3;22934:1;22931:10;22928:36;;;22944:18;;:::i;:::-;22928:36;22780:191;;;;:::o;22977:177::-;23117:29;23113:1;23105:6;23101:14;23094:53;22977:177;:::o;23160:366::-;23302:3;23323:67;23387:2;23382:3;23323:67;:::i;:::-;23316:74;;23399:93;23488:3;23399:93;:::i;:::-;23517:2;23512:3;23508:12;23501:19;;23160:366;;;:::o;23532:419::-;23698:4;23736:2;23725:9;23721:18;23713:26;;23785:9;23779:4;23775:20;23771:1;23760:9;23756:17;23749:47;23813:131;23939:4;23813:131;:::i;:::-;23805:139;;23532:419;;;:::o;23957:223::-;24097:34;24093:1;24085:6;24081:14;24074:58;24166:6;24161:2;24153:6;24149:15;24142:31;23957:223;:::o;24186:366::-;24328:3;24349:67;24413:2;24408:3;24349:67;:::i;:::-;24342:74;;24425:93;24514:3;24425:93;:::i;:::-;24543:2;24538:3;24534:12;24527:19;;24186:366;;;:::o;24558:419::-;24724:4;24762:2;24751:9;24747:18;24739:26;;24811:9;24805:4;24801:20;24797:1;24786:9;24782:17;24775:47;24839:131;24965:4;24839:131;:::i;:::-;24831:139;;24558:419;;;:::o;24983:221::-;25123:34;25119:1;25111:6;25107:14;25100:58;25192:4;25187:2;25179:6;25175:15;25168:29;24983:221;:::o;25210:366::-;25352:3;25373:67;25437:2;25432:3;25373:67;:::i;:::-;25366:74;;25449:93;25538:3;25449:93;:::i;:::-;25567:2;25562:3;25558:12;25551:19;;25210:366;;;:::o;25582:419::-;25748:4;25786:2;25775:9;25771:18;25763:26;;25835:9;25829:4;25825:20;25821:1;25810:9;25806:17;25799:47;25863:131;25989:4;25863:131;:::i;:::-;25855:139;;25582:419;;;:::o;26007:233::-;26147:34;26143:1;26135:6;26131:14;26124:58;26216:16;26211:2;26203:6;26199:15;26192:41;26007:233;:::o;26246:366::-;26388:3;26409:67;26473:2;26468:3;26409:67;:::i;:::-;26402:74;;26485:93;26574:3;26485:93;:::i;:::-;26603:2;26598:3;26594:12;26587:19;;26246:366;;;:::o;26618:419::-;26784:4;26822:2;26811:9;26807:18;26799:26;;26871:9;26865:4;26861:20;26857:1;26846:9;26842:17;26835:47;26899:131;27025:4;26899:131;:::i;:::-;26891:139;;26618:419;;;:::o;27043:194::-;27083:4;27103:20;27121:1;27103:20;:::i;:::-;27098:25;;27137:20;27155:1;27137:20;:::i;:::-;27132:25;;27181:1;27178;27174:9;27166:17;;27205:1;27199:4;27196:11;27193:37;;;27210:18;;:::i;:::-;27193:37;27043:194;;;;:::o;27243:375::-;27282:3;27301:19;27318:1;27301:19;:::i;:::-;27296:24;;27334:19;27351:1;27334:19;:::i;:::-;27329:24;;27376:1;27373;27369:9;27362:16;;27574:1;27569:3;27565:11;27558:19;27554:1;27551;27547:9;27543:35;27526:1;27521:3;27517:11;27512:1;27509;27505:9;27498:17;27494:35;27478:110;27475:136;;;27591:18;;:::i;:::-;27475:136;27243:375;;;;:::o;27624:181::-;27764:33;27760:1;27752:6;27748:14;27741:57;27624:181;:::o;27811:366::-;27953:3;27974:67;28038:2;28033:3;27974:67;:::i;:::-;27967:74;;28050:93;28139:3;28050:93;:::i;:::-;28168:2;28163:3;28159:12;28152:19;;27811:366;;;:::o;28183:419::-;28349:4;28387:2;28376:9;28372:18;28364:26;;28436:9;28430:4;28426:20;28422:1;28411:9;28407:17;28400:47;28464:131;28590:4;28464:131;:::i;:::-;28456:139;;28183:419;;;:::o;28608:372::-;28647:4;28667:19;28684:1;28667:19;:::i;:::-;28662:24;;28700:19;28717:1;28700:19;:::i;:::-;28695:24;;28743:1;28740;28736:9;28728:17;;28937:1;28931:4;28927:12;28923:1;28920;28916:9;28912:28;28895:1;28889:4;28885:12;28880:1;28877;28873:9;28866:17;28862:36;28846:104;28843:130;;;28953:18;;:::i;:::-;28843:130;28608:372;;;;:::o;28986:220::-;29126:34;29122:1;29114:6;29110:14;29103:58;29195:3;29190:2;29182:6;29178:15;29171:28;28986:220;:::o;29212:366::-;29354:3;29375:67;29439:2;29434:3;29375:67;:::i;:::-;29368:74;;29451:93;29540:3;29451:93;:::i;:::-;29569:2;29564:3;29560:12;29553:19;;29212:366;;;:::o;29584:419::-;29750:4;29788:2;29777:9;29773:18;29765:26;;29837:9;29831:4;29827:20;29823:1;29812:9;29808:17;29801:47;29865:131;29991:4;29865:131;:::i;:::-;29857:139;;29584:419;;;:::o
Swarm Source
ipfs://7ec7d54126fa5b6b3728411dba7b04ef93278b0b98fc3459e6de61bf1aadca28
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.