Overview
Max Total Supply
1,000,000,000,000,000SPONGS (CSupply: 999,998,197,456,000)
Holders
13,815 (0.00%)
Market
Price
$0.0003 @ 0.000000 BNB (+24.55%)
Onchain Market Cap
$315,908,200,000.00
Circulating Supply Market Cap
$0.00
Other Info
Token Contract (WITH 9 Decimals)
Balance
8,836,000 SPONGSValue
$2,791.36 ( ~4.0159 BNB) [0.0000%]Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
SPONGS
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity)
/** *Submitted for verification at BscScan.com on 2022-01-05 */ // SPDX-License-Identifier: MIT // https://t.me/Spongsquare pragma solidity ^0.8.6; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ 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; } } contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ 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); } /// @title Dividend-Paying Token Optional Interface /// @author Roger Wu (https://github.com/roger-wu) /// @dev OPTIONAL functions for a dividend-paying token contract. 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); } /// @title Dividend-Paying Token Interface /// @author Roger Wu (https://github.com/roger-wu) /// @dev An interface for a dividend-paying token contract. 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 ); } /** * @title SafeMathInt * @dev Math operations for int256 with overflow safety checks. */ library SafeMathInt { int256 private constant MIN_INT256 = int256(1) << 255; int256 private constant MAX_INT256 = ~(int256(1) << 255); /** * @dev Multiplies two int256 variables and fails on overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { int256 c = a * b; // Detect overflow when multiplying MIN_INT256 with -1 require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256)); require((b == 0) || (c / b == a)); return c; } /** * @dev Division of two int256 variables and fails on overflow. */ function div(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when dividing MIN_INT256 by -1 require(b != -1 || a != MIN_INT256); // Solidity already throws when dividing by 0. return a / b; } /** * @dev Subtracts two int256 variables and fails on overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a)); return c; } /** * @dev Adds two int256 variables and fails on overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a)); return c; } /** * @dev Converts to absolute value, and fails on overflow. */ function abs(int256 a) internal pure returns (int256) { require(a != MIN_INT256); return a < 0 ? -a : a; } function toUint256Safe(int256 a) internal pure returns (uint256) { require(a >= 0); return uint256(a); } } /** * @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; } } 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 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; uint8 private _decimals; /** * @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_, uint8 decimals_) { _name = name_; _symbol = symbol_; _decimals = decimals_; } /** * @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 _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _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 {} } /// @title Dividend-Paying Token /// @author Roger Wu (https://github.com/roger-wu) /// @dev A mintable ERC20 token that allows anyone to pay and distribute ether /// to token holders as dividends and allows token holders to withdraw their dividends. /// Reference: the source code of PoWH3D: https://etherscan.io/address/0xB3775fB83F7D12A36E0475aBdD1FCA35c091efBe#code contract DividendPayingToken is ERC20, DividendPayingTokenInterface, DividendPayingTokenOptionalInterface, Ownable { using SafeMath for uint256; using SafeMathUint for uint256; using SafeMathInt for int256; // With `magnitude`, we can properly distribute dividends even if the amount of received ether is small. // For more discussion about choosing the value of `magnitude`, // see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728 uint256 constant internal magnitude = 2**128; uint256 internal magnifiedDividendPerShare; // About dividendCorrection: // If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with: // `dividendOf(_user) = dividendPerShare * balanceOf(_user)`. // When `balanceOf(_user)` is changed (via minting/burning/transferring tokens), // `dividendOf(_user)` should not be changed, // but the computed value of `dividendPerShare * balanceOf(_user)` is changed. // To keep the `dividendOf(_user)` unchanged, we add a correction term: // `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`, // where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed: // `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`. // So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed. mapping(address => int256) internal magnifiedDividendCorrections; mapping(address => uint256) internal withdrawnDividends; mapping(address => uint256) internal rawBNBWithdrawnDividends; mapping(address => address) public userCurrentRewardToken; mapping(address => bool) public userHasCustomRewardToken; mapping(address => address) public userCurrentRewardAMM; mapping(address => bool) public userHasCustomRewardAMM; mapping(address => uint256) public rewardTokenSelectionCount; // keep track of how many people have each reward token selected (for fun mostly) mapping(address => bool) public ammIsWhiteListed; // only allow whitelisted AMMs mapping(address => bool) public ignoreRewardTokens; IUniswapV2Router02 public uniswapV2Router = IUniswapV2Router02(0x10ED43C718714eb63d5aA57B78B54704E256024E); function updateDividendUniswapV2Router(address newAddress) external onlyOwner { require(newAddress != address(uniswapV2Router), "SPONGS: The router already has that address"); uniswapV2Router = IUniswapV2Router02(newAddress); } uint256 public totalDividendsDistributed; // dividends distributed per reward token constructor(string memory _name, string memory _symbol, uint8 _decimals) ERC20(_name, _symbol, _decimals) { // add whitelisted AMMs here -- more will get added postlaunch ammIsWhiteListed[address(0x10ED43C718714eb63d5aA57B78B54704E256024E)] = true; // PCS V2 router ammIsWhiteListed[address(0x05fF2B0DB69458A0750badebc4f9e13aDd608C7F)] = true; // PCS V1 router ammIsWhiteListed[address(0xcF0feBd3f17CEf5b47b0cD257aCf6025c5BFf3b7)] = true; // ApeSwap router } /// @dev Distributes dividends whenever ether is paid to this contract. receive() external payable { distributeDividends(); } // Customized function to send tokens to dividend recipients function swapETHForTokens( address recipient, uint256 ethAmount ) private returns (uint256) { bool swapSuccess; IERC20 token = IERC20(userCurrentRewardToken[recipient]); IUniswapV2Router02 swapRouter = uniswapV2Router; if(userHasCustomRewardAMM[recipient] && ammIsWhiteListed[userCurrentRewardAMM[recipient]]){ swapRouter = IUniswapV2Router02(userCurrentRewardAMM[recipient]); } // generate the pancake pair path of token -> weth address[] memory path = new address[](2); path[0] = swapRouter.WETH(); path[1] = address(token); // make the swap try swapRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: ethAmount}( //try to swap for tokens, if it fails (bad contract, or whatever other reason, send BNB) 1, // accept any amount of Tokens above 1 wei (so it will fail if nothing returns) path, address(recipient), block.timestamp + 360 ){ swapSuccess = true; } catch { swapSuccess = false; } // if the swap failed, send them their BNB instead if(!swapSuccess){ rawBNBWithdrawnDividends[recipient] = rawBNBWithdrawnDividends[recipient].add(ethAmount); (bool success,) = recipient.call{value: ethAmount, gas: 3000}(""); if(!success) { withdrawnDividends[recipient] = withdrawnDividends[recipient].sub(ethAmount); rawBNBWithdrawnDividends[recipient] = rawBNBWithdrawnDividends[recipient].sub(ethAmount); return 0; } } return ethAmount; } function setIgnoreToken(address tokenAddress, bool isIgnored) external onlyOwner { ignoreRewardTokens[tokenAddress] = isIgnored; } function isIgnoredToken(address tokenAddress) public view returns (bool){ return ignoreRewardTokens[tokenAddress]; } function getRawBNBDividends(address holder) external view returns (uint256){ return rawBNBWithdrawnDividends[holder]; } function setWhiteListAMM(address ammAddress, bool whitelisted) external onlyOwner { ammIsWhiteListed[ammAddress] = whitelisted; } // call this to set a custom reward token (call from token contract only) function setRewardToken(address holder, address rewardTokenAddress, address ammContractAddress) external onlyOwner { if(userHasCustomRewardToken[holder] == true){ if(rewardTokenSelectionCount[userCurrentRewardToken[holder]] > 0){ rewardTokenSelectionCount[userCurrentRewardToken[holder]] -= 1; // remove count from old token } } userHasCustomRewardToken[holder] = true; userCurrentRewardToken[holder] = rewardTokenAddress; // only set custom AMM if the AMM is whitelisted. if(ammContractAddress != address(uniswapV2Router) && ammIsWhiteListed[ammContractAddress]){ userHasCustomRewardAMM[holder] = true; userCurrentRewardAMM[holder] = ammContractAddress; } else { userHasCustomRewardAMM[holder] = false; userCurrentRewardAMM[holder] = address(uniswapV2Router); } rewardTokenSelectionCount[rewardTokenAddress] += 1; // add count to new token } // call this to go back to receiving BNB after setting another token. (call from token contract only) function unsetRewardToken(address holder) external onlyOwner { userHasCustomRewardToken[holder] = false; if(rewardTokenSelectionCount[userCurrentRewardToken[holder]] > 0){ rewardTokenSelectionCount[userCurrentRewardToken[holder]] -= 1; // remove count from old token } userCurrentRewardToken[holder] = address(0); userCurrentRewardAMM[holder] = address(uniswapV2Router); userHasCustomRewardAMM[holder] = false; } /// @notice Distributes ether to token holders as dividends. /// @dev It reverts if the total supply of tokens is 0. /// It emits the `DividendsDistributed` event if the amount of received ether is greater than 0. /// About undistributed ether: /// In each distribution, there is a small amount of ether not distributed, /// the magnified amount of which is /// `(msg.value * magnitude) % totalSupply()`. /// With a well-chosen `magnitude`, the amount of undistributed ether /// (de-magnified) in a distribution can be less than 1 wei. /// We can actually keep track of the undistributed ether in a distribution /// and try to distribute it in the next distribution, /// but keeping track of such data on-chain costs much more than /// the saved ether, so we don't do that. function distributeDividends() public override payable { require(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 returns (uint256) { uint256 _withdrawableDividend = withdrawableDividendOf(user); if (_withdrawableDividend > 0) { // if no custom reward token or reward token is ignored, send BNB. if(!userHasCustomRewardToken[user] && !isIgnoredToken(userCurrentRewardToken[user])){ withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend); rawBNBWithdrawnDividends[user] = rawBNBWithdrawnDividends[user].add(_withdrawableDividend); emit DividendWithdrawn(user, _withdrawableDividend); (bool success,) = user.call{value: _withdrawableDividend, gas: 3000}(""); if(!success) { withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend); rawBNBWithdrawnDividends[user] = rawBNBWithdrawnDividends[user].sub(_withdrawableDividend); return 0; } return _withdrawableDividend; // the reward is a token, not BNB, use an IERC20 buyback instead! } else { withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend); emit DividendWithdrawn(user, _withdrawableDividend); return swapETHForTokens(user, _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 transfer tokens from one address to another. /// Update magnifiedDividendCorrections to keep dividends unchanged. /// @param from The address to transfer from. /// @param to The address to transfer to. /// @param value The amount to be transferred. function _transfer(address from, address to, uint256 value) internal virtual override { require(false); int256 _magCorrection = magnifiedDividendPerShare.mul(value).toInt256Safe(); magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from].add(_magCorrection); magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(_magCorrection); } /// @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); } } } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } contract SPONGS is ERC20, Ownable { using SafeMath for uint256; IUniswapV2Router02 public uniswapV2Router; address public immutable uniswapV2Pair; bool private swapping; SPONGSDividendTracker public dividendTracker; mapping(address => uint256) public holderBNBUsedForBuyBacks; mapping(address => bool) public _isAllowedDuringDisabled; mapping(address => bool) public _isIgnoredAddress; address public liquidityWallet; address public operationsWallet; address private buyBackWallet; uint256 public maxSellTransactionAmount = 1 * 10 ** 12 * (10**9); uint256 public swapTokensAtAmount = 100 * 10 ** 9 * (10**9); // Anti-bot and anti-whale mappings and variables for launch mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch bool public transferDelayEnabled = true; // to track last sell to reduce sell penalty over time by 10% per week the holder sells *no* tokens. mapping (address => uint256) public _holderLastSellDate; // fees uint256 public BNBRewardsFee = 8; uint256 public liquidityFee = 4; // This fee must be a TOTAL of LP, Operations Fee AND Buyback fee (Note, Buyback has been disabled) uint256 public totalFees = BNBRewardsFee.add(liquidityFee); // this is a subset of the liquidity fee, not in addition to. operations fee + buyback fee cannot be higher than liquidity fee. Will be reasonably reduced post launch. uint256 public operationsFee = 2; uint256 public buyBackFee = 0; uint256 public _maxSellPercent = 99; // Set the maximum percent allowed on sale per a single transaction // Disable trading initially bool isTradingEnabled = false; // Swap and liquify active status bool isSwapAndLiquifyEnabled = false; // sells have fees of 4.8 and 12 (16.8 total) (4 * 1.2 and 10 * 1.2) uint256 public immutable sellFeeIncreaseFactor = 200; uint256 public immutable rewardFeeSellFactor = 120; // use by default 300,000 gas to process auto-claiming dividends uint256 public gasForProcessing = 300000; // exlcude from fees and max transaction amount mapping (address => bool) private _isExcludedFromFees; // store addresses that a automatic market maker pairs. Any transfer *to* these addresses // could be subject to a maximum transfer amount mapping (address => bool) public automatedMarketMakerPairs; event UpdateDividendTracker(address indexed newAddress, address indexed oldAddress); event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress); event ExcludeFromFees(address indexed account, bool isExcluded); event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded); event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value); event BuyBackWithNoFees(address indexed holder, uint256 indexed bnbSpent); event LiquidityWalletUpdated(address indexed newLiquidityWallet, address indexed oldLiquidityWallet); event OperationsWalletUpdated(address indexed newLiquidityWallet, address indexed oldLiquidityWallet); event BuyBackWalletUpdated(address indexed newLiquidityWallet, address indexed oldLiquidityWallet); event FeesUpdated(uint256 indexed newBNBRewardsFee, uint256 indexed newLiquidityFee, uint256 newOperationsFee, uint256 newBuyBackFee); event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); event SendDividends( uint256 tokensSwapped, uint256 amount ); event ProcessedDividendTracker( uint256 iterations, uint256 claims, uint256 lastProcessedIndex, bool indexed automatic, uint256 gas, address indexed processor ); constructor() ERC20("SpongeBob Square", "SPONGS", 9) { dividendTracker = new SPONGSDividendTracker(); liquidityWallet = owner(); operationsWallet = owner(); buyBackWallet = owner(); IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x10ED43C718714eb63d5aA57B78B54704E256024E); // Mainnet // IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0xD99D1c33F9fC3444f8101754aBC46c52416550D1); // Testnet // Create a uniswap pair for this new token address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()) .createPair(address(this), _uniswapV2Router.WETH()); uniswapV2Router = _uniswapV2Router; uniswapV2Pair = _uniswapV2Pair; _setAutomatedMarketMakerPair(_uniswapV2Pair, true); // exclude from receiving dividends dividendTracker.excludeFromDividends(address(dividendTracker)); dividendTracker.excludeFromDividends(address(this)); dividendTracker.excludeFromDividends(liquidityWallet); dividendTracker.excludeFromDividends(address(0x000000000000000000000000000000000000dEaD)); // don't want dead address to take BNB!!! dividendTracker.excludeFromDividends(address(_uniswapV2Router)); // exclude from paying fees or having max transaction amount excludeFromFees(liquidityWallet, true); excludeFromFees(address(this), true); excludeFromFees(address(dividendTracker), true); excludeFromFees(address(operationsWallet), true); excludeFromFees(address(buyBackWallet), true); _isAllowedDuringDisabled[address(this)] = true; _isAllowedDuringDisabled[owner()] = true; _isAllowedDuringDisabled[liquidityWallet] = true; /* _mint is an internal function in ERC20.sol that is only called here, and CANNOT be called ever again */ _mint(owner(), 1 * 10**15 * (10**9)); } receive() external payable { } // @dev Owner functions start ------------------------------------- // enable / disable custom AMMs function setWhiteListAMM(address ammAddress, bool isWhiteListed) external onlyOwner { require(isContract(ammAddress), "SPONGS: setWhiteListAMM:: AMM is a wallet, not a contract"); dividendTracker.setWhiteListAMM(ammAddress, isWhiteListed); } // change the minimum amount of tokens to sell from fees function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool){ require(newAmount < totalSupply(), "Swap amount cannot be higher than total supply."); swapTokensAtAmount = newAmount; return true; } // remove transfer delay after launch function disableTransferDelay() external onlyOwner { transferDelayEnabled = false; } // migration feature (DO NOT CHANGE WITHOUT CONSULTATION) function updateDividendTracker(address newAddress) public onlyOwner { require(newAddress != address(dividendTracker), "SPONGS: The dividend tracker already has that address"); SPONGSDividendTracker newDividendTracker = SPONGSDividendTracker(payable(newAddress)); require(newDividendTracker.owner() == address(this), "SPONGS: The new dividend tracker must be owned by the SPONGS token contract"); newDividendTracker.excludeFromDividends(address(newDividendTracker)); newDividendTracker.excludeFromDividends(address(this)); newDividendTracker.excludeFromDividends(owner()); newDividendTracker.excludeFromDividends(address(uniswapV2Router)); emit UpdateDividendTracker(newAddress, address(dividendTracker)); dividendTracker = newDividendTracker; } // updates the maximum amount of tokens that can be bought or sold by holders function updateMaxTxn(uint256 maxTxnAmount) external onlyOwner { maxSellTransactionAmount = maxTxnAmount; } // updates the minimum amount of tokens people must hold in order to get dividends function updateDividendTokensMinimum(uint256 minimumToEarnDivs) external onlyOwner { dividendTracker.updateDividendMinimum(minimumToEarnDivs); } // updates the default router for selling tokens function updateUniswapV2Router(address newAddress) external onlyOwner { require(newAddress != address(uniswapV2Router), "SPONGS: The router already has that address"); emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router)); uniswapV2Router = IUniswapV2Router02(newAddress); } // updates the default router for buying tokens from dividend tracker function updateDividendUniswapV2Router(address newAddress) external onlyOwner { dividendTracker.updateDividendUniswapV2Router(newAddress); } // updates the current trading status of the contract function updateTradingStatus(bool tradingStatus) external onlyOwner { isTradingEnabled = tradingStatus; } // excludes wallets from max txn and fees. function excludeFromFees(address account, bool excluded) public onlyOwner { _isExcludedFromFees[account] = excluded; emit ExcludeFromFees(account, excluded); } // allows multiple exclusions at once function excludeMultipleAccountsFromFees(address[] calldata accounts, bool excluded) external onlyOwner { for(uint256 i = 0; i < accounts.length; i++) { _isExcludedFromFees[accounts[i]] = excluded; } emit ExcludeMultipleAccountsFromFees(accounts, excluded); } function addToWhitelist(address wallet, bool status) external onlyOwner { _isAllowedDuringDisabled[wallet] = status; } function setIsBot(address wallet, bool status) external onlyOwner { _isIgnoredAddress[wallet] = status; } // excludes wallets and contracts from dividends (such as CEX hotwallets, etc.) function excludeFromDividends(address account) external onlyOwner { dividendTracker.excludeFromDividends(account); } // removes exclusion on wallets and contracts from dividends (such as CEX hotwallets, etc.) function includeInDividends(address account) external onlyOwner { dividendTracker.includeInDividends(account); } // allow adding additional AMM pairs to the list function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner { require(pair != uniswapV2Pair, "SPONGS: The PancakeSwap pair cannot be removed from automatedMarketMakerPairs"); _setAutomatedMarketMakerPair(pair, value); } // sets the wallet that receives LP tokens to lock function updateLiquidityWallet(address newLiquidityWallet) external onlyOwner { require(newLiquidityWallet != liquidityWallet, "SPONGS: The liquidity wallet is already this address"); excludeFromFees(newLiquidityWallet, true); emit LiquidityWalletUpdated(newLiquidityWallet, liquidityWallet); liquidityWallet = newLiquidityWallet; } // updates the operations wallet (marketing, charity, etc.) function updateOperationsWallet(address newOperationsWallet) external onlyOwner { require(newOperationsWallet != operationsWallet, "SPONGS: The operations wallet is already this address"); excludeFromFees(newOperationsWallet, true); emit OperationsWalletUpdated(newOperationsWallet, operationsWallet); operationsWallet = newOperationsWallet; } // updates the wallet used for manual buybacks. function updateBuyBackWallet(address newBuyBackWallet) external onlyOwner { require(newBuyBackWallet != buyBackWallet, "SPONGS: The buyback wallet is already this address"); excludeFromFees(newBuyBackWallet, true); emit BuyBackWalletUpdated(newBuyBackWallet, buyBackWallet); buyBackWallet = newBuyBackWallet; } // rebalance fees as needed function updateFees(uint256 bnbRewardPerc, uint256 liquidityPerc, uint256 operationsPerc, uint256 buyBackPerc) external onlyOwner { require (operationsPerc.add(buyBackPerc) <= liquidityPerc, "SPONGS: updateFees:: Liquidity Perc must be equal to or higher than operations and buyback combined."); emit FeesUpdated(bnbRewardPerc, liquidityPerc, operationsPerc, buyBackPerc); BNBRewardsFee = bnbRewardPerc; liquidityFee = liquidityPerc; operationsFee = operationsPerc; buyBackFee= buyBackPerc; totalFees = BNBRewardsFee.add(liquidityFee); } // changes the gas reserve for processing dividend distribution function updateGasForProcessing(uint256 newValue) external onlyOwner { require(newValue >= 200000 && newValue <= 500000, "SPONGS: gasForProcessing must be between 200,000 and 500,000"); require(newValue != gasForProcessing, "SPONGS: Cannot update gasForProcessing to same value"); emit GasForProcessingUpdated(newValue, gasForProcessing); gasForProcessing = newValue; } // changes the amount of time to wait for claims (1-24 hours, expressed in seconds) function updateClaimWait(uint256 claimWait) external onlyOwner returns (bool){ dividendTracker.updateClaimWait(claimWait); return true; } function setIgnoreToken(address tokenAddress, bool isIgnored) external onlyOwner returns (bool){ dividendTracker.setIgnoreToken(tokenAddress, isIgnored); return true; } // @dev Views start here ------------------------------------ // determines if an AMM can be used for rewards function isAMMWhitelisted(address ammAddress) public view returns (bool){ return dividendTracker.ammIsWhiteListed(ammAddress); } function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } function getUserCurrentRewardToken(address holder) public view returns (address){ return dividendTracker.userCurrentRewardToken(holder); } function getUserHasCustomRewardToken(address holder) public view returns (bool){ return dividendTracker.userHasCustomRewardToken(holder); } function getRewardTokenSelectionCount(address token) public view returns (uint256){ return dividendTracker.rewardTokenSelectionCount(token); } function getLastProcessedIndex() external view returns(uint256) { return dividendTracker.getLastProcessedIndex(); } function getNumberOfDividendTokenHolders() external view returns(uint256) { return dividendTracker.getNumberOfTokenHolders(); } // returns a number between 50 and 120 that determines the penalty a user pays on sells. function getHolderSellFactor(address holder) public view returns (uint256){ // get time since last sell measured in 2 week increments uint256 timeSinceLastSale = (block.timestamp.sub(_holderLastSellDate[holder])).div(2 weeks); // protection in case someone tries to use a contract to facilitate buys/sells if(_holderLastSellDate[holder] == 0){ return sellFeeIncreaseFactor; } // cap the sell factor cooldown to 14 weeks and 50% of sell tax if(timeSinceLastSale >= 7){ return 50; // 50% sell factor is minimum } // return the fee factor minus the number of weeks since sale * 10. SellFeeIncreaseFactor is immutable at 120 so the most this can subtract is 6*10 = 120 - 60 = 60% return sellFeeIncreaseFactor-(timeSinceLastSale.mul(10)); } function getDividendTokensMinimum() external view returns (uint256) { return dividendTracker.minimumTokenBalanceForDividends(); } function getClaimWait() external view returns(uint256) { return dividendTracker.claimWait(); } function getTotalDividendsDistributed() external view returns (uint256) { return dividendTracker.totalDividendsDistributed(); } function isExcludedFromFees(address account) public view returns(bool) { return _isExcludedFromFees[account]; } function withdrawableDividendOf(address account) public view returns(uint256) { return dividendTracker.withdrawableDividendOf(account); } function dividendTokenBalanceOf(address account) public view returns (uint256) { return dividendTracker.balanceOf(account); } function getAccountDividendsInfo(address account) external view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { return dividendTracker.getAccount(account); } function getAccountDividendsInfoAtIndex(uint256 index) external view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { return dividendTracker.getAccountAtIndex(index); } function getRawBNBDividends(address holder) public view returns (uint256){ return dividendTracker.getRawBNBDividends(holder); } function getBNBAvailableForHolderBuyBack(address holder) public view returns (uint256){ return getRawBNBDividends(holder).sub(holderBNBUsedForBuyBacks[msg.sender]); } function isIgnoredToken(address tokenAddress) public view returns (bool){ return dividendTracker.isIgnoredToken(tokenAddress); } // @dev User Callable Functions start here! --------------------------------------------- // set the reward token for the user. Call from here. function setRewardToken(address rewardTokenAddress) public returns (bool) { require(isContract(rewardTokenAddress), "SPONGS: setRewardToken:: Address is a wallet, not a contract."); require(rewardTokenAddress != address(this), "SPONGS: setRewardToken:: Cannot set reward token as this token due to Router limitations."); require(!isIgnoredToken(rewardTokenAddress), "SPONGS: setRewardToken:: Reward Token is ignored from being used as rewards."); dividendTracker.setRewardToken(msg.sender, rewardTokenAddress, address(uniswapV2Router)); return true; } // set the reward token for the user with a custom AMM (AMM must be whitelisted). Call from here. function setRewardTokenWithCustomAMM(address rewardTokenAddress, address ammContractAddress) public returns (bool) { require(isContract(rewardTokenAddress), "SPONGS: setRewardToken:: Address is a wallet, not a contract."); require(ammContractAddress != address(uniswapV2Router), "SPONGS: setRewardToken:: Use setRewardToken to use default Router"); require(rewardTokenAddress != address(this), "SPONGS: setRewardToken:: Cannot set reward token as this token due to Router limitations."); require(!isIgnoredToken(rewardTokenAddress), "SPONGS: setRewardToken:: Reward Token is ignored from being used as rewards."); require(isAMMWhitelisted(ammContractAddress) == true, "SPONGS: setRewardToken:: AMM is not whitelisted!"); dividendTracker.setRewardToken(msg.sender, rewardTokenAddress, ammContractAddress); return true; } // Unset the reward token back to BNB. Call from here. function unsetRewardToken() public returns (bool){ dividendTracker.unsetRewardToken(msg.sender); return true; } // Activate trading on the contract and enable swapAndLiquify for tax redemption against LP function activateContract() public onlyOwner { isTradingEnabled = true; isSwapAndLiquifyEnabled = true; } // Holders can buyback with no fees up to their claimed raw BNB amount. function buyBackTokensWithNoFees() external payable returns (bool) { uint256 userRawBNBDividends = getRawBNBDividends(msg.sender); require(userRawBNBDividends >= holderBNBUsedForBuyBacks[msg.sender].add(msg.value), "SPONGS: buyBackTokensWithNoFees:: Cannot Spend more than earned."); uint256 ethAmount = msg.value; // generate the pancake pair path of token -> weth address[] memory path = new address[](2); path[0] = uniswapV2Router.WETH(); path[1] = address(this); // update amount to prevent user from buying with more BNB than they've received as raw rewards (lso update before transfer to prevent reentrancy) holderBNBUsedForBuyBacks[msg.sender] = holderBNBUsedForBuyBacks[msg.sender].add(msg.value); bool prevExclusion = _isExcludedFromFees[msg.sender]; // ensure we don't remove exclusions if the current wallet is already excluded // make the swap to the contract first to bypass fees _isExcludedFromFees[msg.sender] = true; uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: ethAmount}( //try to swap for tokens, if it fails (bad contract, or whatever other reason, send BNB) 0, // accept any amount of Tokens path, address(msg.sender), block.timestamp + 360 ); _isExcludedFromFees[msg.sender] = prevExclusion; // set value to match original value emit BuyBackWithNoFees(msg.sender, ethAmount); return true; } // allows a user to manually claim their tokens. function claim() external { dividendTracker.processAccount(payable(msg.sender), false); } // allow a user to manuall process dividends. function processDividendTracker(uint256 gas) external { (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) = dividendTracker.process(gas); emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, false, gas, tx.origin); } // @dev Token functions function _setAutomatedMarketMakerPair(address pair, bool value) private { require(automatedMarketMakerPairs[pair] != value, "SPONGS: Automated market maker pair is already set to that value"); automatedMarketMakerPairs[pair] = value; if(value) { dividendTracker.excludeFromDividends(pair); } emit SetAutomatedMarketMakerPair(pair, value); } function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require(!_isIgnoredAddress[to] || !_isIgnoredAddress[from], "SPONGS: To/from address is ignored"); if(!isTradingEnabled) { require(_isAllowedDuringDisabled[to] || _isAllowedDuringDisabled[from], "Trading is currently disabled"); } if(automatedMarketMakerPairs[to] && !isTradingEnabled && _isAllowedDuringDisabled[from]) { require((from == owner() || to == owner()) || _isAllowedDuringDisabled[from], "Only dev can trade against PCS during migration"); } // early exit with no other logic if transfering 0 (to prevent 0 transfers from triggering other logic) if(amount == 0) { super._transfer(from, to, 0); return; } // Prevent buying more than 1 txn per block at launch. Bot killer. Will be removed shortly after launch. if (transferDelayEnabled){ if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair) && !_isExcludedFromFees[to] && !_isExcludedFromFees[from]){ require(_holderLastTransferTimestamp[to] < block.timestamp, "_transfer:: Transfer Delay enabled. Please try again later."); _holderLastTransferTimestamp[to] = block.timestamp; } } // set last sell date to first purchase date for new wallet if(!isContract(to) && !_isExcludedFromFees[to]){ if(_holderLastSellDate[to] == 0){ _holderLastSellDate[to] == block.timestamp; } } // update sell date on buys to prevent gaming the decaying sell tax feature. // Every buy moves the sell date up 1/3rd of the difference between last sale date and current timestamp if(!isContract(to) && automatedMarketMakerPairs[from] && !_isExcludedFromFees[to]){ if(_holderLastSellDate[to] >= block.timestamp){ _holderLastSellDate[to] = _holderLastSellDate[to].add(block.timestamp.sub(_holderLastSellDate[to]).div(3)); } } if(automatedMarketMakerPairs[to]){ require(amount <= maxSellTransactionAmount, "BEP20: Exceeds max sell amount"); amount = amount.mul(_maxSellPercent).div(100); // Maximum sell of 99% per one single transaction, to ensure some loose change is left in the holders wallet . } uint256 contractTokenBalance = balanceOf(address(this)); bool canSwap = contractTokenBalance >= swapTokensAtAmount; if( canSwap && !swapping && isSwapAndLiquifyEnabled && !automatedMarketMakerPairs[from] && from != liquidityWallet && to != liquidityWallet && from != operationsWallet && to != operationsWallet && from != buyBackWallet && to != buyBackWallet && !_isExcludedFromFees[to] && !_isExcludedFromFees[from] && from != address(this) && from != address(dividendTracker) ) { swapping = true; uint256 swapTokens = contractTokenBalance.mul(liquidityFee).div(totalFees); swapAndLiquify(swapTokens); uint256 sellTokens = balanceOf(address(this)); swapAndSendDividends(sellTokens); swapping = false; } bool takeFee = !swapping; // if any account belongs to _isExcludedFromFee account then remove the fee if(_isExcludedFromFees[from] || _isExcludedFromFees[to] || from == address(this)) { takeFee = false; } if(takeFee) { uint256 fees = amount.mul(totalFees).div(100); // if sell, multiply by holderSellFactor (decaying sell penalty by 10% every 2 weeks without selling) if(automatedMarketMakerPairs[to]) { uint256 rewardSellFee = amount.mul(BNBRewardsFee).div(100).mul(rewardFeeSellFactor).div(100); uint256 otherSellFee = amount.mul(liquidityFee).div(100).mul(getHolderSellFactor(from)).div(100); fees = rewardSellFee.add(otherSellFee); _holderLastSellDate[from] = block.timestamp; // update last sale date on sell! } amount = amount.sub(fees); super._transfer(from, address(this), fees); } super._transfer(from, to, amount); try dividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {} try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {} if(!swapping) { uint256 gas = gasForProcessing; try dividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) { emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin); } catch { } } } function swapAndLiquify(uint256 tokens) private { if(liquidityFee > 0){ // dividing by 0 is not fun. // split the contract balance into proper pieces // figure out how many tokens should be sold for liquidity vs operations / buybacks. uint256 tokensForLiquidity; if(liquidityFee > 0){ tokensForLiquidity = tokens.mul(liquidityFee.sub(buyBackFee.add(operationsFee))).div(liquidityFee); } else { tokensForLiquidity = 0; } uint256 tokensForBuyBackAndOperations = tokens.sub(tokensForLiquidity); uint256 half = tokensForLiquidity.div(2); uint256 otherHalf = tokensForLiquidity.sub(half); // capture the contract's current ETH balance. // this is so that we can capture exactly the amount of ETH that the // swap creates, and not make the liquidity event include any ETH that // has been manually sent to the contract uint256 initialBalance = address(this).balance; // swap tokens for ETH swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered // how much ETH did we just swap into? uint256 newBalance = address(this).balance.sub(initialBalance); // add liquidity to uniswap addLiquidity(otherHalf, newBalance); swapTokensForEth(tokensForBuyBackAndOperations); uint256 balanceForOperationsAndBuyBack = address(this).balance.sub(initialBalance); bool success; if(operationsFee > 0){ // Send amounts to Operations Wallet uint256 operationsBalance = balanceForOperationsAndBuyBack.mul(operationsFee).div(buyBackFee.add(operationsFee)); (success,) = payable(operationsWallet).call{value: operationsBalance}(""); require(success, "SPONGS: SwapAndLiquify:: Unable to send BNB to Operations Wallet"); } if(buyBackFee > 0){ // Send amounts to BuyBack Wallet uint256 buyBackBalance = balanceForOperationsAndBuyBack.mul(buyBackFee).div(buyBackFee.add(operationsFee)); (success,) = payable(buyBackWallet).call{value: buyBackBalance}(""); require(success, "SPONGS: SwapAndLiquify:: Unable to send BNB to BuyBack Wallet"); } emit SwapAndLiquify(half, newBalance, otherHalf); } } function swapTokensForEth(uint256 tokenAmount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); // make the swap uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(uniswapV2Router), tokenAmount); // add the liquidity uniswapV2Router.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable liquidityWallet, block.timestamp ); } function swapAndSendDividends(uint256 tokens) private { swapTokensForEth(tokens); uint256 dividends = address(this).balance; (bool success,) = address(dividendTracker).call{value: dividends}(""); if(success) { emit SendDividends(tokens, dividends); } } function recoverContractBNB(uint256 recoverRate) public onlyOwner{ uint256 bnbAmount = address(this).balance; if(bnbAmount > 0){ sendToOperationsWallet(bnbAmount.mul(recoverRate).div(100)); } } function sendToOperationsWallet(uint256 amount) private { payable(operationsWallet).transfer(amount); } function setMaxSellPercent(uint256 maxSellPercent) public onlyOwner { require(maxSellPercent < 100, "Max sell percent must be under 100%"); _maxSellPercent = maxSellPercent; } } 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(); } } contract SPONGSDividendTracker is DividendPayingToken { using SafeMath for uint256; using SafeMathInt for int256; using IterableMapping for IterableMapping.Map; IterableMapping.Map private tokenHoldersMap; uint256 public lastProcessedIndex; mapping (address => bool) public excludedFromDividends; mapping (address => uint256) public lastClaimTimes; uint256 public claimWait; uint256 public minimumTokenBalanceForDividends; event ExcludeFromDividends(address indexed account); event IncludeInDividends(address indexed account); event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue); event Claim(address indexed account, uint256 amount, bool indexed automatic); constructor() DividendPayingToken("SPONGS_Dividend_Tracker", "SPONGS_Dividend_Tracker", 9) { claimWait = 3600; minimumTokenBalanceForDividends = 10 * 10 ** 9 * (10**9); //must hold 10,000,000,000+ tokens to get divs } function _transfer(address, address, uint256) pure internal override { require(false, "SPONGS_Dividend_Tracker: No transfers allowed"); } function withdrawDividend() pure public override { require(false, "SPONGS_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main SPONGS contract."); } function excludeFromDividends(address account) external onlyOwner { require(!excludedFromDividends[account]); excludedFromDividends[account] = true; _setBalance(account, 0); tokenHoldersMap.remove(account); emit ExcludeFromDividends(account); } function includeInDividends(address account) external onlyOwner { require(excludedFromDividends[account]); excludedFromDividends[account] = false; emit IncludeInDividends(account); } function updateDividendMinimum(uint256 minimumToEarnDivs) external onlyOwner { minimumTokenBalanceForDividends = minimumToEarnDivs; } function updateClaimWait(uint256 newClaimWait) external onlyOwner { require(newClaimWait >= 3600 && newClaimWait <= 86400, "SPONGS_Dividend_Tracker: claimWait must be updated to between 1 and 24 hours"); require(newClaimWait != claimWait, "SPONGS_Dividend_Tracker: Cannot update claimWait to same value"); emit ClaimWaitUpdated(newClaimWait, claimWait); claimWait = newClaimWait; } function getLastProcessedIndex() external view returns(uint256) { return lastProcessedIndex; } function getNumberOfTokenHolders() external view returns(uint256) { return tokenHoldersMap.keys.length; } function getAccount(address _account) public view returns ( address account, int256 index, int256 iterationsUntilProcessed, uint256 withdrawableDividends, uint256 totalDividends, uint256 lastClaimTime, uint256 nextClaimTime, uint256 secondsUntilAutoClaimAvailable) { account = _account; index = tokenHoldersMap.getIndexOfKey(account); iterationsUntilProcessed = -1; if(index >= 0) { if(uint256(index) > lastProcessedIndex) { iterationsUntilProcessed = index.sub(int256(lastProcessedIndex)); } else { uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length > lastProcessedIndex ? tokenHoldersMap.keys.length.sub(lastProcessedIndex) : 0; iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray)); } } withdrawableDividends = withdrawableDividendOf(account); totalDividends = accumulativeDividendOf(account); lastClaimTime = lastClaimTimes[account]; nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0; secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ? nextClaimTime.sub(block.timestamp) : 0; } function getAccountAtIndex(uint256 index) public view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { if(index >= tokenHoldersMap.size()) { return (0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0, 0, 0); } address account = tokenHoldersMap.getKeyAtIndex(index); return getAccount(account); } function canAutoClaim(uint256 lastClaimTime) private view returns (bool) { if(lastClaimTime > block.timestamp) { return false; } return block.timestamp.sub(lastClaimTime) >= claimWait; } function setBalance(address payable account, uint256 newBalance) external onlyOwner { if(excludedFromDividends[account]) { return; } if(newBalance >= minimumTokenBalanceForDividends) { _setBalance(account, newBalance); tokenHoldersMap.set(account, newBalance); } else { _setBalance(account, 0); tokenHoldersMap.remove(account); } processAccount(account, true); } function process(uint256 gas) public returns (uint256, uint256, uint256) { uint256 numberOfTokenHolders = tokenHoldersMap.keys.length; if(numberOfTokenHolders == 0) { return (0, 0, lastProcessedIndex); } uint256 _lastProcessedIndex = lastProcessedIndex; uint256 gasUsed = 0; uint256 gasLeft = gasleft(); uint256 iterations = 0; uint256 claims = 0; while(gasUsed < gas && iterations < numberOfTokenHolders) { _lastProcessedIndex++; if(_lastProcessedIndex >= tokenHoldersMap.keys.length) { _lastProcessedIndex = 0; } address account = tokenHoldersMap.keys[_lastProcessedIndex]; if(canAutoClaim(lastClaimTimes[account])) { if(processAccount(payable(account), true)) { claims++; } } iterations++; uint256 newGasLeft = gasleft(); if(gasLeft > newGasLeft) { gasUsed = gasUsed.add(gasLeft.sub(newGasLeft)); } gasLeft = newGasLeft; } lastProcessedIndex = _lastProcessedIndex; return (iterations, claims, lastProcessedIndex); } function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) { uint256 amount = _withdrawDividendOfUser(account); if(amount > 0) { lastClaimTimes[account] = block.timestamp; emit Claim(account, amount, automatic); return true; } return false; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"BuyBackWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"indexed":true,"internalType":"uint256","name":"bnbSpent","type":"uint256"}],"name":"BuyBackWithNoFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newBNBRewardsFee","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"newLiquidityFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newOperationsFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBuyBackFee","type":"uint256"}],"name":"FeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"OperationsWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[],"name":"BNBRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_holderLastSellDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isAllowedDuringDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isIgnoredAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxSellPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activateContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBackTokensWithNoFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract SPONGSDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getBNBAvailableForHolderBuyBack","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDividendTokensMinimum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getHolderSellFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getRawBNBDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getRewardTokenSelectionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getUserCurrentRewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getUserHasCustomRewardToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"holderBNBUsedForBuyBacks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ammAddress","type":"address"}],"name":"isAMMWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"isIgnoredToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellTransactionAmount","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":"operationsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationsWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"recoverRate","type":"uint256"}],"name":"recoverContractBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardFeeSellFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFeeIncreaseFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"bool","name":"isIgnored","type":"bool"}],"name":"setIgnoreToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setIsBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSellPercent","type":"uint256"}],"name":"setMaxSellPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rewardTokenAddress","type":"address"}],"name":"setRewardToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rewardTokenAddress","type":"address"},{"internalType":"address","name":"ammContractAddress","type":"address"}],"name":"setRewardTokenWithCustomAMM","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ammAddress","type":"address"},{"internalType":"bool","name":"isWhiteListed","type":"bool"}],"name":"setWhiteListAMM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","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":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unsetRewardToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newBuyBackWallet","type":"address"}],"name":"updateBuyBackWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minimumToEarnDivs","type":"uint256"}],"name":"updateDividendTokensMinimum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bnbRewardPerc","type":"uint256"},{"internalType":"uint256","name":"liquidityPerc","type":"uint256"},{"internalType":"uint256","name":"operationsPerc","type":"uint256"},{"internalType":"uint256","name":"buyBackPerc","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLiquidityWallet","type":"address"}],"name":"updateLiquidityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxnAmount","type":"uint256"}],"name":"updateMaxTxn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOperationsWallet","type":"address"}],"name":"updateOperationsWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"tradingStatus","type":"bool"}],"name":"updateTradingStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e0604052683635c9adc5dea00000600e5568056bc75e2d63100000600f5560118054600160ff199091161790556008601381905560046014819055620000539190620006ca602090811b6200342717901c565b6015556002601655600060175560636018556019805461ffff1916905560c860a052607860c052620493e0601a553480156200008e57600080fd5b50604080518082018252601081526f53706f6e6765426f622053717561726560801b60208083019182528351808501909452600684526553504f4e475360d01b908401528151919291600991620000e9916003919062000a5a565b508151620000ff90600490602085019062000a5a565b506005805460ff191660ff929092169190911790555060009050620001213390565b60058054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350604051620001859062000ae9565b604051809103906000f080158015620001a2573d6000803e3d6000fd5b50600780546001600160a01b039283166001600160a01b031991821617909155600554600b80548316610100909204909316908117909255600c8054821683179055600d805490911690911790556040805163c45a015560e01b815290517310ed43c718714eb63d5aa57b78b54704e256024e91600091839163c45a0155916004808301926020929190829003018186803b1580156200024157600080fd5b505afa15801562000256573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200027c919062000b0e565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620002c557600080fd5b505afa158015620002da573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000300919062000b0e565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200034957600080fd5b505af11580156200035e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000384919062000b0e565b600680546001600160a01b0319166001600160a01b038516179055606081901b6001600160601b0319166080529050620003c081600162000738565b60075460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b1580156200040757600080fd5b505af11580156200041c573d6000803e3d6000fd5b505060075460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200046657600080fd5b505af11580156200047b573d6000803e3d6000fd5b5050600754600b5460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b158015620004c957600080fd5b505af1158015620004de573d6000803e3d6000fd5b505060075460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200052a57600080fd5b505af11580156200053f573d6000803e3d6000fd5b505060075460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b1580156200058b57600080fd5b505af1158015620005a0573d6000803e3d6000fd5b5050600b54620005be92506001600160a01b0316905060016200089d565b620005cb3060016200089d565b600754620005e4906001600160a01b031660016200089d565b600c54620005fd906001600160a01b031660016200089d565b600d5462000616906001600160a01b031660016200089d565b3060009081526009602081905260408220805460ff19166001908117909155916200064e60055461010090046001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055600b5490911681526009909252902080549091166001179055620006c2620006b160055461010090046001600160a01b031690565b69d3c21bcecceda10000006200095e565b505062000b9d565b600080620006d9838562000b39565b905083811015620007315760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b9392505050565b6001600160a01b0382166000908152601c602052604090205460ff1615158115151415620007d1576040805162461bcd60e51b81526020600482015260248101919091527f53504f4e47533a204175746f6d61746564206d61726b6574206d616b6572207060448201527f61697220697320616c72656164792073657420746f20746861742076616c7565606482015260840162000728565b6001600160a01b0382166000908152601c60205260409020805460ff19168215801591909117909155620008615760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200084757600080fd5b505af11580156200085c573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03610100909104163314620008ff5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000728565b6001600160a01b0382166000818152601b6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620009b65760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000728565b620009d281600254620006ca60201b620034271790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000a0591839062003427620006ca821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b82805462000a689062000b60565b90600052602060002090601f01602090048101928262000a8c576000855562000ad7565b82601f1062000aa757805160ff191683800117855562000ad7565b8280016001018555821562000ad7579182015b8281111562000ad757825182559160200191906001019062000aba565b5062000ae592915062000af7565b5090565b6131c88062005eb483390190565b5b8082111562000ae5576000815560010162000af8565b60006020828403121562000b2157600080fd5b81516001600160a01b03811681146200073157600080fd5b6000821982111562000b5b57634e487b7160e01b600052601160045260246000fd5b500190565b600181811c9082168062000b7557607f821691505b6020821081141562000b9757634e487b7160e01b600052602260045260246000fd5b50919050565b60805160601c60a05160c0516152c162000bf3600039600081816108740152613f2b01526000818161065c0152818161126201526112a90152600081816107dc01528181612272015261399001526152c16000f3fe6080604052600436106104b85760003560e01c80638aee81271161026b578063c876d0b91161014f578063dfb6d223116100c1578063e884f26011610085578063e884f26014610f42578063e98030c714610f57578063f27fd25414610f77578063f2fde38b14610f97578063f9fbb13814610fb7578063fd72e22a14610fcc57600080fd5b8063dfb6d22314610eb7578063e127299214610ed7578063e2f4560514610ef7578063e37ba8f914610f0d578063e7841ec014610f2d57600080fd5b8063d32cf92911610113578063d32cf92914610de9578063d406450314610e09578063d469801614610e29578063d5de7e9d14610e49578063dad80fc414610e69578063dd62ed3e14610e7157600080fd5b8063c876d0b914610d59578063cd06ab7314610d73578063d01f581614610d93578063d257b34f14610da9578063d2bbdac214610dc957600080fd5b8063a47e9917116101e8578063bc728a6f116101ac578063bc728a6f14610c99578063bc93233f14610cb9578063c024666814610cd9578063c0f306ef14610cf9578063c492f04614610d19578063c6616ba114610d3957600080fd5b8063a47e991714610ba4578063a8b9d24014610bc4578063a9059cbb14610be4578063ad56c13c14610c04578063b62496f514610c6957600080fd5b80639a7a23d61161022f5780639a7a23d614610b235780639c1b8af514610b43578063a04018ee14610b59578063a26579ad14610b6f578063a457c2d714610b8457600080fd5b80638aee812714610aa05780638da5cb5b14610ac05780638fda356d14610ae357806395d89b4114610af857806398118cb414610b0d57600080fd5b80633d01b8a71161039d5780636843cd841161030f578063727ccaee116102d3578063727ccaee146109c35780638021974b146109f0578063870000e114610a10578063871c128d14610a30578063872d57c614610a5057806388bdd9be14610a8057600080fd5b80636843cd841461091857806368fc741514610938578063700bb1911461095857806370a0823114610978578063715018a6146109ae57600080fd5b80634fbee193116103615780634fbee19314610829578063514ac7a51461086257806359992dbc146108965780635ca7047e146108b657806364b0f653146108e357806365b8dbc0146108f857600080fd5b80633d01b8a714610795578063479c5266146107b557806349bd5a5e146107ca5780634be8f8b1146107fe5780634e71d92d1461081457600080fd5b80631a8dd2f7116104365780632c1f5216116103fa5780632c1f5216146106de57806330bb4cff146106fe57806330d5d18d14610713578063313ce5671461073357806331e79db014610755578063395093511461077557600080fd5b80631a8dd2f71461062a57806322bd3f7f1461064a57806323b872dd1461067e5780632501ff161461069e5780632bc4d48b146106be57600080fd5b8063090896be1161047d578063090896be14610591578063095ea7b3146105a757806313114a9d146105c75780631694505e146105dd57806318160ddd1461061557600080fd5b8062637439146104c457806302259e9e1461050957806303c0f5d41461052d57806306e7b14d1461054f57806306fdde031461056f57600080fd5b366104bf57005b600080fd5b3480156104d057600080fd5b506104f46104df366004614ac7565b60096020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561051557600080fd5b5061051f600e5481565b604051908152602001610500565b34801561053957600080fd5b5061054d610548366004614b7b565b610fec565b005b34801561055b57600080fd5b5061054d61056a366004614ac7565b611050565b34801561057b57600080fd5b50610584611161565b6040516105009190614e63565b34801561059d57600080fd5b5061051f60165481565b3480156105b357600080fd5b506104f46105c2366004614c13565b6111f3565b3480156105d357600080fd5b5061051f60155481565b3480156105e957600080fd5b506006546105fd906001600160a01b031681565b6040516001600160a01b039091168152602001610500565b34801561062157600080fd5b5060025461051f565b34801561063657600080fd5b5061051f610645366004614ac7565b61120a565b34801561065657600080fd5b5061051f7f000000000000000000000000000000000000000000000000000000000000000081565b34801561068a57600080fd5b506104f4610699366004614b3a565b6112d4565b3480156106aa57600080fd5b506104f46106b9366004614ac7565b61133d565b3480156106ca57600080fd5b5061054d6106d9366004614cff565b6113bc565b3480156106ea57600080fd5b506007546105fd906001600160a01b031681565b34801561070a57600080fd5b5061051f6113f1565b34801561071f57600080fd5b5061054d61072e366004614ac7565b611473565b34801561073f57600080fd5b5060055460405160ff9091168152602001610500565b34801561076157600080fd5b5061054d610770366004614ac7565b611587565b34801561078157600080fd5b506104f4610790366004614c13565b61161a565b3480156107a157600080fd5b506104f46107b0366004614ac7565b611650565b3480156107c157600080fd5b5061051f611683565b3480156107d657600080fd5b506105fd7f000000000000000000000000000000000000000000000000000000000000000081565b34801561080a57600080fd5b5061051f60175481565b34801561082057600080fd5b5061054d6116c8565b34801561083557600080fd5b506104f4610844366004614ac7565b6001600160a01b03166000908152601b602052604090205460ff1690565b34801561086e57600080fd5b5061051f7f000000000000000000000000000000000000000000000000000000000000000081565b3480156108a257600080fd5b5061054d6108b1366004614cff565b61174f565b3480156108c257600080fd5b5061051f6108d1366004614ac7565b60086020526000908152604090205481565b3480156108ef57600080fd5b5061051f6117e0565b34801561090457600080fd5b5061054d610913366004614ac7565b611825565b34801561092457600080fd5b5061051f610933366004614ac7565b611924565b34801561094457600080fd5b5061054d610953366004614cff565b6119a3565b34801561096457600080fd5b5061054d610973366004614cff565b6119f5565b34801561098457600080fd5b5061051f610993366004614ac7565b6001600160a01b031660009081526020819052604090205490565b3480156109ba57600080fd5b5061054d611ad6565b3480156109cf57600080fd5b5061051f6109de366004614ac7565b60126020526000908152604090205481565b3480156109fc57600080fd5b5061054d610a0b366004614ac7565b611b56565b348015610a1c57600080fd5b5061054d610a2b366004614cc5565b611bb8565b348015610a3c57600080fd5b5061054d610a4b366004614cff565b611bfb565b348015610a5c57600080fd5b506104f4610a6b366004614ac7565b600a6020526000908152604090205460ff1681565b348015610a8c57600080fd5b5061054d610a9b366004614ac7565b611d55565b348015610aac57600080fd5b506104f4610abb366004614ac7565b612102565b348015610acc57600080fd5b5060055461010090046001600160a01b03166105fd565b348015610aef57600080fd5b5061054d6121f0565b348015610b0457600080fd5b50610584612231565b348015610b1957600080fd5b5061051f60145481565b348015610b2f57600080fd5b5061054d610b3e366004614b7b565b612240565b348015610b4f57600080fd5b5061051f601a5481565b348015610b6557600080fd5b5061051f60185481565b348015610b7b57600080fd5b5061051f612338565b348015610b9057600080fd5b506104f4610b9f366004614c13565b61237d565b348015610bb057600080fd5b506104f4610bbf366004614b7b565b6123cc565b348015610bd057600080fd5b5061051f610bdf366004614ac7565b612470565b348015610bf057600080fd5b506104f4610bff366004614c13565b6124a3565b348015610c1057600080fd5b50610c24610c1f366004614ac7565b6124b0565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610500565b348015610c7557600080fd5b506104f4610c84366004614ac7565b601c6020526000908152604090205460ff1681565b348015610ca557600080fd5b5061051f610cb4366004614ac7565b61255a565b348015610cc557600080fd5b5061054d610cd4366004614b7b565b61257d565b348015610ce557600080fd5b5061054d610cf4366004614b7b565b6125d8565b348015610d0557600080fd5b5061054d610d14366004614ac7565b612667565b348015610d2557600080fd5b5061054d610d34366004614c3f565b6126c9565b348015610d4557600080fd5b5061054d610d54366004614d5f565b6127ab565b348015610d6557600080fd5b506011546104f49060ff1681565b348015610d7f57600080fd5b5061054d610d8e366004614b7b565b6128f2565b348015610d9f57600080fd5b5061051f60135481565b348015610db557600080fd5b506104f4610dc4366004614cff565b612a09565b348015610dd557600080fd5b506105fd610de4366004614ac7565b612aae565b348015610df557600080fd5b506104f4610e04366004614b01565b612b2c565b348015610e1557600080fd5b5061054d610e24366004614cff565b612ce3565b348015610e3557600080fd5b50600b546105fd906001600160a01b031681565b348015610e5557600080fd5b506104f4610e64366004614ac7565b612d44565b6104f4612d77565b348015610e7d57600080fd5b5061051f610e8c366004614b01565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610ec357600080fd5b5061051f610ed2366004614ac7565b613026565b348015610ee357600080fd5b5061051f610ef2366004614ac7565b613059565b348015610f0357600080fd5b5061051f600f5481565b348015610f1957600080fd5b5061054d610f28366004614ac7565b61308c565b348015610f3957600080fd5b5061051f61319f565b348015610f4e57600080fd5b5061054d6131e4565b348015610f6357600080fd5b506104f4610f72366004614cff565b613220565b348015610f8357600080fd5b50610c24610f92366004614cff565b613284565b348015610fa357600080fd5b5061054d610fb2366004614ac7565b6132c6565b348015610fc357600080fd5b506104f46133c2565b348015610fd857600080fd5b50600c546105fd906001600160a01b031681565b6005546001600160a01b036101009091041633146110255760405162461bcd60e51b815260040161101c9061504d565b60405180910390fd5b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b6005546001600160a01b036101009091041633146110805760405162461bcd60e51b815260040161101c9061504d565b600d546001600160a01b03828116911614156110f95760405162461bcd60e51b815260206004820152603260248201527f53504f4e47533a20546865206275796261636b2077616c6c657420697320616c60448201527172656164792074686973206164647265737360701b606482015260840161101c565b6111048160016125d8565b600d546040516001600160a01b03918216918316907f79cc7a4346ee3e4ae1badce5b330777b11e18a64a4f1ee310a51437544c94c5290600090a3600d80546001600160a01b0319166001600160a01b0392909216919091179055565b60606003805461117090615173565b80601f016020809104026020016040519081016040528092919081815260200182805461119c90615173565b80156111e95780601f106111be576101008083540402835291602001916111e9565b820191906000526020600020905b8154815290600101906020018083116111cc57829003601f168201915b5050505050905090565b6000611200338484613486565b5060015b92915050565b6001600160a01b038116600090815260126020526040812054819061123f9062127500906112399042906135ab565b906135ed565b6001600160a01b03841660009081526012602052604090205490915061128757507f000000000000000000000000000000000000000000000000000000000000000092915050565b600781106112985750603292915050565b6112a381600a61362f565b6112cd907f000000000000000000000000000000000000000000000000000000000000000061515c565b9392505050565b60006112e18484846136ae565b611333843361132e8560405180606001604052806028815260200161523f602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906141eb565b613486565b5060019392505050565b60075460405163e12b91b360e01b81526001600160a01b038381166004830152600092169063e12b91b3906024015b60206040518083038186803b15801561138457600080fd5b505afa158015611398573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112049190614ce2565b6005546001600160a01b036101009091041633146113ec5760405162461bcd60e51b815260040161101c9061504d565b600e55565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b15801561143657600080fd5b505afa15801561144a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146e9190614d18565b905090565b6005546001600160a01b036101009091041633146114a35760405162461bcd60e51b815260040161101c9061504d565b600c546001600160a01b038281169116141561151f5760405162461bcd60e51b815260206004820152603560248201527f53504f4e47533a20546865206f7065726174696f6e732077616c6c657420697360448201527420616c72656164792074686973206164647265737360581b606482015260840161101c565b61152a8160016125d8565b600c546040516001600160a01b03918216918316907f086aa05ff00214e2d0c7c02b8a46b2614ad955732e6b43aa8afca69ed1ad76f890600090a3600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b036101009091041633146115b75760405162461bcd60e51b815260040161101c9061504d565b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b1580156115ff57600080fd5b505af1158015611613573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161120091859061132e9086613427565b600754604051633d01b8a760e01b81526001600160a01b0383811660048301526000921690633d01b8a79060240161136c565b60075460408051632f842d8560e21b815290516000926001600160a01b03169163be10b614916004808301926020929190829003018186803b15801561143657600080fd5b60075460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b3790604401602060405180830381600087803b15801561171457600080fd5b505af1158015611728573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174c9190614ce2565b50565b6005546001600160a01b0361010090910416331461177f5760405162461bcd60e51b815260040161101c9061504d565b606481106117db5760405162461bcd60e51b815260206004820152602360248201527f4d61782073656c6c2070657263656e74206d75737420626520756e646572203160448201526230302560e81b606482015260840161101c565b601855565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b15801561143657600080fd5b6005546001600160a01b036101009091041633146118555760405162461bcd60e51b815260040161101c9061504d565b6006546001600160a01b03828116911614156118c75760405162461bcd60e51b815260206004820152602b60248201527f53504f4e47533a2054686520726f7574657220616c726561647920686173207460448201526a686174206164647265737360a81b606482015260840161101c565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6007546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b60206040518083038186803b15801561196b57600080fd5b505afa15801561197f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112049190614d18565b6005546001600160a01b036101009091041633146119d35760405162461bcd60e51b815260040161101c9061504d565b4780156119f1576119f16119ec6064611239848661362f565b614225565b5050565b6007546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c47990602401606060405180830381600087803b158015611a4357600080fd5b505af1158015611a57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7b9190614d31565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6005546001600160a01b03610100909104163314611b065760405162461bcd60e51b815260040161101c9061504d565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6005546001600160a01b03610100909104163314611b865760405162461bcd60e51b815260040161101c9061504d565b600754604051638021974b60e01b81526001600160a01b03838116600483015290911690638021974b906024016115e5565b6005546001600160a01b03610100909104163314611be85760405162461bcd60e51b815260040161101c9061504d565b6019805460ff1916911515919091179055565b6005546001600160a01b03610100909104163314611c2b5760405162461bcd60e51b815260040161101c9061504d565b62030d408110158015611c4157506207a1208111155b611cb35760405162461bcd60e51b815260206004820152603c60248201527f53504f4e47533a20676173466f7250726f63657373696e67206d75737420626560448201527f206265747765656e203230302c30303020616e64203530302c30303000000000606482015260840161101c565b601a54811415611d225760405162461bcd60e51b815260206004820152603460248201527f53504f4e47533a2043616e6e6f742075706461746520676173466f7250726f63604482015273657373696e6720746f2073616d652076616c756560601b606482015260840161101c565b601a5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601a55565b6005546001600160a01b03610100909104163314611d855760405162461bcd60e51b815260040161101c9061504d565b6007546001600160a01b0382811691161415611e015760405162461bcd60e51b815260206004820152603560248201527f53504f4e47533a20546865206469766964656e6420747261636b657220616c7260448201527465616479206861732074686174206164647265737360581b606482015260840161101c565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611e4957600080fd5b505afa158015611e5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e819190614ae4565b6001600160a01b031614611f115760405162461bcd60e51b815260206004820152604b60248201527f53504f4e47533a20546865206e6577206469766964656e6420747261636b657260448201527f206d757374206265206f776e6564206279207468652053504f4e475320746f6b60648201526a195b8818dbdb9d1c9858dd60aa1b608482015260a40161101c565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b158015611f5357600080fd5b505af1158015611f67573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015611fac57600080fd5b505af1158015611fc0573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db0611feb6005546001600160a01b036101009091041690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b15801561202c57600080fd5b505af1158015612040573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b15801561208b57600080fd5b505af115801561209f573d6000803e3d6000fd5b50506007546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600780546001600160a01b0319166001600160a01b039290921691909117905550565b600061210d8261425f565b6121295760405162461bcd60e51b815260040161101c90614efb565b6001600160a01b0382163014156121525760405162461bcd60e51b815260040161101c90614f58565b61215b82611650565b156121785760405162461bcd60e51b815260040161101c90614fdb565b60075460065460405163032e4c0d60e11b81523360048201526001600160a01b038581166024830152918216604482015291169063065c981a906064015b600060405180830381600087803b1580156121d057600080fd5b505af11580156121e4573d6000803e3d6000fd5b50600195945050505050565b6005546001600160a01b036101009091041633146122205760405162461bcd60e51b815260040161101c9061504d565b6019805461ffff1916610101179055565b60606004805461117090615173565b6005546001600160a01b036101009091041633146122705760405162461bcd60e51b815260040161101c9061504d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561232e5760405162461bcd60e51b815260206004820152604d60248201527f53504f4e47533a205468652050616e63616b655377617020706169722063616e60448201527f6e6f742062652072656d6f7665642066726f6d206175746f6d617465644d617260648201526c6b65744d616b6572506169727360981b608482015260a40161101c565b6119f1828261429b565b60075460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b15801561143657600080fd5b6000611200338461132e85604051806060016040528060258152602001615267602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906141eb565b6005546000906001600160a01b036101009091041633146123ff5760405162461bcd60e51b815260040161101c9061504d565b60075460405163a47e991760e01b81526001600160a01b03858116600483015284151560248301529091169063a47e9917906044015b600060405180830381600087803b15801561244f57600080fd5b505af1158015612463573d6000803e3d6000fd5b5060019695505050505050565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611953565b60006112003384846136ae565b60075460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b6101006040518083038186803b15801561250757600080fd5b505afa15801561251b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253f9190614ba9565b97509750975097509750975097509750919395975091939597565b336000908152600860205260408120546112049061257784613059565b906135ab565b6005546001600160a01b036101009091041633146125ad5760405162461bcd60e51b815260040161101c9061504d565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b6005546001600160a01b036101009091041633146126085760405162461bcd60e51b815260040161101c9061504d565b6001600160a01b0382166000818152601b6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b036101009091041633146126975760405162461bcd60e51b815260040161101c9061504d565b60075460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef906024016115e5565b6005546001600160a01b036101009091041633146126f95760405162461bcd60e51b815260040161101c9061504d565b60005b8281101561276a5781601b600086868581811061271b5761271b6151df565b90506020020160208101906127309190614ac7565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580612762816151ae565b9150506126fc565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b3583838360405161279e93929190614dd5565b60405180910390a1505050565b6005546001600160a01b036101009091041633146127db5760405162461bcd60e51b815260040161101c9061504d565b826127e68383613427565b111561288e5760405162461bcd60e51b8152602060048201526064602482018190527f53504f4e47533a20757064617465466565733a3a204c6971756964697479205060448301527f657263206d75737420626520657175616c20746f206f72206869676865722074908201527f68616e206f7065726174696f6e7320616e64206275796261636b20636f6d62696084820152633732b21760e11b60a482015260c40161101c565b6040805183815260208101839052849186917f16e6f67290546b8dd0e587f4b7f67d4f61932ae17ffd8c60d3509dbc05c175fe910160405180910390a360138490556014839055601682905560178190556128e98484613427565b60155550505050565b6005546001600160a01b036101009091041633146129225760405162461bcd60e51b815260040161101c9061504d565b61292b8261425f565b61299d5760405162461bcd60e51b815260206004820152603960248201527f53504f4e47533a2073657457686974654c697374414d4d3a3a20414d4d20697360448201527f20612077616c6c65742c206e6f74206120636f6e747261637400000000000000606482015260840161101c565b60075460405163cd06ab7360e01b81526001600160a01b03848116600483015283151560248301529091169063cd06ab73906044015b600060405180830381600087803b1580156129ed57600080fd5b505af1158015612a01573d6000803e3d6000fd5b505050505050565b6005546000906001600160a01b03610100909104163314612a3c5760405162461bcd60e51b815260040161101c9061504d565b6002548210612aa55760405162461bcd60e51b815260206004820152602f60248201527f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160448201526e37103a37ba30b61039bab838363c9760891b606482015260840161101c565b50600f55600190565b6007546040516356ef728f60e11b81526001600160a01b038381166004830152600092169063addee51e9060240160206040518083038186803b158015612af457600080fd5b505afa158015612b08573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112049190614ae4565b6000612b378361425f565b612b535760405162461bcd60e51b815260040161101c90614efb565b6006546001600160a01b0383811691161415612be15760405162461bcd60e51b815260206004820152604160248201527f53504f4e47533a20736574526577617264546f6b656e3a3a205573652073657460448201527f526577617264546f6b656e20746f207573652064656661756c7420526f7574656064820152603960f91b608482015260a40161101c565b6001600160a01b038316301415612c0a5760405162461bcd60e51b815260040161101c90614f58565b612c1383611650565b15612c305760405162461bcd60e51b815260040161101c90614fdb565b612c398261133d565b1515600114612ca35760405162461bcd60e51b815260206004820152603060248201527f53504f4e47533a20736574526577617264546f6b656e3a3a20414d4d2069732060448201526f6e6f742077686974656c69737465642160801b606482015260840161101c565b60075460405163032e4c0d60e11b81523360048201526001600160a01b03858116602483015284811660448301529091169063065c981a90606401612435565b6005546001600160a01b03610100909104163314612d135760405162461bcd60e51b815260040161101c9061504d565b60075460405163f9e2f5fb60e01b8152600481018390526001600160a01b039091169063f9e2f5fb906024016115e5565b60075460405163aa9582d360e01b81526001600160a01b038381166004830152600092169063aa9582d39060240161136c565b600080612d8333613059565b33600090815260086020526040902054909150612da09034613427565b811015612e17576040805162461bcd60e51b81526020600482015260248101919091527f53504f4e47533a206275794261636b546f6b656e73576974684e6f466565733a60448201527f3a2043616e6e6f74205370656e64206d6f7265207468616e206561726e65642e606482015260840161101c565b604080516002808252606082018352349260009291906020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b158015612e8057600080fd5b505afa158015612e94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eb89190614ae4565b81600081518110612ecb57612ecb6151df565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110612eff57612eff6151df565b6001600160a01b0390921660209283029190910182015233600090815260089091526040902054612f309034613427565b33600081815260086020908152604080832094909455601b90529182208054600160ff1982161790915560065460ff909116926001600160a01b039091169163b6f9de959186918690612f8542610168615103565b6040518663ffffffff1660e01b8152600401612fa49493929190614e2e565b6000604051808303818588803b158015612fbd57600080fd5b505af1158015612fd1573d6000803e3d6000fd5b5050336000818152601b6020526040808220805460ff1916881515179055518895509193507faf9caa8e44a7ae08c0e421ad7c7f143d77214713719ebe5472be0aed7d0c1099925090a3600194505050505090565b60075460405163ea40e76760e01b81526001600160a01b038381166004830152600092169063ea40e76790602401611953565b60075460405163709394c960e11b81526001600160a01b038381166004830152600092169063e127299290602401611953565b6005546001600160a01b036101009091041633146130bc5760405162461bcd60e51b815260040161101c9061504d565b600b546001600160a01b03828116911614156131375760405162461bcd60e51b815260206004820152603460248201527f53504f4e47533a20546865206c69717569646974792077616c6c657420697320604482015273616c72656164792074686973206164647265737360601b606482015260840161101c565b6131428160016125d8565b600b546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6007546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b15801561143657600080fd5b6005546001600160a01b036101009091041633146132145760405162461bcd60e51b815260040161101c9061504d565b6011805460ff19169055565b6005546000906001600160a01b036101009091041633146132535760405162461bcd60e51b815260040161101c9061504d565b60075460405163e98030c760e01b8152600481018490526001600160a01b039091169063e98030c7906024016121b6565b600754604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd906024016124ee565b6005546001600160a01b036101009091041633146132f65760405162461bcd60e51b815260040161101c9061504d565b6001600160a01b03811661335b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161101c565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60075460405163e8f8fe3960e01b81523360048201526000916001600160a01b03169063e8f8fe3990602401600060405180830381600087803b15801561340857600080fd5b505af115801561341c573d6000803e3d6000fd5b505050506001905090565b6000806134348385615103565b9050838110156112cd5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161101c565b6001600160a01b0383166134e85760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161101c565b6001600160a01b0382166135495760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161101c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006112cd83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506141eb565b60006112cd83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506143fb565b60008261363e57506000611204565b600061364a838561513d565b905082613657858361511b565b146112cd5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161101c565b6001600160a01b0383166136d45760405162461bcd60e51b815260040161101c90615082565b6001600160a01b0382166136fa5760405162461bcd60e51b815260040161101c90614eb8565b6001600160a01b0382166000908152600a602052604090205460ff16158061373b57506001600160a01b0383166000908152600a602052604090205460ff16155b6137925760405162461bcd60e51b815260206004820152602260248201527f53504f4e47533a20546f2f66726f6d20616464726573732069732069676e6f72604482015261195960f21b606482015260840161101c565b60195460ff16613827576001600160a01b03821660009081526009602052604090205460ff16806137db57506001600160a01b03831660009081526009602052604090205460ff165b6138275760405162461bcd60e51b815260206004820152601d60248201527f54726164696e672069732063757272656e746c792064697361626c6564000000604482015260640161101c565b6001600160a01b0382166000908152601c602052604090205460ff168015613852575060195460ff16155b801561387657506001600160a01b03831660009081526009602052604090205460ff165b15613935576005546001600160a01b038481166101009092041614806138ae57506005546001600160a01b0383811661010090920416145b806138d157506001600160a01b03831660009081526009602052604090205460ff165b6139355760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c79206465762063616e20747261646520616761696e737420504353206460448201526e3ab934b7339036b4b3b930ba34b7b760891b606482015260840161101c565b8061394b5761394683836000614429565b505050565b60115460ff1615613abd576005546001600160a01b03838116610100909204161480159061398757506006546001600160a01b03838116911614155b80156139c557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b80156139ea57506001600160a01b0382166000908152601b602052604090205460ff16155b8015613a0f57506001600160a01b0383166000908152601b602052604090205460ff16155b15613abd576001600160a01b0382166000908152601060205260409020544211613aa15760405162461bcd60e51b815260206004820152603c60248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e2020506c656173652074727920616761696e206c617465722e00000000606482015260840161101c565b6001600160a01b03821660009081526010602052604090204290555b613ac68261425f565b158015613aec57506001600160a01b0382166000908152601b602052604090205460ff16155b15613b21576001600160a01b038216600090815260126020526040902054613b21576001600160a01b03821660005260126020525b613b2a8261425f565b158015613b4f57506001600160a01b0383166000908152601c602052604090205460ff165b8015613b7457506001600160a01b0382166000908152601b602052604090205460ff16155b15613c00576001600160a01b0382166000908152601260205260409020544211613c00576001600160a01b038216600090815260126020526040902054613be690613bc7906003906112399042906135ab565b6001600160a01b03841660009081526012602052604090205490613427565b6001600160a01b0383166000908152601260205260409020555b6001600160a01b0382166000908152601c602052604090205460ff1615613c9057600e54811115613c735760405162461bcd60e51b815260206004820152601e60248201527f42455032303a2045786365656473206d61782073656c6c20616d6f756e740000604482015260640161101c565b613c8d60646112396018548461362f90919063ffffffff16565b90505b30600090815260208190526040902054600f5481108015908190613cbe5750600654600160a01b900460ff16155b8015613cd15750601954610100900460ff165b8015613cf657506001600160a01b0385166000908152601c602052604090205460ff16155b8015613d105750600b546001600160a01b03868116911614155b8015613d2a5750600b546001600160a01b03858116911614155b8015613d445750600c546001600160a01b03868116911614155b8015613d5e5750600c546001600160a01b03858116911614155b8015613d785750600d546001600160a01b03868116911614155b8015613d925750600d546001600160a01b03858116911614155b8015613db757506001600160a01b0384166000908152601b602052604090205460ff16155b8015613ddc57506001600160a01b0385166000908152601b602052604090205460ff16155b8015613df157506001600160a01b0385163014155b8015613e0b57506007546001600160a01b03868116911614155b15613e6f576006805460ff60a01b1916600160a01b179055601554601454600091613e3b9161123990869061362f565b9050613e4681614532565b30600090815260208190526040902054613e5f81614839565b50506006805460ff60a01b191690555b6006546001600160a01b0386166000908152601b602052604090205460ff600160a01b909204821615911680613ebd57506001600160a01b0385166000908152601b602052604090205460ff165b80613ed057506001600160a01b03861630145b15613ed9575060005b8015613fde576000613efb60646112396015548861362f90919063ffffffff16565b6001600160a01b0387166000908152601c602052604090205490915060ff1615613fc5576000613f6a60646112397f0000000000000000000000000000000000000000000000000000000000000000613f6460646112396013548d61362f90919063ffffffff16565b9061362f565b90506000613f996064611239613f7f8c61120a565b613f6460646112396014548e61362f90919063ffffffff16565b9050613fa58282613427565b6001600160a01b038a166000908152601260205260409020429055925050505b613fcf85826135ab565b9450613fdc873083614429565b505b613fe9868686614429565b6007546001600160a01b031663e30443bc8761401a816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561406057600080fd5b505af1925050508015614071575060015b506007546001600160a01b031663e30443bc866140a3816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156140e957600080fd5b505af19250505080156140fa575060015b50600654600160a01b900460ff16612a0157601a546007546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c47990602401606060405180830381600087803b15801561415857600080fd5b505af1925050508015614188575060408051601f3d908101601f1916820190925261418591810190614d31565b60015b614191576141e2565b60408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b50505050505050565b6000818484111561420f5760405162461bcd60e51b815260040161101c9190614e63565b50600061421c848661515c565b95945050505050565b600c546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156119f1573d6000803e3d6000fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061429357508115155b949350505050565b6001600160a01b0382166000908152601c602052604090205460ff1615158115151415614332576040805162461bcd60e51b81526020600482015260248101919091527f53504f4e47533a204175746f6d61746564206d61726b6574206d616b6572207060448201527f61697220697320616c72656164792073657420746f20746861742076616c7565606482015260840161101c565b6001600160a01b0382166000908152601c60205260409020805460ff191682158015919091179091556143bf5760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156143a657600080fd5b505af11580156143ba573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6000818361441c5760405162461bcd60e51b815260040161101c9190614e63565b50600061421c848661511b565b6001600160a01b03831661444f5760405162461bcd60e51b815260040161101c90615082565b6001600160a01b0382166144755760405162461bcd60e51b815260040161101c90614eb8565b6144b281604051806060016040528060268152602001615219602691396001600160a01b03861660009081526020819052604090205491906141eb565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546144e19082613427565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910161359e565b6014541561174c576014546000901561457f5761457860145461123961457161456860165460175461342790919063ffffffff16565b601454906135ab565b859061362f565b9050614583565b5060005b600061458f83836135ab565b9050600061459e8360026135ed565b905060006145ac84836135ab565b9050476145b8836148d8565b60006145c447836135ab565b90506145d08382614a0b565b6145d9856148d8565b60006145e547846135ab565b905060008060165411156146ed57600061461d61460f60165460175461342790919063ffffffff16565b60165461123990869061362f565b600c546040519192506001600160a01b0316908290600081818185875af1925050503d806000811461466b576040519150601f19603f3d011682016040523d82523d6000602084013e614670565b606091505b505080925050816146eb576040805162461bcd60e51b81526020600482015260248101919091527f53504f4e47533a2053776170416e644c6971756966793a3a20556e61626c652060448201527f746f2073656e6420424e4220746f204f7065726174696f6e732057616c6c6574606482015260840161101c565b505b601754156147ed57600061471f61471160165460175461342790919063ffffffff16565b60175461123990869061362f565b600d546040519192506001600160a01b0316908290600081818185875af1925050503d806000811461476d576040519150601f19603f3d011682016040523d82523d6000602084013e614772565b606091505b505080925050816147eb5760405162461bcd60e51b815260206004820152603d60248201527f53504f4e47533a2053776170416e644c6971756966793a3a20556e61626c652060448201527f746f2073656e6420424e4220746f204275794261636b2057616c6c6574000000606482015260840161101c565b505b60408051878152602081018590529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a1505050505050505050565b614842816148d8565b60075460405147916000916001600160a01b039091169083908381818185875af1925050503d8060008114614893576040519150601f19603f3d011682016040523d82523d6000602084013e614898565b606091505b5050905080156139465760408051848152602081018490527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3910161279e565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061490d5761490d6151df565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561496157600080fd5b505afa158015614975573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149999190614ae4565b816001815181106149ac576149ac6151df565b6001600160a01b0392831660209182029290920101526006546149d29130911684613486565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906129d39085906000908690309042906004016150c7565b600654614a239030906001600160a01b031684613486565b600654600b5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c4016060604051808303818588803b158015614a8e57600080fd5b505af1158015614aa2573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906116139190614d31565b600060208284031215614ad957600080fd5b81356112cd816151f5565b600060208284031215614af657600080fd5b81516112cd816151f5565b60008060408385031215614b1457600080fd5b8235614b1f816151f5565b91506020830135614b2f816151f5565b809150509250929050565b600080600060608486031215614b4f57600080fd5b8335614b5a816151f5565b92506020840135614b6a816151f5565b929592945050506040919091013590565b60008060408385031215614b8e57600080fd5b8235614b99816151f5565b91506020830135614b2f8161520a565b600080600080600080600080610100898b031215614bc657600080fd5b8851614bd1816151f5565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60008060408385031215614c2657600080fd5b8235614c31816151f5565b946020939093013593505050565b600080600060408486031215614c5457600080fd5b833567ffffffffffffffff80821115614c6c57600080fd5b818601915086601f830112614c8057600080fd5b813581811115614c8f57600080fd5b8760208260051b8501011115614ca457600080fd5b60209283019550935050840135614cba8161520a565b809150509250925092565b600060208284031215614cd757600080fd5b81356112cd8161520a565b600060208284031215614cf457600080fd5b81516112cd8161520a565b600060208284031215614d1157600080fd5b5035919050565b600060208284031215614d2a57600080fd5b5051919050565b600080600060608486031215614d4657600080fd5b8351925060208401519150604084015190509250925092565b60008060008060808587031215614d7557600080fd5b5050823594602084013594506040840135936060013592509050565b600081518084526020808501945080840160005b83811015614dca5781516001600160a01b031687529582019590820190600101614da5565b509495945050505050565b6040808252810183905260008460608301825b86811015614e18578235614dfb816151f5565b6001600160a01b0316825260209283019290910190600101614de8565b5080925050508215156020830152949350505050565b848152608060208201526000614e476080830186614d91565b6001600160a01b03949094166040830152506060015292915050565b600060208083528351808285015260005b81811015614e9057858101830151858201604001528201614e74565b81811115614ea2576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252603d908201527f53504f4e47533a20736574526577617264546f6b656e3a3a204164647265737360408201527f20697320612077616c6c65742c206e6f74206120636f6e74726163742e000000606082015260800190565b60208082526059908201527f53504f4e47533a20736574526577617264546f6b656e3a3a2043616e6e6f742060408201527f7365742072657761726420746f6b656e206173207468697320746f6b656e206460608201527f756520746f20526f75746572206c696d69746174696f6e732e00000000000000608082015260a00190565b6020808252604c908201527f53504f4e47533a20736574526577617264546f6b656e3a3a205265776172642060408201527f546f6b656e2069732069676e6f7265642066726f6d206265696e67207573656460608201526b1030b9903932bbb0b932399760a11b608082015260a00190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b85815284602082015260a0604082015260006150e660a0830186614d91565b6001600160a01b0394909416606083015250608001529392505050565b60008219821115615116576151166151c9565b500190565b60008261513857634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615615157576151576151c9565b500290565b60008282101561516e5761516e6151c9565b500390565b600181811c9082168061518757607f821691505b602082108114156151a857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156151c2576151c26151c9565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038116811461174c57600080fd5b801515811461174c57600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220041903d5c81ba26b050b22777dc4ab30030c43cef7b4284a3f447a2764abe05a64736f6c634300080600336080604052601180546001600160a01b0319167310ed43c718714eb63d5aa57b78b54704e256024e1790553480156200003757600080fd5b506040518060400160405280601781526020017f53504f4e47535f4469766964656e645f547261636b65720000000000000000008152506040518060400160405280601781526020017f53504f4e47535f4469766964656e645f547261636b657200000000000000000081525060098282828260039080519060200190620000c19291906200020b565b508151620000d79060049060208501906200020b565b506005805460ff191660ff929092169190911790555060009050620000f93390565b60058054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050600f60205250507fd0e0a62d517e32aa3f02adacca685ae1002c75a4559ed20d8dd243c423d331b48054600160ff1991821681179092557f79c5dffb12ee0f1936e7d435a4a45b5e5d5fcb61c4cbe9a7b59fc78b69ec08fb805482168317905573cf0febd3f17cef5b47b0cd257acf6025c5bff3b76000527fb52b16cea592525736375ed12edb65aa506992baf7171a3e05e8b4a09c345be180549091169091179055610e10601a55678ac7230489e80000601b55620002ee565b8280546200021990620002b1565b90600052602060002090601f0160209004810192826200023d576000855562000288565b82601f106200025857805160ff191683800117855562000288565b8280016001018555821562000288579182015b82811115620002885782518255916020019190600101906200026b565b50620002969291506200029a565b5090565b5b808211156200029657600081556001016200029b565b600181811c90821680620002c657607f821691505b60208210811415620002e857634e487b7160e01b600052602260045260246000fd5b50919050565b612eca80620002fe6000396000f3fe6080604052600436106103035760003560e01c80638ef3a3c011610190578063cd06ab73116100dc578063e8f8fe3911610095578063f2fde38b1161006f578063f2fde38b14610a33578063f9e2f5fb14610a53578063fbcbc0f114610a73578063ffb2c47914610a9357600080fd5b8063e8f8fe39146109c6578063e98030c7146109e6578063ea40e76714610a0657600080fd5b8063cd06ab73146108c5578063dd62ed3e146108e5578063e12729921461092b578063e12b91b314610961578063e30443bc14610991578063e7841ec0146109b157600080fd5b8063a9059cbb11610149578063addee51e11610123578063addee51e14610839578063bc4c4b371461086f578063be10b6141461088f578063c0f306ef146108a557600080fd5b8063a9059cbb146107b3578063aa9582d3146107d3578063aafd847a1461080357600080fd5b80638ef3a3c0146106ee57806391b89fba1461071e57806395d89b411461073e578063a457c2d714610753578063a47e991714610773578063a8b9d2401461079357600080fd5b806331e79db01161024f5780636f2789ec116102085780638021974b116101e25780638021974b146106655780638271c9051461068557806385a6b3ae146106b55780638da5cb5b146106cb57600080fd5b80636f2789ec1461060457806370a082311461061a578063715018a61461065057600080fd5b806331e79db0146104e157806339509351146105015780633d01b8a7146105215780634e7b827f1461055a5780635183d6fd1461058a5780636a474002146105ef57600080fd5b80631694505e116102bc57806323b872dd1161029657806323b872dd1461046957806327ce0147146104895780633009a609146104a9578063313ce567146104bf57600080fd5b80631694505e1461040757806318160ddd14610427578063226cfa3d1461043c57600080fd5b806303c8330214610317578063065c981a1461031f57806306fdde031461033f578063095ea7b31461036a57806309bbedde1461039a578063133b1d5e146103b957600080fd5b3661031257610310610ace565b005b600080fd5b610310610ace565b34801561032b57600080fd5b5061031061033a366004612ae9565b610b61565b34801561034b57600080fd5b50610354610d62565b6040516103619190612c11565b60405180910390f35b34801561037657600080fd5b5061038a610385366004612a84565b610df4565b6040519015158152602001610361565b3480156103a657600080fd5b506013545b604051908152602001610361565b3480156103c557600080fd5b506103ef6103d4366004612a15565b600c602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610361565b34801561041357600080fd5b506011546103ef906001600160a01b031681565b34801561043357600080fd5b506002546103ab565b34801561044857600080fd5b506103ab610457366004612a15565b60196020526000908152604090205481565b34801561047557600080fd5b5061038a610484366004612b34565b610e0b565b34801561049557600080fd5b506103ab6104a4366004612a15565b610e74565b3480156104b557600080fd5b506103ab60175481565b3480156104cb57600080fd5b5060055460405160ff9091168152602001610361565b3480156104ed57600080fd5b506103106104fc366004612a15565b610ed0565b34801561050d57600080fd5b5061038a61051c366004612a84565b610ffd565b34801561052d57600080fd5b5061038a61053c366004612a15565b6001600160a01b031660009081526010602052604090205460ff1690565b34801561056657600080fd5b5061038a610575366004612a15565b60186020526000908152604090205460ff1681565b34801561059657600080fd5b506105aa6105a5366004612b8e565b611033565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610361565b3480156105fb57600080fd5b506103106111a5565b34801561061057600080fd5b506103ab601a5481565b34801561062657600080fd5b506103ab610635366004612a15565b6001600160a01b031660009081526020819052604090205490565b34801561065c57600080fd5b5061031061124b565b34801561067157600080fd5b50610310610680366004612a15565b6112cb565b34801561069157600080fd5b5061038a6106a0366004612a15565b60106020526000908152604090205460ff1681565b3480156106c157600080fd5b506103ab60125481565b3480156106d757600080fd5b5060055461010090046001600160a01b03166103ef565b3480156106fa57600080fd5b5061038a610709366004612a15565b600d6020526000908152604090205460ff1681565b34801561072a57600080fd5b506103ab610739366004612a15565b61138f565b34801561074a57600080fd5b5061035461139a565b34801561075f57600080fd5b5061038a61076e366004612a84565b6113a9565b34801561077f57600080fd5b5061031061078e366004612a4f565b6113f8565b34801561079f57600080fd5b506103ab6107ae366004612a15565b611453565b3480156107bf57600080fd5b5061038a6107ce366004612a84565b61147f565b3480156107df57600080fd5b5061038a6107ee366004612a15565b600b6020526000908152604090205460ff1681565b34801561080f57600080fd5b506103ab61081e366004612a15565b6001600160a01b031660009081526008602052604090205490565b34801561084557600080fd5b506103ef610854366004612a15565b600a602052600090815260409020546001600160a01b031681565b34801561087b57600080fd5b5061038a61088a366004612a4f565b61148c565b34801561089b57600080fd5b506103ab601b5481565b3480156108b157600080fd5b506103106108c0366004612a15565b611540565b3480156108d157600080fd5b506103106108e0366004612a4f565b6115de565b3480156108f157600080fd5b506103ab610900366004612ab0565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561093757600080fd5b506103ab610946366004612a15565b6001600160a01b031660009081526009602052604090205490565b34801561096d57600080fd5b5061038a61097c366004612a15565b600f6020526000908152604090205460ff1681565b34801561099d57600080fd5b506103106109ac366004612a84565b611639565b3480156109bd57600080fd5b506017546103ab565b3480156109d257600080fd5b506103106109e1366004612a15565b6117ad565b3480156109f257600080fd5b50610310610a01366004612b8e565b6118ab565b348015610a1257600080fd5b506103ab610a21366004612a15565b600e6020526000908152604090205481565b348015610a3f57600080fd5b50610310610a4e366004612a15565b611a22565b348015610a5f57600080fd5b50610310610a6e366004612b8e565b611b1e565b348015610a7f57600080fd5b506105aa610a8e366004612a15565b611b53565b348015610a9f57600080fd5b50610ab3610aae366004612b8e565b611ccb565b60408051938452602084019290925290820152606001610361565b6000610ad960025490565b11610ae357600080fd5b3415610b5f57610b16610af560025490565b610b0334600160801b611de6565b610b0d9190612cf4565b60065490611e6c565b60065560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2601254610b5b9034611e6c565b6012555b565b6005546001600160a01b03610100909104163314610b9a5760405162461bcd60e51b8152600401610b9190612c66565b60405180910390fd5b6001600160a01b0383166000908152600b602052604090205460ff16151560011415610c2d576001600160a01b038084166000908152600a60209081526040808320549093168252600e9052205415610c2d576001600160a01b038084166000908152600a60209081526040808320549093168252600e9052908120805460019290610c27908490612d74565b90915550505b6001600160a01b038084166000908152600b60209081526040808320805460ff19166001179055600a909152902080548483166001600160a01b0319909116179055601154828216911614801590610c9d57506001600160a01b0381166000908152600f602052604090205460ff165b15610cec576001600160a01b038084166000908152600d60209081526040808320805460ff19166001179055600c909152902080549183166001600160a01b0319909216919091179055610d2f565b6001600160a01b038084166000908152600d60209081526040808320805460ff19169055601154600c90925290912080546001600160a01b031916919092161790555b6001600160a01b0382166000908152600e60205260408120805460019290610d58908490612cdc565b9091555050505050565b606060038054610d7190612d8b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9d90612d8b565b8015610dea5780601f10610dbf57610100808354040283529160200191610dea565b820191906000526020600020905b815481529060010190602001808311610dcd57829003601f168201915b5050505050905090565b6000610e01338484611ecb565b5060015b92915050565b6000610e18848484611fef565b610e6a8433610e6585604051806060016040528060288152602001612e48602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061204d565b611ecb565b5060019392505050565b6001600160a01b03811660009081526007602090815260408083205491839052822054600654600160801b92610ec692610ec192610ebb91610eb69190611de6565b612087565b90612097565b6120d5565b610e059190612cf4565b6005546001600160a01b03610100909104163314610f005760405162461bcd60e51b8152600401610b9190612c66565b6001600160a01b03811660009081526018602052604090205460ff1615610f2657600080fd5b6001600160a01b0381166000908152601860205260408120805460ff19166001179055610f549082906120e8565b60405163131836e760e21b8152601360048201526001600160a01b03821660248201527320f19177a2498bcc83a949143214f8d0e904655b90634c60db9c9060440160006040518083038186803b158015610fae57600080fd5b505af4158015610fc2573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610e01918590610e659086611e6c565b60008060008060008060008060137320f19177a2498bcc83a949143214f8d0e904655b63deb3d89690916040518263ffffffff1660e01b815260040161107b91815260200190565b60206040518083038186803b15801561109357600080fd5b505af41580156110a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110cb9190612b75565b89106110f057506000965060001995508594508693508392508291508190508061119a565b6040516368d54f3f60e11b815260136004820152602481018a90526000907320f19177a2498bcc83a949143214f8d0e904655b9063d1aa9e7e9060440160206040518083038186803b15801561114557600080fd5b505af4158015611159573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117d9190612a32565b905061118881611b53565b98509850985098509850985098509850505b919395975091939597565b60405162461bcd60e51b815260206004820152606960248201527f53504f4e47535f4469766964656e645f547261636b65723a207769746864726160448201527f774469766964656e642064697361626c65642e20557365207468652027636c6160648201527f696d272066756e6374696f6e206f6e20746865206d61696e2053504f4e47532060848201526831b7b73a3930b1ba1760b91b60a482015260c401610b91565b6005546001600160a01b0361010090910416331461127b5760405162461bcd60e51b8152600401610b9190612c66565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6005546001600160a01b036101009091041633146112fb5760405162461bcd60e51b8152600401610b9190612c66565b6011546001600160a01b038281169116141561136d5760405162461bcd60e51b815260206004820152602b60248201527f53504f4e47533a2054686520726f7574657220616c726561647920686173207460448201526a686174206164647265737360a81b6064820152608401610b91565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6000610e0582611453565b606060048054610d7190612d8b565b6000610e013384610e6585604051806060016040528060258152602001612e70602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061204d565b6005546001600160a01b036101009091041633146114285760405162461bcd60e51b8152600401610b9190612c66565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6001600160a01b038116600090815260086020526040812054610e059061147984610e74565b90612147565b6000610e01338484611fef565b6005546000906001600160a01b036101009091041633146114bf5760405162461bcd60e51b8152600401610b9190612c66565b60006114ca84612189565b90508015611536576001600160a01b038416600081815260196020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092906115249085815260200190565b60405180910390a36001915050610e05565b5060009392505050565b6005546001600160a01b036101009091041633146115705760405162461bcd60e51b8152600401610b9190612c66565b6001600160a01b03811660009081526018602052604090205460ff1661159557600080fd5b6001600160a01b038116600081815260186020526040808220805460ff19169055517f40a78dcf8526b72f2eaf598af1c7e49c8d5fc577f6c8f1bed887f3e4dfa289329190a250565b6005546001600160a01b0361010090910416331461160e5760405162461bcd60e51b8152600401610b9190612c66565b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b6005546001600160a01b036101009091041633146116695760405162461bcd60e51b8152600401610b9190612c66565b6001600160a01b03821660009081526018602052604090205460ff161561168e575050565b601b54811061171f576116a182826120e8565b604051632f0ad01760e21b8152601360048201526001600160a01b0383166024820152604481018290527320f19177a2498bcc83a949143214f8d0e904655b9063bc2b405c9060640160006040518083038186803b15801561170257600080fd5b505af4158015611716573d6000803e3d6000fd5b5050505061179d565b61172a8260006120e8565b60405163131836e760e21b8152601360048201526001600160a01b03831660248201527320f19177a2498bcc83a949143214f8d0e904655b90634c60db9c9060440160006040518083038186803b15801561178457600080fd5b505af4158015611798573d6000803e3d6000fd5b505050505b6117a882600161148c565b505050565b6005546001600160a01b036101009091041633146117dd5760405162461bcd60e51b8152600401610b9190612c66565b6001600160a01b038082166000908152600b60209081526040808320805460ff19169055600a8252808320549093168252600e9052205415611859576001600160a01b038082166000908152600a60209081526040808320549093168252600e9052908120805460019290611853908490612d74565b90915550505b6001600160a01b039081166000908152600a6020908152604080832080546001600160a01b0319908116909155601154600c8452828520805491909616911617909355600d905220805460ff19169055565b6005546001600160a01b036101009091041633146118db5760405162461bcd60e51b8152600401610b9190612c66565b610e1081101580156118f05750620151808111155b6119775760405162461bcd60e51b815260206004820152604c60248201527f53504f4e47535f4469766964656e645f547261636b65723a20636c61696d576160448201527f6974206d757374206265207570646174656420746f206265747765656e20312060648201526b616e6420323420686f75727360a01b608482015260a401610b91565b601a548114156119ef5760405162461bcd60e51b815260206004820152603e60248201527f53504f4e47535f4469766964656e645f547261636b65723a2043616e6e6f742060448201527f75706461746520636c61696d5761697420746f2073616d652076616c756500006064820152608401610b91565b601a5460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601a55565b6005546001600160a01b03610100909104163314611a525760405162461bcd60e51b8152600401610b9190612c66565b6001600160a01b038116611ab75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b91565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6005546001600160a01b03610100909104163314611b4e5760405162461bcd60e51b8152600401610b9190612c66565b601b55565b6040516317e142d160e01b8152601360048201526001600160a01b038216602482015281906000908190819081908190819081907320f19177a2498bcc83a949143214f8d0e904655b906317e142d19060440160206040518083038186803b158015611bbe57600080fd5b505af4158015611bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf69190612b75565b9650600019955060008712611c5857601754871115611c2457601754611c1d908890612407565b9550611c58565b60175460135460009110611c39576000611c48565b601754601354611c4891612147565b9050611c548882612097565b9650505b611c6188611453565b9450611c6c88610e74565b6001600160a01b038916600090815260196020526040902054909450925082611c96576000611ca4565b601a54611ca4908490611e6c565b9150428211611cb4576000611cbe565b611cbe8242612147565b9050919395975091939597565b6013546000908190819080611ceb57505060175460009250829150611ddf565b6017546000805a90506000805b8984108015611d0657508582105b15611dce5784611d1581612dc6565b60135490965086109050611d2857600094505b600060136000018681548110611d4057611d40612df7565b60009182526020808320909101546001600160a01b03168083526019909152604090912054909150611d7190612444565b15611d9457611d8181600161148c565b15611d945781611d9081612dc6565b9250505b82611d9e81612dc6565b93505060005a905080851115611dc557611dc2611dbb8683612147565b8790611e6c565b95505b9350611cf89050565b601785905590975095509193505050505b9193909250565b600082611df557506000610e05565b6000611e018385612d16565b905082611e0e8583612cf4565b14611e655760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610b91565b9392505050565b600080611e798385612cdc565b905083811015611e655760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610b91565b6001600160a01b038316611f2d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b91565b6001600160a01b038216611f8e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b91565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602d60248201527f53504f4e47535f4469766964656e645f547261636b65723a204e6f207472616e60448201526c1cd9995c9cc8185b1b1bddd959609a1b6064820152608401610b91565b600081848411156120715760405162461bcd60e51b8152600401610b919190612c11565b50600061207e8486612d74565b95945050505050565b60008181811215610e0557600080fd5b6000806120a48385612c9b565b9050600083121580156120b75750838112155b806120cc57506000831280156120cc57508381125b611e6557600080fd5b6000808212156120e457600080fd5b5090565b6001600160a01b038216600090815260208190526040902054808211156121275760006121158383612147565b9050612121848261246b565b50505050565b808210156117a857600061213b8284612147565b905061212184826124cf565b6000611e6583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061204d565b60008061219583611453565b905080156123fe576001600160a01b0383166000908152600b602052604090205460ff161580156121ee57506001600160a01b038381166000908152600a6020908152604080832054909316825260109052205460ff16155b1561237a576001600160a01b0383166000908152600860205260409020546122169082611e6c565b6001600160a01b0384166000908152600860209081526040808320939093556009905220546122459082611e6c565b6001600160a01b038416600081815260096020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906122949084815260200190565b60405180910390a26000836001600160a01b031682610bb890604051600060405180830381858888f193505050503d80600081146122ee576040519150601f19603f3d011682016040523d82523d6000602084013e6122f3565b606091505b5050905080612373576001600160a01b03841660009081526008602052604090205461231f9083612147565b6001600160a01b03851660009081526008602090815260408083209390935560099052205461234e9083612147565b6001600160a01b03909416600090815260096020526040812094909455509192915050565b5092915050565b6001600160a01b03831660009081526008602052604090205461239d9082611e6c565b6001600160a01b038416600081815260086020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906123ec9084815260200190565b60405180910390a2611e658382612513565b50600092915050565b6000806124148385612d35565b9050600083121580156124275750838113155b806120cc57506000831280156120cc5750838113611e6557600080fd5b60004282111561245657506000919050565b601a546124634284612147565b101592915050565b612475828261281d565b6124af612490610eb683600654611de690919063ffffffff16565b6001600160a01b03841660009081526007602052604090205490612407565b6001600160a01b0390921660009081526007602052604090209190915550565b6124d982826128fc565b6124af6124f4610eb683600654611de690919063ffffffff16565b6001600160a01b03841660009081526007602052604090205490612097565b6001600160a01b038083166000908152600a6020908152604080832054601154600d909352908320549293849391811692169060ff16801561257c57506001600160a01b038087166000908152600c60209081526040808320549093168252600f9052205460ff165b1561259e57506001600160a01b038086166000908152600c6020526040902054165b604080516002808252606082018352600092602083019080368337019050509050816001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156125f857600080fd5b505afa15801561260c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126309190612a32565b8160008151811061264357612643612df7565b60200260200101906001600160a01b031690816001600160a01b031681525050828160018151811061267757612677612df7565b6001600160a01b039283166020918202929092010152821663b6f9de95876001848b6126a542610168612cdc565b6040518663ffffffff1660e01b81526004016126c49493929190612ba7565b6000604051808303818588803b1580156126dd57600080fd5b505af1935050505080156126ef575060015b6126fc5760009350612701565b600193505b83612812576001600160a01b0387166000908152600960205260409020546127299087611e6c565b6001600160a01b038816600081815260096020526040808220939093559151610bb890899084818181858888f193505050503d8060008114612787576040519150601f19603f3d011682016040523d82523d6000602084013e61278c565b606091505b5050905080612810576001600160a01b0388166000908152600860205260409020546127b89088612147565b6001600160a01b0389166000908152600860209081526040808320939093556009905220546127e79088612147565b6001600160a01b0389166000908152600960205260408120919091559550610e05945050505050565b505b509395945050505050565b6001600160a01b0382166128735760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610b91565b6002546128809082611e6c565b6002556001600160a01b0382166000908152602081905260409020546128a69082611e6c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b03821661295c5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610b91565b61299981604051806060016040528060228152602001612e26602291396001600160a01b038516600090815260208190526040902054919061204d565b6001600160a01b0383166000908152602081905260409020556002546129bf9082612147565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016128f0565b80358015158114612a1057600080fd5b919050565b600060208284031215612a2757600080fd5b8135611e6581612e0d565b600060208284031215612a4457600080fd5b8151611e6581612e0d565b60008060408385031215612a6257600080fd5b8235612a6d81612e0d565b9150612a7b60208401612a00565b90509250929050565b60008060408385031215612a9757600080fd5b8235612aa281612e0d565b946020939093013593505050565b60008060408385031215612ac357600080fd5b8235612ace81612e0d565b91506020830135612ade81612e0d565b809150509250929050565b600080600060608486031215612afe57600080fd5b8335612b0981612e0d565b92506020840135612b1981612e0d565b91506040840135612b2981612e0d565b809150509250925092565b600080600060608486031215612b4957600080fd5b8335612b5481612e0d565b92506020840135612b6481612e0d565b929592945050506040919091013590565b600060208284031215612b8757600080fd5b5051919050565b600060208284031215612ba057600080fd5b5035919050565b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015612bf15784516001600160a01b031683529383019391830191600101612bcc565b50506001600160a01b039690961660408501525050506060015292915050565b600060208083528351808285015260005b81811015612c3e57858101830151858201604001528201612c22565b81811115612c50576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600080821280156001600160ff1b0384900385131615612cbd57612cbd612de1565b600160ff1b8390038412811615612cd657612cd6612de1565b50500190565b60008219821115612cef57612cef612de1565b500190565b600082612d1157634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612d3057612d30612de1565b500290565b60008083128015600160ff1b850184121615612d5357612d53612de1565b6001600160ff1b0384018313811615612d6e57612d6e612de1565b50500390565b600082821015612d8657612d86612de1565b500390565b600181811c90821680612d9f57607f821691505b60208210811415612dc057634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612dda57612dda612de1565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114612e2257600080fd5b5056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206a5e4ba883fe5f68c6bb97b86ceb92709f57a1089f8b75610c7d89b58f4bf77d64736f6c63430008060033
Deployed Bytecode
0x6080604052600436106104b85760003560e01c80638aee81271161026b578063c876d0b91161014f578063dfb6d223116100c1578063e884f26011610085578063e884f26014610f42578063e98030c714610f57578063f27fd25414610f77578063f2fde38b14610f97578063f9fbb13814610fb7578063fd72e22a14610fcc57600080fd5b8063dfb6d22314610eb7578063e127299214610ed7578063e2f4560514610ef7578063e37ba8f914610f0d578063e7841ec014610f2d57600080fd5b8063d32cf92911610113578063d32cf92914610de9578063d406450314610e09578063d469801614610e29578063d5de7e9d14610e49578063dad80fc414610e69578063dd62ed3e14610e7157600080fd5b8063c876d0b914610d59578063cd06ab7314610d73578063d01f581614610d93578063d257b34f14610da9578063d2bbdac214610dc957600080fd5b8063a47e9917116101e8578063bc728a6f116101ac578063bc728a6f14610c99578063bc93233f14610cb9578063c024666814610cd9578063c0f306ef14610cf9578063c492f04614610d19578063c6616ba114610d3957600080fd5b8063a47e991714610ba4578063a8b9d24014610bc4578063a9059cbb14610be4578063ad56c13c14610c04578063b62496f514610c6957600080fd5b80639a7a23d61161022f5780639a7a23d614610b235780639c1b8af514610b43578063a04018ee14610b59578063a26579ad14610b6f578063a457c2d714610b8457600080fd5b80638aee812714610aa05780638da5cb5b14610ac05780638fda356d14610ae357806395d89b4114610af857806398118cb414610b0d57600080fd5b80633d01b8a71161039d5780636843cd841161030f578063727ccaee116102d3578063727ccaee146109c35780638021974b146109f0578063870000e114610a10578063871c128d14610a30578063872d57c614610a5057806388bdd9be14610a8057600080fd5b80636843cd841461091857806368fc741514610938578063700bb1911461095857806370a0823114610978578063715018a6146109ae57600080fd5b80634fbee193116103615780634fbee19314610829578063514ac7a51461086257806359992dbc146108965780635ca7047e146108b657806364b0f653146108e357806365b8dbc0146108f857600080fd5b80633d01b8a714610795578063479c5266146107b557806349bd5a5e146107ca5780634be8f8b1146107fe5780634e71d92d1461081457600080fd5b80631a8dd2f7116104365780632c1f5216116103fa5780632c1f5216146106de57806330bb4cff146106fe57806330d5d18d14610713578063313ce5671461073357806331e79db014610755578063395093511461077557600080fd5b80631a8dd2f71461062a57806322bd3f7f1461064a57806323b872dd1461067e5780632501ff161461069e5780632bc4d48b146106be57600080fd5b8063090896be1161047d578063090896be14610591578063095ea7b3146105a757806313114a9d146105c75780631694505e146105dd57806318160ddd1461061557600080fd5b8062637439146104c457806302259e9e1461050957806303c0f5d41461052d57806306e7b14d1461054f57806306fdde031461056f57600080fd5b366104bf57005b600080fd5b3480156104d057600080fd5b506104f46104df366004614ac7565b60096020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561051557600080fd5b5061051f600e5481565b604051908152602001610500565b34801561053957600080fd5b5061054d610548366004614b7b565b610fec565b005b34801561055b57600080fd5b5061054d61056a366004614ac7565b611050565b34801561057b57600080fd5b50610584611161565b6040516105009190614e63565b34801561059d57600080fd5b5061051f60165481565b3480156105b357600080fd5b506104f46105c2366004614c13565b6111f3565b3480156105d357600080fd5b5061051f60155481565b3480156105e957600080fd5b506006546105fd906001600160a01b031681565b6040516001600160a01b039091168152602001610500565b34801561062157600080fd5b5060025461051f565b34801561063657600080fd5b5061051f610645366004614ac7565b61120a565b34801561065657600080fd5b5061051f7f00000000000000000000000000000000000000000000000000000000000000c881565b34801561068a57600080fd5b506104f4610699366004614b3a565b6112d4565b3480156106aa57600080fd5b506104f46106b9366004614ac7565b61133d565b3480156106ca57600080fd5b5061054d6106d9366004614cff565b6113bc565b3480156106ea57600080fd5b506007546105fd906001600160a01b031681565b34801561070a57600080fd5b5061051f6113f1565b34801561071f57600080fd5b5061054d61072e366004614ac7565b611473565b34801561073f57600080fd5b5060055460405160ff9091168152602001610500565b34801561076157600080fd5b5061054d610770366004614ac7565b611587565b34801561078157600080fd5b506104f4610790366004614c13565b61161a565b3480156107a157600080fd5b506104f46107b0366004614ac7565b611650565b3480156107c157600080fd5b5061051f611683565b3480156107d657600080fd5b506105fd7f0000000000000000000000002ba1213091a94224a79cd656f90dd8d0e4696e9781565b34801561080a57600080fd5b5061051f60175481565b34801561082057600080fd5b5061054d6116c8565b34801561083557600080fd5b506104f4610844366004614ac7565b6001600160a01b03166000908152601b602052604090205460ff1690565b34801561086e57600080fd5b5061051f7f000000000000000000000000000000000000000000000000000000000000007881565b3480156108a257600080fd5b5061054d6108b1366004614cff565b61174f565b3480156108c257600080fd5b5061051f6108d1366004614ac7565b60086020526000908152604090205481565b3480156108ef57600080fd5b5061051f6117e0565b34801561090457600080fd5b5061054d610913366004614ac7565b611825565b34801561092457600080fd5b5061051f610933366004614ac7565b611924565b34801561094457600080fd5b5061054d610953366004614cff565b6119a3565b34801561096457600080fd5b5061054d610973366004614cff565b6119f5565b34801561098457600080fd5b5061051f610993366004614ac7565b6001600160a01b031660009081526020819052604090205490565b3480156109ba57600080fd5b5061054d611ad6565b3480156109cf57600080fd5b5061051f6109de366004614ac7565b60126020526000908152604090205481565b3480156109fc57600080fd5b5061054d610a0b366004614ac7565b611b56565b348015610a1c57600080fd5b5061054d610a2b366004614cc5565b611bb8565b348015610a3c57600080fd5b5061054d610a4b366004614cff565b611bfb565b348015610a5c57600080fd5b506104f4610a6b366004614ac7565b600a6020526000908152604090205460ff1681565b348015610a8c57600080fd5b5061054d610a9b366004614ac7565b611d55565b348015610aac57600080fd5b506104f4610abb366004614ac7565b612102565b348015610acc57600080fd5b5060055461010090046001600160a01b03166105fd565b348015610aef57600080fd5b5061054d6121f0565b348015610b0457600080fd5b50610584612231565b348015610b1957600080fd5b5061051f60145481565b348015610b2f57600080fd5b5061054d610b3e366004614b7b565b612240565b348015610b4f57600080fd5b5061051f601a5481565b348015610b6557600080fd5b5061051f60185481565b348015610b7b57600080fd5b5061051f612338565b348015610b9057600080fd5b506104f4610b9f366004614c13565b61237d565b348015610bb057600080fd5b506104f4610bbf366004614b7b565b6123cc565b348015610bd057600080fd5b5061051f610bdf366004614ac7565b612470565b348015610bf057600080fd5b506104f4610bff366004614c13565b6124a3565b348015610c1057600080fd5b50610c24610c1f366004614ac7565b6124b0565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610500565b348015610c7557600080fd5b506104f4610c84366004614ac7565b601c6020526000908152604090205460ff1681565b348015610ca557600080fd5b5061051f610cb4366004614ac7565b61255a565b348015610cc557600080fd5b5061054d610cd4366004614b7b565b61257d565b348015610ce557600080fd5b5061054d610cf4366004614b7b565b6125d8565b348015610d0557600080fd5b5061054d610d14366004614ac7565b612667565b348015610d2557600080fd5b5061054d610d34366004614c3f565b6126c9565b348015610d4557600080fd5b5061054d610d54366004614d5f565b6127ab565b348015610d6557600080fd5b506011546104f49060ff1681565b348015610d7f57600080fd5b5061054d610d8e366004614b7b565b6128f2565b348015610d9f57600080fd5b5061051f60135481565b348015610db557600080fd5b506104f4610dc4366004614cff565b612a09565b348015610dd557600080fd5b506105fd610de4366004614ac7565b612aae565b348015610df557600080fd5b506104f4610e04366004614b01565b612b2c565b348015610e1557600080fd5b5061054d610e24366004614cff565b612ce3565b348015610e3557600080fd5b50600b546105fd906001600160a01b031681565b348015610e5557600080fd5b506104f4610e64366004614ac7565b612d44565b6104f4612d77565b348015610e7d57600080fd5b5061051f610e8c366004614b01565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610ec357600080fd5b5061051f610ed2366004614ac7565b613026565b348015610ee357600080fd5b5061051f610ef2366004614ac7565b613059565b348015610f0357600080fd5b5061051f600f5481565b348015610f1957600080fd5b5061054d610f28366004614ac7565b61308c565b348015610f3957600080fd5b5061051f61319f565b348015610f4e57600080fd5b5061054d6131e4565b348015610f6357600080fd5b506104f4610f72366004614cff565b613220565b348015610f8357600080fd5b50610c24610f92366004614cff565b613284565b348015610fa357600080fd5b5061054d610fb2366004614ac7565b6132c6565b348015610fc357600080fd5b506104f46133c2565b348015610fd857600080fd5b50600c546105fd906001600160a01b031681565b6005546001600160a01b036101009091041633146110255760405162461bcd60e51b815260040161101c9061504d565b60405180910390fd5b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b6005546001600160a01b036101009091041633146110805760405162461bcd60e51b815260040161101c9061504d565b600d546001600160a01b03828116911614156110f95760405162461bcd60e51b815260206004820152603260248201527f53504f4e47533a20546865206275796261636b2077616c6c657420697320616c60448201527172656164792074686973206164647265737360701b606482015260840161101c565b6111048160016125d8565b600d546040516001600160a01b03918216918316907f79cc7a4346ee3e4ae1badce5b330777b11e18a64a4f1ee310a51437544c94c5290600090a3600d80546001600160a01b0319166001600160a01b0392909216919091179055565b60606003805461117090615173565b80601f016020809104026020016040519081016040528092919081815260200182805461119c90615173565b80156111e95780601f106111be576101008083540402835291602001916111e9565b820191906000526020600020905b8154815290600101906020018083116111cc57829003601f168201915b5050505050905090565b6000611200338484613486565b5060015b92915050565b6001600160a01b038116600090815260126020526040812054819061123f9062127500906112399042906135ab565b906135ed565b6001600160a01b03841660009081526012602052604090205490915061128757507f00000000000000000000000000000000000000000000000000000000000000c892915050565b600781106112985750603292915050565b6112a381600a61362f565b6112cd907f00000000000000000000000000000000000000000000000000000000000000c861515c565b9392505050565b60006112e18484846136ae565b611333843361132e8560405180606001604052806028815260200161523f602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906141eb565b613486565b5060019392505050565b60075460405163e12b91b360e01b81526001600160a01b038381166004830152600092169063e12b91b3906024015b60206040518083038186803b15801561138457600080fd5b505afa158015611398573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112049190614ce2565b6005546001600160a01b036101009091041633146113ec5760405162461bcd60e51b815260040161101c9061504d565b600e55565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b15801561143657600080fd5b505afa15801561144a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146e9190614d18565b905090565b6005546001600160a01b036101009091041633146114a35760405162461bcd60e51b815260040161101c9061504d565b600c546001600160a01b038281169116141561151f5760405162461bcd60e51b815260206004820152603560248201527f53504f4e47533a20546865206f7065726174696f6e732077616c6c657420697360448201527420616c72656164792074686973206164647265737360581b606482015260840161101c565b61152a8160016125d8565b600c546040516001600160a01b03918216918316907f086aa05ff00214e2d0c7c02b8a46b2614ad955732e6b43aa8afca69ed1ad76f890600090a3600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b036101009091041633146115b75760405162461bcd60e51b815260040161101c9061504d565b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b1580156115ff57600080fd5b505af1158015611613573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161120091859061132e9086613427565b600754604051633d01b8a760e01b81526001600160a01b0383811660048301526000921690633d01b8a79060240161136c565b60075460408051632f842d8560e21b815290516000926001600160a01b03169163be10b614916004808301926020929190829003018186803b15801561143657600080fd5b60075460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b3790604401602060405180830381600087803b15801561171457600080fd5b505af1158015611728573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174c9190614ce2565b50565b6005546001600160a01b0361010090910416331461177f5760405162461bcd60e51b815260040161101c9061504d565b606481106117db5760405162461bcd60e51b815260206004820152602360248201527f4d61782073656c6c2070657263656e74206d75737420626520756e646572203160448201526230302560e81b606482015260840161101c565b601855565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b15801561143657600080fd5b6005546001600160a01b036101009091041633146118555760405162461bcd60e51b815260040161101c9061504d565b6006546001600160a01b03828116911614156118c75760405162461bcd60e51b815260206004820152602b60248201527f53504f4e47533a2054686520726f7574657220616c726561647920686173207460448201526a686174206164647265737360a81b606482015260840161101c565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6007546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b60206040518083038186803b15801561196b57600080fd5b505afa15801561197f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112049190614d18565b6005546001600160a01b036101009091041633146119d35760405162461bcd60e51b815260040161101c9061504d565b4780156119f1576119f16119ec6064611239848661362f565b614225565b5050565b6007546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c47990602401606060405180830381600087803b158015611a4357600080fd5b505af1158015611a57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7b9190614d31565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6005546001600160a01b03610100909104163314611b065760405162461bcd60e51b815260040161101c9061504d565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6005546001600160a01b03610100909104163314611b865760405162461bcd60e51b815260040161101c9061504d565b600754604051638021974b60e01b81526001600160a01b03838116600483015290911690638021974b906024016115e5565b6005546001600160a01b03610100909104163314611be85760405162461bcd60e51b815260040161101c9061504d565b6019805460ff1916911515919091179055565b6005546001600160a01b03610100909104163314611c2b5760405162461bcd60e51b815260040161101c9061504d565b62030d408110158015611c4157506207a1208111155b611cb35760405162461bcd60e51b815260206004820152603c60248201527f53504f4e47533a20676173466f7250726f63657373696e67206d75737420626560448201527f206265747765656e203230302c30303020616e64203530302c30303000000000606482015260840161101c565b601a54811415611d225760405162461bcd60e51b815260206004820152603460248201527f53504f4e47533a2043616e6e6f742075706461746520676173466f7250726f63604482015273657373696e6720746f2073616d652076616c756560601b606482015260840161101c565b601a5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601a55565b6005546001600160a01b03610100909104163314611d855760405162461bcd60e51b815260040161101c9061504d565b6007546001600160a01b0382811691161415611e015760405162461bcd60e51b815260206004820152603560248201527f53504f4e47533a20546865206469766964656e6420747261636b657220616c7260448201527465616479206861732074686174206164647265737360581b606482015260840161101c565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611e4957600080fd5b505afa158015611e5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e819190614ae4565b6001600160a01b031614611f115760405162461bcd60e51b815260206004820152604b60248201527f53504f4e47533a20546865206e6577206469766964656e6420747261636b657260448201527f206d757374206265206f776e6564206279207468652053504f4e475320746f6b60648201526a195b8818dbdb9d1c9858dd60aa1b608482015260a40161101c565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b158015611f5357600080fd5b505af1158015611f67573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015611fac57600080fd5b505af1158015611fc0573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db0611feb6005546001600160a01b036101009091041690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b15801561202c57600080fd5b505af1158015612040573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b15801561208b57600080fd5b505af115801561209f573d6000803e3d6000fd5b50506007546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600780546001600160a01b0319166001600160a01b039290921691909117905550565b600061210d8261425f565b6121295760405162461bcd60e51b815260040161101c90614efb565b6001600160a01b0382163014156121525760405162461bcd60e51b815260040161101c90614f58565b61215b82611650565b156121785760405162461bcd60e51b815260040161101c90614fdb565b60075460065460405163032e4c0d60e11b81523360048201526001600160a01b038581166024830152918216604482015291169063065c981a906064015b600060405180830381600087803b1580156121d057600080fd5b505af11580156121e4573d6000803e3d6000fd5b50600195945050505050565b6005546001600160a01b036101009091041633146122205760405162461bcd60e51b815260040161101c9061504d565b6019805461ffff1916610101179055565b60606004805461117090615173565b6005546001600160a01b036101009091041633146122705760405162461bcd60e51b815260040161101c9061504d565b7f0000000000000000000000002ba1213091a94224a79cd656f90dd8d0e4696e976001600160a01b0316826001600160a01b0316141561232e5760405162461bcd60e51b815260206004820152604d60248201527f53504f4e47533a205468652050616e63616b655377617020706169722063616e60448201527f6e6f742062652072656d6f7665642066726f6d206175746f6d617465644d617260648201526c6b65744d616b6572506169727360981b608482015260a40161101c565b6119f1828261429b565b60075460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b15801561143657600080fd5b6000611200338461132e85604051806060016040528060258152602001615267602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906141eb565b6005546000906001600160a01b036101009091041633146123ff5760405162461bcd60e51b815260040161101c9061504d565b60075460405163a47e991760e01b81526001600160a01b03858116600483015284151560248301529091169063a47e9917906044015b600060405180830381600087803b15801561244f57600080fd5b505af1158015612463573d6000803e3d6000fd5b5060019695505050505050565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611953565b60006112003384846136ae565b60075460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b6101006040518083038186803b15801561250757600080fd5b505afa15801561251b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253f9190614ba9565b97509750975097509750975097509750919395975091939597565b336000908152600860205260408120546112049061257784613059565b906135ab565b6005546001600160a01b036101009091041633146125ad5760405162461bcd60e51b815260040161101c9061504d565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b6005546001600160a01b036101009091041633146126085760405162461bcd60e51b815260040161101c9061504d565b6001600160a01b0382166000818152601b6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b036101009091041633146126975760405162461bcd60e51b815260040161101c9061504d565b60075460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef906024016115e5565b6005546001600160a01b036101009091041633146126f95760405162461bcd60e51b815260040161101c9061504d565b60005b8281101561276a5781601b600086868581811061271b5761271b6151df565b90506020020160208101906127309190614ac7565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580612762816151ae565b9150506126fc565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b3583838360405161279e93929190614dd5565b60405180910390a1505050565b6005546001600160a01b036101009091041633146127db5760405162461bcd60e51b815260040161101c9061504d565b826127e68383613427565b111561288e5760405162461bcd60e51b8152602060048201526064602482018190527f53504f4e47533a20757064617465466565733a3a204c6971756964697479205060448301527f657263206d75737420626520657175616c20746f206f72206869676865722074908201527f68616e206f7065726174696f6e7320616e64206275796261636b20636f6d62696084820152633732b21760e11b60a482015260c40161101c565b6040805183815260208101839052849186917f16e6f67290546b8dd0e587f4b7f67d4f61932ae17ffd8c60d3509dbc05c175fe910160405180910390a360138490556014839055601682905560178190556128e98484613427565b60155550505050565b6005546001600160a01b036101009091041633146129225760405162461bcd60e51b815260040161101c9061504d565b61292b8261425f565b61299d5760405162461bcd60e51b815260206004820152603960248201527f53504f4e47533a2073657457686974654c697374414d4d3a3a20414d4d20697360448201527f20612077616c6c65742c206e6f74206120636f6e747261637400000000000000606482015260840161101c565b60075460405163cd06ab7360e01b81526001600160a01b03848116600483015283151560248301529091169063cd06ab73906044015b600060405180830381600087803b1580156129ed57600080fd5b505af1158015612a01573d6000803e3d6000fd5b505050505050565b6005546000906001600160a01b03610100909104163314612a3c5760405162461bcd60e51b815260040161101c9061504d565b6002548210612aa55760405162461bcd60e51b815260206004820152602f60248201527f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160448201526e37103a37ba30b61039bab838363c9760891b606482015260840161101c565b50600f55600190565b6007546040516356ef728f60e11b81526001600160a01b038381166004830152600092169063addee51e9060240160206040518083038186803b158015612af457600080fd5b505afa158015612b08573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112049190614ae4565b6000612b378361425f565b612b535760405162461bcd60e51b815260040161101c90614efb565b6006546001600160a01b0383811691161415612be15760405162461bcd60e51b815260206004820152604160248201527f53504f4e47533a20736574526577617264546f6b656e3a3a205573652073657460448201527f526577617264546f6b656e20746f207573652064656661756c7420526f7574656064820152603960f91b608482015260a40161101c565b6001600160a01b038316301415612c0a5760405162461bcd60e51b815260040161101c90614f58565b612c1383611650565b15612c305760405162461bcd60e51b815260040161101c90614fdb565b612c398261133d565b1515600114612ca35760405162461bcd60e51b815260206004820152603060248201527f53504f4e47533a20736574526577617264546f6b656e3a3a20414d4d2069732060448201526f6e6f742077686974656c69737465642160801b606482015260840161101c565b60075460405163032e4c0d60e11b81523360048201526001600160a01b03858116602483015284811660448301529091169063065c981a90606401612435565b6005546001600160a01b03610100909104163314612d135760405162461bcd60e51b815260040161101c9061504d565b60075460405163f9e2f5fb60e01b8152600481018390526001600160a01b039091169063f9e2f5fb906024016115e5565b60075460405163aa9582d360e01b81526001600160a01b038381166004830152600092169063aa9582d39060240161136c565b600080612d8333613059565b33600090815260086020526040902054909150612da09034613427565b811015612e17576040805162461bcd60e51b81526020600482015260248101919091527f53504f4e47533a206275794261636b546f6b656e73576974684e6f466565733a60448201527f3a2043616e6e6f74205370656e64206d6f7265207468616e206561726e65642e606482015260840161101c565b604080516002808252606082018352349260009291906020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b158015612e8057600080fd5b505afa158015612e94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eb89190614ae4565b81600081518110612ecb57612ecb6151df565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110612eff57612eff6151df565b6001600160a01b0390921660209283029190910182015233600090815260089091526040902054612f309034613427565b33600081815260086020908152604080832094909455601b90529182208054600160ff1982161790915560065460ff909116926001600160a01b039091169163b6f9de959186918690612f8542610168615103565b6040518663ffffffff1660e01b8152600401612fa49493929190614e2e565b6000604051808303818588803b158015612fbd57600080fd5b505af1158015612fd1573d6000803e3d6000fd5b5050336000818152601b6020526040808220805460ff1916881515179055518895509193507faf9caa8e44a7ae08c0e421ad7c7f143d77214713719ebe5472be0aed7d0c1099925090a3600194505050505090565b60075460405163ea40e76760e01b81526001600160a01b038381166004830152600092169063ea40e76790602401611953565b60075460405163709394c960e11b81526001600160a01b038381166004830152600092169063e127299290602401611953565b6005546001600160a01b036101009091041633146130bc5760405162461bcd60e51b815260040161101c9061504d565b600b546001600160a01b03828116911614156131375760405162461bcd60e51b815260206004820152603460248201527f53504f4e47533a20546865206c69717569646974792077616c6c657420697320604482015273616c72656164792074686973206164647265737360601b606482015260840161101c565b6131428160016125d8565b600b546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6007546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b15801561143657600080fd5b6005546001600160a01b036101009091041633146132145760405162461bcd60e51b815260040161101c9061504d565b6011805460ff19169055565b6005546000906001600160a01b036101009091041633146132535760405162461bcd60e51b815260040161101c9061504d565b60075460405163e98030c760e01b8152600481018490526001600160a01b039091169063e98030c7906024016121b6565b600754604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd906024016124ee565b6005546001600160a01b036101009091041633146132f65760405162461bcd60e51b815260040161101c9061504d565b6001600160a01b03811661335b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161101c565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60075460405163e8f8fe3960e01b81523360048201526000916001600160a01b03169063e8f8fe3990602401600060405180830381600087803b15801561340857600080fd5b505af115801561341c573d6000803e3d6000fd5b505050506001905090565b6000806134348385615103565b9050838110156112cd5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161101c565b6001600160a01b0383166134e85760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161101c565b6001600160a01b0382166135495760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161101c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006112cd83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506141eb565b60006112cd83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506143fb565b60008261363e57506000611204565b600061364a838561513d565b905082613657858361511b565b146112cd5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161101c565b6001600160a01b0383166136d45760405162461bcd60e51b815260040161101c90615082565b6001600160a01b0382166136fa5760405162461bcd60e51b815260040161101c90614eb8565b6001600160a01b0382166000908152600a602052604090205460ff16158061373b57506001600160a01b0383166000908152600a602052604090205460ff16155b6137925760405162461bcd60e51b815260206004820152602260248201527f53504f4e47533a20546f2f66726f6d20616464726573732069732069676e6f72604482015261195960f21b606482015260840161101c565b60195460ff16613827576001600160a01b03821660009081526009602052604090205460ff16806137db57506001600160a01b03831660009081526009602052604090205460ff165b6138275760405162461bcd60e51b815260206004820152601d60248201527f54726164696e672069732063757272656e746c792064697361626c6564000000604482015260640161101c565b6001600160a01b0382166000908152601c602052604090205460ff168015613852575060195460ff16155b801561387657506001600160a01b03831660009081526009602052604090205460ff165b15613935576005546001600160a01b038481166101009092041614806138ae57506005546001600160a01b0383811661010090920416145b806138d157506001600160a01b03831660009081526009602052604090205460ff165b6139355760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c79206465762063616e20747261646520616761696e737420504353206460448201526e3ab934b7339036b4b3b930ba34b7b760891b606482015260840161101c565b8061394b5761394683836000614429565b505050565b60115460ff1615613abd576005546001600160a01b03838116610100909204161480159061398757506006546001600160a01b03838116911614155b80156139c557507f0000000000000000000000002ba1213091a94224a79cd656f90dd8d0e4696e976001600160a01b0316826001600160a01b031614155b80156139ea57506001600160a01b0382166000908152601b602052604090205460ff16155b8015613a0f57506001600160a01b0383166000908152601b602052604090205460ff16155b15613abd576001600160a01b0382166000908152601060205260409020544211613aa15760405162461bcd60e51b815260206004820152603c60248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e2020506c656173652074727920616761696e206c617465722e00000000606482015260840161101c565b6001600160a01b03821660009081526010602052604090204290555b613ac68261425f565b158015613aec57506001600160a01b0382166000908152601b602052604090205460ff16155b15613b21576001600160a01b038216600090815260126020526040902054613b21576001600160a01b03821660005260126020525b613b2a8261425f565b158015613b4f57506001600160a01b0383166000908152601c602052604090205460ff165b8015613b7457506001600160a01b0382166000908152601b602052604090205460ff16155b15613c00576001600160a01b0382166000908152601260205260409020544211613c00576001600160a01b038216600090815260126020526040902054613be690613bc7906003906112399042906135ab565b6001600160a01b03841660009081526012602052604090205490613427565b6001600160a01b0383166000908152601260205260409020555b6001600160a01b0382166000908152601c602052604090205460ff1615613c9057600e54811115613c735760405162461bcd60e51b815260206004820152601e60248201527f42455032303a2045786365656473206d61782073656c6c20616d6f756e740000604482015260640161101c565b613c8d60646112396018548461362f90919063ffffffff16565b90505b30600090815260208190526040902054600f5481108015908190613cbe5750600654600160a01b900460ff16155b8015613cd15750601954610100900460ff165b8015613cf657506001600160a01b0385166000908152601c602052604090205460ff16155b8015613d105750600b546001600160a01b03868116911614155b8015613d2a5750600b546001600160a01b03858116911614155b8015613d445750600c546001600160a01b03868116911614155b8015613d5e5750600c546001600160a01b03858116911614155b8015613d785750600d546001600160a01b03868116911614155b8015613d925750600d546001600160a01b03858116911614155b8015613db757506001600160a01b0384166000908152601b602052604090205460ff16155b8015613ddc57506001600160a01b0385166000908152601b602052604090205460ff16155b8015613df157506001600160a01b0385163014155b8015613e0b57506007546001600160a01b03868116911614155b15613e6f576006805460ff60a01b1916600160a01b179055601554601454600091613e3b9161123990869061362f565b9050613e4681614532565b30600090815260208190526040902054613e5f81614839565b50506006805460ff60a01b191690555b6006546001600160a01b0386166000908152601b602052604090205460ff600160a01b909204821615911680613ebd57506001600160a01b0385166000908152601b602052604090205460ff165b80613ed057506001600160a01b03861630145b15613ed9575060005b8015613fde576000613efb60646112396015548861362f90919063ffffffff16565b6001600160a01b0387166000908152601c602052604090205490915060ff1615613fc5576000613f6a60646112397f0000000000000000000000000000000000000000000000000000000000000078613f6460646112396013548d61362f90919063ffffffff16565b9061362f565b90506000613f996064611239613f7f8c61120a565b613f6460646112396014548e61362f90919063ffffffff16565b9050613fa58282613427565b6001600160a01b038a166000908152601260205260409020429055925050505b613fcf85826135ab565b9450613fdc873083614429565b505b613fe9868686614429565b6007546001600160a01b031663e30443bc8761401a816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561406057600080fd5b505af1925050508015614071575060015b506007546001600160a01b031663e30443bc866140a3816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156140e957600080fd5b505af19250505080156140fa575060015b50600654600160a01b900460ff16612a0157601a546007546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c47990602401606060405180830381600087803b15801561415857600080fd5b505af1925050508015614188575060408051601f3d908101601f1916820190925261418591810190614d31565b60015b614191576141e2565b60408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b50505050505050565b6000818484111561420f5760405162461bcd60e51b815260040161101c9190614e63565b50600061421c848661515c565b95945050505050565b600c546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156119f1573d6000803e3d6000fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061429357508115155b949350505050565b6001600160a01b0382166000908152601c602052604090205460ff1615158115151415614332576040805162461bcd60e51b81526020600482015260248101919091527f53504f4e47533a204175746f6d61746564206d61726b6574206d616b6572207060448201527f61697220697320616c72656164792073657420746f20746861742076616c7565606482015260840161101c565b6001600160a01b0382166000908152601c60205260409020805460ff191682158015919091179091556143bf5760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156143a657600080fd5b505af11580156143ba573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6000818361441c5760405162461bcd60e51b815260040161101c9190614e63565b50600061421c848661511b565b6001600160a01b03831661444f5760405162461bcd60e51b815260040161101c90615082565b6001600160a01b0382166144755760405162461bcd60e51b815260040161101c90614eb8565b6144b281604051806060016040528060268152602001615219602691396001600160a01b03861660009081526020819052604090205491906141eb565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546144e19082613427565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910161359e565b6014541561174c576014546000901561457f5761457860145461123961457161456860165460175461342790919063ffffffff16565b601454906135ab565b859061362f565b9050614583565b5060005b600061458f83836135ab565b9050600061459e8360026135ed565b905060006145ac84836135ab565b9050476145b8836148d8565b60006145c447836135ab565b90506145d08382614a0b565b6145d9856148d8565b60006145e547846135ab565b905060008060165411156146ed57600061461d61460f60165460175461342790919063ffffffff16565b60165461123990869061362f565b600c546040519192506001600160a01b0316908290600081818185875af1925050503d806000811461466b576040519150601f19603f3d011682016040523d82523d6000602084013e614670565b606091505b505080925050816146eb576040805162461bcd60e51b81526020600482015260248101919091527f53504f4e47533a2053776170416e644c6971756966793a3a20556e61626c652060448201527f746f2073656e6420424e4220746f204f7065726174696f6e732057616c6c6574606482015260840161101c565b505b601754156147ed57600061471f61471160165460175461342790919063ffffffff16565b60175461123990869061362f565b600d546040519192506001600160a01b0316908290600081818185875af1925050503d806000811461476d576040519150601f19603f3d011682016040523d82523d6000602084013e614772565b606091505b505080925050816147eb5760405162461bcd60e51b815260206004820152603d60248201527f53504f4e47533a2053776170416e644c6971756966793a3a20556e61626c652060448201527f746f2073656e6420424e4220746f204275794261636b2057616c6c6574000000606482015260840161101c565b505b60408051878152602081018590529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a1505050505050505050565b614842816148d8565b60075460405147916000916001600160a01b039091169083908381818185875af1925050503d8060008114614893576040519150601f19603f3d011682016040523d82523d6000602084013e614898565b606091505b5050905080156139465760408051848152602081018490527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3910161279e565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061490d5761490d6151df565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561496157600080fd5b505afa158015614975573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149999190614ae4565b816001815181106149ac576149ac6151df565b6001600160a01b0392831660209182029290920101526006546149d29130911684613486565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906129d39085906000908690309042906004016150c7565b600654614a239030906001600160a01b031684613486565b600654600b5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c4016060604051808303818588803b158015614a8e57600080fd5b505af1158015614aa2573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906116139190614d31565b600060208284031215614ad957600080fd5b81356112cd816151f5565b600060208284031215614af657600080fd5b81516112cd816151f5565b60008060408385031215614b1457600080fd5b8235614b1f816151f5565b91506020830135614b2f816151f5565b809150509250929050565b600080600060608486031215614b4f57600080fd5b8335614b5a816151f5565b92506020840135614b6a816151f5565b929592945050506040919091013590565b60008060408385031215614b8e57600080fd5b8235614b99816151f5565b91506020830135614b2f8161520a565b600080600080600080600080610100898b031215614bc657600080fd5b8851614bd1816151f5565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60008060408385031215614c2657600080fd5b8235614c31816151f5565b946020939093013593505050565b600080600060408486031215614c5457600080fd5b833567ffffffffffffffff80821115614c6c57600080fd5b818601915086601f830112614c8057600080fd5b813581811115614c8f57600080fd5b8760208260051b8501011115614ca457600080fd5b60209283019550935050840135614cba8161520a565b809150509250925092565b600060208284031215614cd757600080fd5b81356112cd8161520a565b600060208284031215614cf457600080fd5b81516112cd8161520a565b600060208284031215614d1157600080fd5b5035919050565b600060208284031215614d2a57600080fd5b5051919050565b600080600060608486031215614d4657600080fd5b8351925060208401519150604084015190509250925092565b60008060008060808587031215614d7557600080fd5b5050823594602084013594506040840135936060013592509050565b600081518084526020808501945080840160005b83811015614dca5781516001600160a01b031687529582019590820190600101614da5565b509495945050505050565b6040808252810183905260008460608301825b86811015614e18578235614dfb816151f5565b6001600160a01b0316825260209283019290910190600101614de8565b5080925050508215156020830152949350505050565b848152608060208201526000614e476080830186614d91565b6001600160a01b03949094166040830152506060015292915050565b600060208083528351808285015260005b81811015614e9057858101830151858201604001528201614e74565b81811115614ea2576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252603d908201527f53504f4e47533a20736574526577617264546f6b656e3a3a204164647265737360408201527f20697320612077616c6c65742c206e6f74206120636f6e74726163742e000000606082015260800190565b60208082526059908201527f53504f4e47533a20736574526577617264546f6b656e3a3a2043616e6e6f742060408201527f7365742072657761726420746f6b656e206173207468697320746f6b656e206460608201527f756520746f20526f75746572206c696d69746174696f6e732e00000000000000608082015260a00190565b6020808252604c908201527f53504f4e47533a20736574526577617264546f6b656e3a3a205265776172642060408201527f546f6b656e2069732069676e6f7265642066726f6d206265696e67207573656460608201526b1030b9903932bbb0b932399760a11b608082015260a00190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b85815284602082015260a0604082015260006150e660a0830186614d91565b6001600160a01b0394909416606083015250608001529392505050565b60008219821115615116576151166151c9565b500190565b60008261513857634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615615157576151576151c9565b500290565b60008282101561516e5761516e6151c9565b500390565b600181811c9082168061518757607f821691505b602082108114156151a857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156151c2576151c26151c9565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038116811461174c57600080fd5b801515811461174c57600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220041903d5c81ba26b050b22777dc4ab30030c43cef7b4284a3f447a2764abe05a64736f6c63430008060033
Deployed Bytecode Sourcemap
48044:33621:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48372:56;;;;;;;;;;-1:-1:-1;48372:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9539:14:1;;9532:22;9514:41;;9502:2;9487:18;48372:56:0;;;;;;;;48612:64;;;;;;;;;;;;;;;;;;;26164:25:1;;;26152:2;26137:18;48612:64:0;26119:76:1;58021:119:0;;;;;;;;;;-1:-1:-1;58021:119:0;;;;;:::i;:::-;;:::i;:::-;;59893:351;;;;;;;;;;-1:-1:-1;59893:351:0;;;;;:::i;:::-;;:::i;16732:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;49605:32::-;;;;;;;;;;;;;;;;18906:169;;;;;;;;;;-1:-1:-1;18906:169:0;;;;;:::i;:::-;;:::i;49366:58::-;;;;;;;;;;;;;;;;48120:41;;;;;;;;;;-1:-1:-1;48120:41:0;;;;-1:-1:-1;;;;;48120:41:0;;;;;;-1:-1:-1;;;;;5935:32:1;;;5917:51;;5905:2;5890:18;48120:41:0;5872:102:1;17859:108:0;;;;;;;;;;-1:-1:-1;17947:12:0;;17859:108;;63673:887;;;;;;;;;;-1:-1:-1;63673:887:0;;;;;:::i;:::-;;:::i;50028:52::-;;;;;;;;;;;;;;;19557:355;;;;;;;;;;-1:-1:-1;19557:355:0;;;;;:::i;:::-;;:::i;62001:142::-;;;;;;;;;;-1:-1:-1;62001:142:0;;;;;:::i;:::-;;:::i;56080:121::-;;;;;;;;;;-1:-1:-1;56080:121:0;;;;;:::i;:::-;;:::i;48249:44::-;;;;;;;;;;-1:-1:-1;48249:44:0;;;;-1:-1:-1;;;;;48249:44:0;;;64844:141;;;;;;;;;;;;;:::i;59444:384::-;;;;;;;;;;-1:-1:-1;59444:384:0;;;;;:::i;:::-;;:::i;17694:100::-;;;;;;;;;;-1:-1:-1;17777:9:0;;17694:100;;17777:9;;;;27902:36:1;;27890:2;27875:18;17694:100:0;27857:87:1;58233:130:0;;;;;;;;;;-1:-1:-1;58233:130:0;;;;;:::i;:::-;;:::i;20321:218::-;;;;;;;;;;-1:-1:-1;20321:218:0;;;;;:::i;:::-;;:::i;66447:142::-;;;;;;;;;;-1:-1:-1;66447:142:0;;;;;:::i;:::-;;:::i;64573:143::-;;;;;;;;;;;;;:::i;48168:38::-;;;;;;;;;;;;;;;49644:29;;;;;;;;;;;;;;;;70576:103;;;;;;;;;;;;;:::i;64993:125::-;;;;;;;;;;-1:-1:-1;64993:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;65082:28:0;65058:4;65082:28;;;:19;:28;;;;;;;;;64993:125;50093:50;;;;;;;;;;;;;;;81464:198;;;;;;;;;;-1:-1:-1;81464:198:0;;;;;:::i;:::-;;:::i;48306:59::-;;;;;;;;;;-1:-1:-1;48306:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;63420:141;;;;;;;;;;;;;:::i;56521:317::-;;;;;;;;;;-1:-1:-1;56521:317:0;;;;;:::i;:::-;;:::i;65285:139::-;;;;;;;;;;-1:-1:-1;65285:139:0;;;;;:::i;:::-;;:::i;81087:246::-;;;;;;;;;;-1:-1:-1;81087:246:0;;;;;:::i;:::-;;:::i;70742:271::-;;;;;;;;;;-1:-1:-1;70742:271:0;;;;;:::i;:::-;;:::i;18030:127::-;;;;;;;;;;-1:-1:-1;18030:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;18131:18:0;18104:7;18131:18;;;;;;;;;;;;18030:127;2111:148;;;;;;;;;;;;;:::i;49108:55::-;;;;;;;;;;-1:-1:-1;49108:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;56925:154;;;;;;;;;;-1:-1:-1;56925:154:0;;;;;:::i;:::-;;:::i;57151:119::-;;;;;;;;;;-1:-1:-1;57151:119:0;;;;;:::i;:::-;;:::i;60991:410::-;;;;;;;;;;-1:-1:-1;60991:410:0;;;;;:::i;:::-;;:::i;48435:49::-;;;;;;;;;;-1:-1:-1;48435:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;55145:840;;;;;;;;;;-1:-1:-1;55145:840:0;;;;;:::i;:::-;;:::i;66762:601::-;;;;;;;;;;-1:-1:-1;66762:601:0;;;;;:::i;:::-;;:::i;1469:79::-;;;;;;;;;;-1:-1:-1;1534:6:0;;;;;-1:-1:-1;;;;;1534:6:0;1469:79;;68682:128;;;;;;;;;;;;;:::i;16951:104::-;;;;;;;;;;;;;:::i;49228:31::-;;;;;;;;;;;;;;;;58660:266;;;;;;;;;;-1:-1:-1;58660:266:0;;;;;:::i;:::-;;:::i;50222:40::-;;;;;;;;;;;;;;;;49677:35;;;;;;;;;;;;;;;;64728:108;;;;;;;;;;;;;:::i;21042:269::-;;;;;;;;;;-1:-1:-1;21042:269:0;;;;;:::i;:::-;;:::i;61670:191::-;;;;;;;;;;-1:-1:-1;61670:191:0;;;;;:::i;:::-;;:::i;65126:151::-;;;;;;;;;;-1:-1:-1;65126:151:0;;;;;:::i;:::-;;:::i;18370:175::-;;;;;;;;;;-1:-1:-1;18370:175:0;;;;;:::i;:::-;;:::i;65436:318::-;;;;;;;;;;-1:-1:-1;65436:318:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7614:32:1;;;7596:51;;7678:2;7663:18;;7656:34;;;;7706:18;;;7699:34;;;;7764:2;7749:18;;7742:34;;;;7807:3;7792:19;;7785:35;7634:3;7836:19;;7829:35;7895:3;7880:19;;7873:35;7939:3;7924:19;;7917:35;7583:3;7568:19;65436:318:0;7550:408:1;50535:58:0;;;;;;;;;;-1:-1:-1;50535:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;66255:180;;;;;;;;;;-1:-1:-1;66255:180:0;;;;;:::i;:::-;;:::i;57877:132::-;;;;;;;;;;-1:-1:-1;57877:132:0;;;;;:::i;:::-;;:::i;57326:182::-;;;;;;;;;;-1:-1:-1;57326:182:0;;;;;:::i;:::-;;:::i;58468:126::-;;;;;;;;;;-1:-1:-1;58468:126:0;;;;;:::i;:::-;;:::i;57559:306::-;;;;;;;;;;-1:-1:-1;57559:306:0;;;;;:::i;:::-;;:::i;60289:625::-;;;;;;;;;;-1:-1:-1;60289:625:0;;;;;:::i;:::-;;:::i;48944:39::-;;;;;;;;;;-1:-1:-1;48944:39:0;;;;;;;;54330:260;;;;;;;;;;-1:-1:-1;54330:260:0;;;;;:::i;:::-;;:::i;49189:32::-;;;;;;;;;;;;;;;;54664:253;;;;;;;;;;-1:-1:-1;54664:253:0;;;;;:::i;:::-;;:::i;62786:152::-;;;;;;;;;;-1:-1:-1;62786:152:0;;;;;:::i;:::-;;:::i;67479:887::-;;;;;;;;;;-1:-1:-1;67479:887:0;;;;;:::i;:::-;;:::i;56301:158::-;;;;;;;;;;-1:-1:-1;56301:158:0;;;;;:::i;:::-;;:::i;48499:30::-;;;;;;;;;;-1:-1:-1;48499:30:0;;;;-1:-1:-1;;;;;48499:30:0;;;62950:153;;;;;;;;;;-1:-1:-1;62950:153:0;;;;;:::i;:::-;;:::i;68899:1611::-;;;:::i;18608:151::-;;;;;;;;;;-1:-1:-1;18608:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;18724:18:0;;;18697:7;18724:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;18608:151;63115:156;;;;;;;;;;-1:-1:-1;63115:156:0;;;;;:::i;:::-;;:::i;66102:141::-;;;;;;;;;;-1:-1:-1;66102:141:0;;;;;:::i;:::-;;:::i;48683:59::-;;;;;;;;;;;;;;;;58994:373;;;;;;;;;;-1:-1:-1;58994:373:0;;;;;:::i;:::-;;:::i;63283:129::-;;;;;;;;;;;;;:::i;54972:98::-;;;;;;;;;;;;;:::i;61498:160::-;;;;;;;;;;-1:-1:-1;61498:160:0;;;;;:::i;:::-;;:::i;65762:328::-;;;;;;;;;;-1:-1:-1;65762:328:0;;;;;:::i;:::-;;:::i;2414:244::-;;;;;;;;;;-1:-1:-1;2414:244:0;;;;;:::i;:::-;;:::i;68439:134::-;;;;;;;;;;;;;:::i;48536:31::-;;;;;;;;;;-1:-1:-1;48536:31:0;;;;-1:-1:-1;;;;;48536:31:0;;;58021:119;1681:6;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;58098:25:0;;;::::1;;::::0;;;:17:::1;:25;::::0;;;;:34;;-1:-1:-1;;58098:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;58021:119::o;59893:351::-;1681:6;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;60006:13:::1;::::0;-1:-1:-1;;;;;59986:33:0;;::::1;60006:13:::0;::::1;59986:33;;59978:96;;;::::0;-1:-1:-1;;;59978:96:0;;22386:2:1;59978:96:0::1;::::0;::::1;22368:21:1::0;22425:2;22405:18;;;22398:30;22464:34;22444:18;;;22437:62;-1:-1:-1;;;22515:18:1;;;22508:48;22573:19;;59978:96:0::1;22358:240:1::0;59978:96:0::1;60085:39;60101:16;60119:4;60085:15;:39::i;:::-;60179:13;::::0;60140:53:::1;::::0;-1:-1:-1;;;;;60179:13:0;;::::1;::::0;60140:53;::::1;::::0;::::1;::::0;60179:13:::1;::::0;60140:53:::1;60204:13;:32:::0;;-1:-1:-1;;;;;;60204:32:0::1;-1:-1:-1::0;;;;;60204:32:0;;;::::1;::::0;;;::::1;::::0;;59893:351::o;16732:100::-;16786:13;16819:5;16812:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16732:100;:::o;18906:169::-;18989:4;19006:39;709:10;19029:7;19038:6;19006:8;:39::i;:::-;-1:-1:-1;19063:4:0;18906:169;;;;;:::o;63673:887::-;-1:-1:-1;;;;;63874:27:0;;63739:7;63874:27;;;:19;:27;;;;;;63739:7;;63853:63;;63908:7;;63854:48;;:15;;:19;:48::i;:::-;63853:54;;:63::i;:::-;-1:-1:-1;;;;;64028:27:0;;;;;;:19;:27;;;;;;63825:91;;-1:-1:-1;64025:91:0;;-1:-1:-1;64083:21:0;;63673:887;-1:-1:-1;;63673:887:0:o;64025:91::-;64233:1;64212:17;:22;64209:92;;-1:-1:-1;64257:2:0;;63673:887;-1:-1:-1;;63673:887:0:o;64209:92::-;64526:25;:17;64548:2;64526:21;:25::i;:::-;64503:49;;:21;:49;:::i;:::-;64496:56;63673:887;-1:-1:-1;;;63673:887:0:o;19557:355::-;19697:4;19714:36;19724:6;19732:9;19743:6;19714:9;:36::i;:::-;19761:121;19770:6;709:10;19792:89;19830:6;19792:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19792:19:0;;;;;;:11;:19;;;;;;;;709:10;19792:33;;;;;;;;;;:37;:89::i;:::-;19761:8;:121::i;:::-;-1:-1:-1;19900:4:0;19557:355;;;;;:::o;62001:142::-;62091:15;;:44;;-1:-1:-1;;;62091:44:0;;-1:-1:-1;;;;;5935:32:1;;;62091:44:0;;;5917:51:1;62068:4:0;;62091:15;;:32;;5890:18:1;;62091:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;56080:121::-;1681:6;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;56154:24:::1;:39:::0;56080:121::o;64844:141::-;64934:15;;:43;;;-1:-1:-1;;;64934:43:0;;;;64907:7;;-1:-1:-1;;;;;64934:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64927:50;;64844:141;:::o;59444:384::-;1681:6;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;59566:16:::1;::::0;-1:-1:-1;;;;;59543:39:0;;::::1;59566:16:::0;::::1;59543:39;;59535:105;;;::::0;-1:-1:-1;;;59535:105:0;;18301:2:1;59535:105:0::1;::::0;::::1;18283:21:1::0;18340:2;18320:18;;;18313:30;18379:34;18359:18;;;18352:62;-1:-1:-1;;;18430:18:1;;;18423:51;18491:19;;59535:105:0::1;18273:243:1::0;59535:105:0::1;59651:42;59667:19;59688:4;59651:15;:42::i;:::-;59754:16;::::0;59709:62:::1;::::0;-1:-1:-1;;;;;59754:16:0;;::::1;::::0;59709:62;::::1;::::0;::::1;::::0;59754:16:::1;::::0;59709:62:::1;59782:16;:38:::0;;-1:-1:-1;;;;;;59782:38:0::1;-1:-1:-1::0;;;;;59782:38:0;;;::::1;::::0;;;::::1;::::0;;59444:384::o;58233:130::-;1681:6;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;58310:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;58310:45:0;;-1:-1:-1;;;;;5935:32:1;;;58310:45:0::1;::::0;::::1;5917:51:1::0;58310:15:0;;::::1;::::0;:36:::1;::::0;5890:18:1;;58310:45:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;58233:130:::0;:::o;20321:218::-;709:10;20409:4;20458:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;20458:34:0;;;;;;;;;;20409:4;;20426:83;;20449:7;;20458:50;;20497:10;20458:38;:50::i;66447:142::-;66537:15;;:44;;-1:-1:-1;;;66537:44:0;;-1:-1:-1;;;;;5935:32:1;;;66537:44:0;;;5917:51:1;66514:4:0;;66537:15;;:30;;5890:18:1;;66537:44:0;5872:102:1;64573:143:0;64659:15;;:49;;;-1:-1:-1;;;64659:49:0;;;;64632:7;;-1:-1:-1;;;;;64659:15:0;;:47;;:49;;;;;;;;;;;;;;:15;:49;;;;;;;;;;70576:103;70613:15;;:58;;-1:-1:-1;;;70613:58:0;;70652:10;70613:58;;;6163:51:1;70613:15:0;6230:18:1;;;6223:50;-1:-1:-1;;;;;70613:15:0;;;;:30;;6136:18:1;;70613:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;70576:103::o;81464:198::-;1681:6;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;81568:3:::1;81551:14;:20;81543:68;;;::::0;-1:-1:-1;;;81543:68:0;;20319:2:1;81543:68:0::1;::::0;::::1;20301:21:1::0;20358:2;20338:18;;;20331:30;20397:34;20377:18;;;20370:62;-1:-1:-1;;;20448:18:1;;;20441:33;20491:19;;81543:68:0::1;20291:225:1::0;81543:68:0::1;81622:15;:32:::0;81464:198::o;63420:141::-;63512:15;;:41;;;-1:-1:-1;;;63512:41:0;;;;63485:7;;-1:-1:-1;;;;;63512:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;56521:317;1681:6;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;56632:15:::1;::::0;-1:-1:-1;;;;;56610:38:0;;::::1;56632:15:::0;::::1;56610:38;;56602:94;;;::::0;-1:-1:-1;;;56602:94:0;;21139:2:1;56602:94:0::1;::::0;::::1;21121:21:1::0;21178:2;21158:18;;;21151:30;21217:34;21197:18;;;21190:62;-1:-1:-1;;;21268:18:1;;;21261:41;21319:19;;56602:94:0::1;21111:233:1::0;56602:94:0::1;56754:15;::::0;56712:59:::1;::::0;-1:-1:-1;;;;;56754:15:0;;::::1;::::0;56712:59;::::1;::::0;::::1;::::0;56754:15:::1;::::0;56712:59:::1;56782:15;:48:::0;;-1:-1:-1;;;;;;56782:48:0::1;-1:-1:-1::0;;;;;56782:48:0;;;::::1;::::0;;;::::1;::::0;;56521:317::o;65285:139::-;65382:15;;:34;;-1:-1:-1;;;65382:34:0;;-1:-1:-1;;;;;5935:32:1;;;65382:34:0;;;5917:51:1;65355:7:0;;65382:15;;:25;;5890:18:1;;65382:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;81087:246::-;1681:6;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;81185:21:::1;81222:13:::0;;81219:106:::1;;81252:59;81275:35;81306:3;81275:26;:9:::0;81289:11;81275:13:::1;:26::i;:35::-;81252:22;:59::i;:::-;81152:181;81087:246:::0;:::o;70742:271::-;70874:15;;:28;;-1:-1:-1;;;;;;70874:28:0;;;;;26164:25:1;;;70808:18:0;;;;;;-1:-1:-1;;;;;70874:15:0;;:23;;26137:18:1;;70874:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70918:87;;;27595:25:1;;;27651:2;27636:18;;27629:34;;;27679:18;;;27672:34;;;27737:2;27722:18;;27715:34;;;70807:95:0;;-1:-1:-1;70807:95:0;;-1:-1:-1;70807:95:0;-1:-1:-1;70995:9:0;;70983:5;;70918:87;;27582:3:1;27567:19;70918:87:0;;;;;;;70796:217;;;70742:271;:::o;2111:148::-;1681:6;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;2202:6:::1;::::0;2181:40:::1;::::0;2218:1:::1;::::0;2202:6:::1;::::0;::::1;-1:-1:-1::0;;;;;2202:6:0::1;::::0;2181:40:::1;::::0;2218:1;;2181:40:::1;2232:6;:19:::0;;-1:-1:-1;;;;;;2232:19:0::1;::::0;;2111:148::o;56925:154::-;1681:6;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;57014:15:::1;::::0;:57:::1;::::0;-1:-1:-1;;;57014:57:0;;-1:-1:-1;;;;;5935:32:1;;;57014:57:0::1;::::0;::::1;5917:51:1::0;57014:15:0;;::::1;::::0;:45:::1;::::0;5890:18:1;;57014:57:0::1;5872:102:1::0;57151:119:0;1681:6;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;57230:16:::1;:32:::0;;-1:-1:-1;;57230:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;57151:119::o;60991:410::-;1681:6;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;61091:6:::1;61079:8;:18;;:40;;;;;61113:6;61101:8;:18;;61079:40;61071:113;;;::::0;-1:-1:-1;;;61071:113:0;;11770:2:1;61071:113:0::1;::::0;::::1;11752:21:1::0;11809:2;11789:18;;;11782:30;11848:34;11828:18;;;11821:62;11919:30;11899:18;;;11892:58;11967:19;;61071:113:0::1;11742:250:1::0;61071:113:0::1;61215:16;;61203:8;:28;;61195:93;;;::::0;-1:-1:-1;;;61195:93:0;;14661:2:1;61195:93:0::1;::::0;::::1;14643:21:1::0;14700:2;14680:18;;;14673:30;14739:34;14719:18;;;14712:62;-1:-1:-1;;;14790:18:1;;;14783:50;14850:19;;61195:93:0::1;14633:242:1::0;61195:93:0::1;61338:16;::::0;61304:51:::1;::::0;61328:8;;61304:51:::1;::::0;;;::::1;61366:16;:27:::0;60991:410::o;55145:840::-;1681:6;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;55254:15:::1;::::0;-1:-1:-1;;;;;55232:38:0;;::::1;55254:15:::0;::::1;55232:38;;55224:104;;;::::0;-1:-1:-1;;;55224:104:0;;16920:2:1;55224:104:0::1;::::0;::::1;16902:21:1::0;16959:2;16939:18;;;16932:30;16998:34;16978:18;;;16971:62;-1:-1:-1;;;17049:18:1;;;17042:51;17110:19;;55224:104:0::1;16892:243:1::0;55224:104:0::1;55341:40;55414:10;55341:85;;55485:4;-1:-1:-1::0;;;;;55447:43:0::1;:18;-1:-1:-1::0;;;;;55447:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;55447:43:0::1;;55439:131;;;::::0;-1:-1:-1;;;55439:131:0;;15082:2:1;55439:131:0::1;::::0;::::1;15064:21:1::0;15121:2;15101:18;;;15094:30;15160:34;15140:18;;;15133:62;15231:34;15211:18;;;15204:62;-1:-1:-1;;;15282:19:1;;;15275:42;15334:19;;55439:131:0::1;15054:305:1::0;55439:131:0::1;55583:68;::::0;-1:-1:-1;;;55583:68:0;;-1:-1:-1;;;;;55583:39:0;::::1;:68;::::0;::::1;5917:51:1::0;;;55583:39:0;::::1;::::0;5890:18:1;;55583:68:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;55662:54:0::1;::::0;-1:-1:-1;;;55662:54:0;;55710:4:::1;55662:54;::::0;::::1;5917:51:1::0;-1:-1:-1;;;;;55662:39:0;::::1;::::0;-1:-1:-1;55662:39:0::1;::::0;-1:-1:-1;5890:18:1;;55662:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;55727:18;-1:-1:-1::0;;;;;55727:39:0::1;;55767:7;1534:6:::0;;-1:-1:-1;;;;;1534:6:0;;;;;;1469:79;55767:7:::1;55727:48;::::0;-1:-1:-1;;;;;;55727:48:0::1;::::0;;;;;;-1:-1:-1;;;;;5935:32:1;;;55727:48:0::1;::::0;::::1;5917:51:1::0;5890:18;;55727:48:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;55834:15:0::1;::::0;55786:65:::1;::::0;-1:-1:-1;;;55786:65:0;;-1:-1:-1;;;;;55834:15:0;;::::1;55786:65;::::0;::::1;5917:51:1::0;55786:39:0;;::::1;::::0;-1:-1:-1;55786:39:0::1;::::0;-1:-1:-1;5890:18:1;;55786:65:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;55911:15:0::1;::::0;55869:59:::1;::::0;-1:-1:-1;;;;;55911:15:0;;::::1;::::0;-1:-1:-1;55869:59:0;;::::1;::::0;-1:-1:-1;55869:59:0::1;::::0;55911:15:::1;::::0;55869:59:::1;55941:15;:36:::0;;-1:-1:-1;;;;;;55941:36:0::1;-1:-1:-1::0;;;;;55941:36:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;55145:840:0:o;66762:601::-;66830:4;66855:30;66866:18;66855:10;:30::i;:::-;66847:104;;;;-1:-1:-1;;;66847:104:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;66970:35:0;;67000:4;66970:35;;66962:137;;;;-1:-1:-1;;;66962:137:0;;;;;;;:::i;:::-;67119:34;67134:18;67119:14;:34::i;:::-;67118:35;67110:124;;;;-1:-1:-1;;;67110:124:0;;;;;;;:::i;:::-;67245:15;;67316;;67245:88;;-1:-1:-1;;;67245:88:0;;67276:10;67245:88;;;6819:34:1;-1:-1:-1;;;;;6889:15:1;;;6869:18;;;6862:43;67316:15:0;;;6921:18:1;;;6914:43;67245:15:0;;;:30;;6754:18:1;;67245:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67351:4:0;;66762:601;-1:-1:-1;;;;;66762:601:0:o;68682:128::-;1681:6;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;68738:16:::1;:23:::0;;-1:-1:-1;;68772:30:0;;;;;68682:128::o;16951:104::-;17007:13;17040:7;17033:14;;;;;:::i;58660:266::-;1681:6;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;58769:13:::1;-1:-1:-1::0;;;;;58761:21:0::1;:4;-1:-1:-1::0;;;;;58761:21:0::1;;;58753:111;;;::::0;-1:-1:-1;;;58753:111:0;;23210:2:1;58753:111:0::1;::::0;::::1;23192:21:1::0;23249:2;23229:18;;;23222:30;23288:34;23268:18;;;23261:62;23359:34;23339:18;;;23332:62;-1:-1:-1;;;23410:19:1;;;23403:44;23464:19;;58753:111:0::1;23182:307:1::0;58753:111:0::1;58877:41;58906:4;58912:5;58877:28;:41::i;64728:108::-:0;64801:15;;:27;;;-1:-1:-1;;;64801:27:0;;;;64774:7;;-1:-1:-1;;;;;64801:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;21042:269;21135:4;21152:129;709:10;21175:7;21184:96;21223:15;21184:96;;;;;;;;;;;;;;;;;709:10;21184:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;21184:34:0;;;;;;;;;;;;:38;:96::i;61670:191::-;1681:6;;61760:4;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;61776:15:::1;::::0;:55:::1;::::0;-1:-1:-1;;;61776:55:0;;-1:-1:-1;;;;;6181:32:1;;;61776:55:0::1;::::0;::::1;6163:51:1::0;6257:14;;6250:22;6230:18;;;6223:50;61776:15:0;;::::1;::::0;:30:::1;::::0;6136:18:1;;61776:55:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;61849:4:0::1;::::0;61670:191;-1:-1:-1;;;;;;61670:191:0:o;65126:151::-;65222:15;;:47;;-1:-1:-1;;;65222:47:0;;-1:-1:-1;;;;;5935:32:1;;;65222:47:0;;;5917:51:1;65195:7:0;;65222:15;;:38;;5890:18:1;;65222:47:0;5872:102:1;18370:175:0;18456:4;18473:42;709:10;18497:9;18508:6;18473:9;:42::i;65436:318::-;65711:15;;:35;;-1:-1:-1;;;65711:35:0;;-1:-1:-1;;;;;5935:32:1;;;65711:35:0;;;5917:51:1;65532:7:0;;;;;;;;;;;;;;;;65711:15;;;:26;;5890:18:1;;65711:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65704:42;;;;;;;;;;;;;;;;65436:318;;;;;;;;;:::o;66255:180::-;66415:10;66333:7;66390:36;;;:24;:36;;;;;;66359:68;;:26;66378:6;66359:18;:26::i;:::-;:30;;:68::i;57877:132::-;1681:6;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;57960:32:0;;;::::1;;::::0;;;:24:::1;:32;::::0;;;;:41;;-1:-1:-1;;57960:41:0::1;::::0;::::1;;::::0;;;::::1;::::0;;57877:132::o;57326:182::-;1681:6;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;57411:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;57411:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;57466:34;;9514:41:1;;;57466:34:0::1;::::0;9487:18:1;57466:34:0::1;;;;;;;57326:182:::0;;:::o;58468:126::-;1681:6;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;58543:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;58543:43:0;;-1:-1:-1;;;;;5935:32:1;;;58543:43:0::1;::::0;::::1;5917:51:1::0;58543:15:0;;::::1;::::0;:34:::1;::::0;5890:18:1;;58543:43:0::1;5872:102:1::0;57559:306:0;1681:6;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;57678:9:::1;57674:115;57693:19:::0;;::::1;57674:115;;;57769:8;57734:19;:32;57754:8;;57763:1;57754:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;57734:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;57734:32:0;:43;;-1:-1:-1;;57734:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;57714:3;::::1;::::0;::::1;:::i;:::-;;;;57674:115;;;;57806:51;57838:8;;57848;57806:51;;;;;;;;:::i;:::-;;;;;;;;57559:306:::0;;;:::o;60289:625::-;1681:6;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;60474:13;60439:31:::1;:14:::0;60458:11;60439:18:::1;:31::i;:::-;:48;;60430:162;;;::::0;-1:-1:-1;;;60430:162:0;;25237:2:1;60430:162:0::1;::::0;::::1;25219:21:1::0;25276:3;25256:18;;;25249:31;;;25316:34;25296:18;;;25289:62;25387:34;25367:18;;;25360:62;25459:34;25438:19;;;25431:63;-1:-1:-1;;;25510:19:1;;;25503:35;25555:19;;60430:162:0::1;25209:371:1::0;60430:162:0::1;60608:70;::::0;;26961:25:1;;;27017:2;27002:18;;26995:34;;;60635:13:0;;60620;;60608:70:::1;::::0;26934:18:1;60608:70:0::1;;;;;;;60689:13;:29:::0;;;60729:12:::1;:28:::0;;;60768:13:::1;:30:::0;;;60809:10:::1;:23:::0;;;60865:31:::1;60705:13:::0;60744;60865:17:::1;:31::i;:::-;60853:9;:43:::0;-1:-1:-1;;;;60289:625:0:o;54330:260::-;1681:6;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;54431:22:::1;54442:10;54431;:22::i;:::-;54423:92;;;::::0;-1:-1:-1;;;54423:92:0;;15566:2:1;54423:92:0::1;::::0;::::1;15548:21:1::0;15605:2;15585:18;;;15578:30;15644:34;15624:18;;;15617:62;15715:27;15695:18;;;15688:55;15760:19;;54423:92:0::1;15538:247:1::0;54423:92:0::1;54524:15;::::0;:58:::1;::::0;-1:-1:-1;;;54524:58:0;;-1:-1:-1;;;;;6181:32:1;;;54524:58:0::1;::::0;::::1;6163:51:1::0;6257:14;;6250:22;6230:18;;;6223:50;54524:15:0;;::::1;::::0;:31:::1;::::0;6136:18:1;;54524:58:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;54330:260:::0;;:::o;54664:253::-;1681:6;;54745:4;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;17947:12;;54769:9:::1;:25;54761:85;;;::::0;-1:-1:-1;;;54761:85:0;;20723:2:1;54761:85:0::1;::::0;::::1;20705:21:1::0;20762:2;20742:18;;;20735:30;20801:34;20781:18;;;20774:62;-1:-1:-1;;;20852:18:1;;;20845:45;20907:19;;54761:85:0::1;20695:237:1::0;54761:85:0::1;-1:-1:-1::0;54857:18:0::1;:30:::0;54905:4:::1;::::0;54664:253::o;62786:152::-;62884:15;;:46;;-1:-1:-1;;;62884:46:0;;-1:-1:-1;;;;;5935:32:1;;;62884:46:0;;;5917:51:1;62858:7:0;;62884:15;;:38;;5890:18:1;;62884:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;67479:887::-;67588:4;67613:30;67624:18;67613:10;:30::i;:::-;67605:104;;;;-1:-1:-1;;;67605:104:0;;;;;;;:::i;:::-;67758:15;;-1:-1:-1;;;;;67728:46:0;;;67758:15;;67728:46;;67720:124;;;;-1:-1:-1;;;67720:124:0;;17827:2:1;67720:124:0;;;17809:21:1;17866:2;17846:18;;;17839:30;17905:34;17885:18;;;17878:62;17976:34;17956:18;;;17949:62;-1:-1:-1;;;18027:19:1;;;18020:32;18069:19;;67720:124:0;17799:295:1;67720:124:0;-1:-1:-1;;;;;67863:35:0;;67893:4;67863:35;;67855:137;;;;-1:-1:-1;;;67855:137:0;;;;;;;:::i;:::-;68012:34;68027:18;68012:14;:34::i;:::-;68011:35;68003:124;;;;-1:-1:-1;;;68003:124:0;;;;;;;:::i;:::-;68146:36;68163:18;68146:16;:36::i;:::-;:44;;68186:4;68146:44;68138:105;;;;-1:-1:-1;;;68138:105:0;;18723:2:1;68138:105:0;;;18705:21:1;18762:2;18742:18;;;18735:30;18801:34;18781:18;;;18774:62;-1:-1:-1;;;18852:18:1;;;18845:46;18908:19;;68138:105:0;18695:238:1;68138:105:0;68254:15;;:82;;-1:-1:-1;;;68254:82:0;;68285:10;68254:82;;;6819:34:1;-1:-1:-1;;;;;6889:15:1;;;6869:18;;;6862:43;6941:15;;;6921:18;;;6914:43;68254:15:0;;;;:30;;6754:18:1;;68254:82:0;6736:227:1;56301:158:0;1681:6;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;56395:15:::1;::::0;:56:::1;::::0;-1:-1:-1;;;56395:56:0;;::::1;::::0;::::1;26164:25:1::0;;;-1:-1:-1;;;;;56395:15:0;;::::1;::::0;:37:::1;::::0;26137:18:1;;56395:56:0::1;26119:76:1::0;62950:153:0;63047:15;;:48;;-1:-1:-1;;;63047:48:0;;-1:-1:-1;;;;;5935:32:1;;;63047:48:0;;;5917:51:1;63024:4:0;;63047:15;;:40;;5890:18:1;;63047:48:0;5872:102:1;68899:1611:0;68960:4;68977:27;69007:30;69026:10;69007:18;:30::i;:::-;69104:10;69079:36;;;;:24;:36;;;;;;68977:60;;-1:-1:-1;69079:51:0;;69120:9;69079:40;:51::i;:::-;69056:19;:74;;69048:151;;;;;-1:-1:-1;;;69048:151:0;;25787:2:1;69048:151:0;;;25769:21:1;25806:18;;;25799:30;;;;25865:34;25845:18;;;25838:62;25936:34;25916:18;;;25909:62;25988:19;;69048:151:0;25759:254:1;69048:151:0;69354:16;;;69368:1;69354:16;;;;;;;;69240:9;;69220:17;;69354:16;69368:1;69354:16;;;;;;;;-1:-1:-1;;69391:15:0;;:22;;;-1:-1:-1;;;69391:22:0;;;;69330:40;;-1:-1:-1;;;;;;69391:15:0;;;;:20;;-1:-1:-1;69391:22:0;;;;;;;;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69381:4;69386:1;69381:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;69381:32:0;;;-1:-1:-1;;;;;69381:32:0;;;;;69442:4;69424;69429:1;69424:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;69424:23:0;;;:7;;;;;;;;;;:23;69688:10;69663:36;;;;:24;:36;;;;;;;:51;;69704:9;69663:40;:51::i;:::-;69649:10;69624:36;;;;:24;:36;;;;;;;;:90;;;;69756:19;:31;;;;;;;;-1:-1:-1;;69940:38:0;;;;;;69999:15;;69756:31;;;;;-1:-1:-1;;;;;69999:15:0;;;;:66;;70073:9;;70234:4;;70287:21;:15;70305:3;70287:21;:::i;:::-;69999:320;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;70360:10:0;70340:31;;;;:19;:31;;;;;;:47;;-1:-1:-1;;70340:47:0;;;;;;;70440:40;70470:9;;-1:-1:-1;70360:10:0;;-1:-1:-1;70440:40:0;;-1:-1:-1;70340:31:0;70440:40;70498:4;70491:11;;;;;;68899:1611;:::o;63115:156::-;63215:15;;:48;;-1:-1:-1;;;63215:48:0;;-1:-1:-1;;;;;5935:32:1;;;63215:48:0;;;5917:51:1;63189:7:0;;63215:15;;:41;;5890:18:1;;63215:48:0;5872:102:1;66102:141:0;66193:15;;:42;;-1:-1:-1;;;66193:42:0;;-1:-1:-1;;;;;5935:32:1;;;66193:42:0;;;5917:51:1;66167:7:0;;66193:15;;:34;;5890:18:1;;66193:42:0;5872:102:1;58994:373:0;1681:6;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;59113:15:::1;::::0;-1:-1:-1;;;;;59091:37:0;;::::1;59113:15:::0;::::1;59091:37;;59083:102;;;::::0;-1:-1:-1;;;59083:102:0;;24055:2:1;59083:102:0::1;::::0;::::1;24037:21:1::0;24094:2;24074:18;;;24067:30;24133:34;24113:18;;;24106:62;-1:-1:-1;;;24184:18:1;;;24177:50;24244:19;;59083:102:0::1;24027:242:1::0;59083:102:0::1;59196:41;59212:18;59232:4;59196:15;:41::i;:::-;59296:15;::::0;59253:59:::1;::::0;-1:-1:-1;;;;;59296:15:0;;::::1;::::0;59253:59;::::1;::::0;::::1;::::0;59296:15:::1;::::0;59253:59:::1;59323:15;:36:::0;;-1:-1:-1;;;;;;59323:36:0::1;-1:-1:-1::0;;;;;59323:36:0;;;::::1;::::0;;;::::1;::::0;;58994:373::o;63283:129::-;63365:15;;:39;;;-1:-1:-1;;;63365:39:0;;;;63338:7;;-1:-1:-1;;;;;63365:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;54972:98;1681:6;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;55034:20:::1;:28:::0;;-1:-1:-1;;55034:28:0::1;::::0;;54972:98::o;61498:160::-;1681:6;;61570:4;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;61586:15:::1;::::0;:42:::1;::::0;-1:-1:-1;;;61586:42:0;;::::1;::::0;::::1;26164:25:1::0;;;-1:-1:-1;;;;;61586:15:0;;::::1;::::0;:31:::1;::::0;26137:18:1;;61586:42:0::1;26119:76:1::0;65762:328:0;66042:15;;:40;;-1:-1:-1;;;66042:40:0;;;;;26164:25:1;;;65863:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66042:15:0;;;;:33;;26137:18:1;;66042:40:0;26119:76:1;2414:244:0;1681:6;;-1:-1:-1;;;;;1681:6:0;;;;;709:10;1681:22;1673:67;;;;-1:-1:-1;;;1673:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2503:22:0;::::1;2495:73;;;::::0;-1:-1:-1;;;2495:73:0;;12629:2:1;2495:73:0::1;::::0;::::1;12611:21:1::0;12668:2;12648:18;;;12641:30;12707:34;12687:18;;;12680:62;-1:-1:-1;;;12758:18:1;;;12751:36;12804:19;;2495:73:0::1;12601:228:1::0;2495:73:0::1;2605:6;::::0;2584:38:::1;::::0;-1:-1:-1;;;;;2584:38:0;;::::1;::::0;2605:6:::1;::::0;::::1;;::::0;2584:38:::1;::::0;;;::::1;2633:6;:17:::0;;-1:-1:-1;;;;;2633:17:0;;::::1;;;-1:-1:-1::0;;;;;;2633:17:0;;::::1;::::0;;;::::1;::::0;;2414:244::o;68439:134::-;68499:15;;:44;;-1:-1:-1;;;68499:44:0;;68532:10;68499:44;;;5917:51:1;68483:4:0;;-1:-1:-1;;;;;68499:15:0;;:32;;5890:18:1;;68499:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68561:4;68554:11;;68439:134;:::o;11378:181::-;11436:7;;11468:5;11472:1;11468;:5;:::i;:::-;11456:17;;11497:1;11492;:6;;11484:46;;;;-1:-1:-1;;;11484:46:0;;13439:2:1;11484:46:0;;;13421:21:1;13478:2;13458:18;;;13451:30;13517:29;13497:18;;;13490:57;13564:18;;11484:46:0;13411:177:1;24228:380:0;-1:-1:-1;;;;;24364:19:0;;24356:68;;;;-1:-1:-1;;;24356:68:0;;22805:2:1;24356:68:0;;;22787:21:1;22844:2;22824:18;;;22817:30;22883:34;22863:18;;;22856:62;-1:-1:-1;;;22934:18:1;;;22927:34;22978:19;;24356:68:0;22777:226:1;24356:68:0;-1:-1:-1;;;;;24443:21:0;;24435:68;;;;-1:-1:-1;;;24435:68:0;;13036:2:1;24435:68:0;;;13018:21:1;13075:2;13055:18;;;13048:30;13114:34;13094:18;;;13087:62;-1:-1:-1;;;13165:18:1;;;13158:32;13207:19;;24435:68:0;13008:224:1;24435:68:0;-1:-1:-1;;;;;24516:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;24568:32;;26164:25:1;;;24568:32:0;;26137:18:1;24568:32:0;;;;;;;;24228:380;;;:::o;11842:136::-;11900:7;11927:43;11931:1;11934;11927:43;;;;;;;;;;;;;;;;;:3;:43::i;13679:132::-;13737:7;13764:39;13768:1;13771;13764:39;;;;;;;;;;;;;;;;;:3;:39::i;12732:471::-;12790:7;13035:6;13031:47;;-1:-1:-1;13065:1:0;13058:8;;13031:47;13090:9;13102:5;13106:1;13102;:5;:::i;:::-;13090:17;-1:-1:-1;13135:1:0;13126:5;13130:1;13090:17;13126:5;:::i;:::-;:10;13118:56;;;;-1:-1:-1;;;13118:56:0;;19140:2:1;13118:56:0;;;19122:21:1;19179:2;19159:18;;;19152:30;19218:34;19198:18;;;19191:62;-1:-1:-1;;;19269:18:1;;;19262:31;19310:19;;13118:56:0;19112:223:1;71477:5388:0;-1:-1:-1;;;;;71609:18:0;;71601:68;;;;-1:-1:-1;;;71601:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;71688:16:0;;71680:64;;;;-1:-1:-1;;;71680:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;71764:21:0;;;;;;:17;:21;;;;;;;;71763:22;;:50;;-1:-1:-1;;;;;;71790:23:0;;;;;;:17;:23;;;;;;;;71789:24;71763:50;71755:97;;;;-1:-1:-1;;;71755:97:0;;24834:2:1;71755:97:0;;;24816:21:1;24873:2;24853:18;;;24846:30;24912:34;24892:18;;;24885:62;-1:-1:-1;;;24963:18:1;;;24956:32;25005:19;;71755:97:0;24806:224:1;71755:97:0;71877:16;;;;71873:153;;-1:-1:-1;;;;;71918:28:0;;;;;;:24;:28;;;;;;;;;:62;;-1:-1:-1;;;;;;71950:30:0;;;;;;:24;:30;;;;;;;;71918:62;71910:104;;;;-1:-1:-1;;;71910:104:0;;24476:2:1;71910:104:0;;;24458:21:1;24515:2;24495:18;;;24488:30;24554:31;24534:18;;;24527:59;24603:18;;71910:104:0;24448:179:1;71910:104:0;-1:-1:-1;;;;;72049:29:0;;;;;;:25;:29;;;;;;;;:50;;;;-1:-1:-1;72083:16:0;;;;72082:17;72049:50;:84;;;;-1:-1:-1;;;;;;72103:30:0;;;;;;:24;:30;;;;;;;;72049:84;72046:244;;;1534:6;;-1:-1:-1;;;;;72159:15:0;;;1534:6;;;;;72159:15;;:32;;-1:-1:-1;1534:6:0;;-1:-1:-1;;;;;72178:13:0;;;1534:6;;;;;72178:13;72159:32;72158:68;;;-1:-1:-1;;;;;;72196:30:0;;;;;;:24;:30;;;;;;;;72158:68;72150:128;;;;-1:-1:-1;;;72150:128:0;;19542:2:1;72150:128:0;;;19524:21:1;19581:2;19561:18;;;19554:30;19620:34;19600:18;;;19593:62;-1:-1:-1;;;19671:18:1;;;19664:45;19726:19;;72150:128:0;19514:237:1;72150:128:0;72426:11;72423:92;;72454:28;72470:4;72476:2;72480:1;72454:15;:28::i;:::-;71477:5388;;;:::o;72423:92::-;72663:20;;;;72659:420;;;1534:6;;-1:-1:-1;;;;;72703:13:0;;;1534:6;;;;;72703:13;;;;:47;;-1:-1:-1;72734:15:0;;-1:-1:-1;;;;;72720:30:0;;;72734:15;;72720:30;;72703:47;:79;;;;;72768:13;-1:-1:-1;;;;;72754:28:0;:2;-1:-1:-1;;;;;72754:28:0;;;72703:79;:107;;;;-1:-1:-1;;;;;;72787:23:0;;;;;;:19;:23;;;;;;;;72786:24;72703:107;:137;;;;-1:-1:-1;;;;;;72815:25:0;;;;;;:19;:25;;;;;;;;72814:26;72703:137;72699:369;;;-1:-1:-1;;;;;72868:32:0;;;;;;:28;:32;;;;;;72903:15;-1:-1:-1;72860:123:0;;;;-1:-1:-1;;;72860:123:0;;21551:2:1;72860:123:0;;;21533:21:1;21590:2;21570:18;;;21563:30;21629:34;21609:18;;;21602:62;21700:30;21680:18;;;21673:58;21748:19;;72860:123:0;21523:250:1;72860:123:0;-1:-1:-1;;;;;73002:32:0;;;;;;:28;:32;;;;;73037:15;73002:50;;72699:369;73182:14;73193:2;73182:10;:14::i;:::-;73181:15;:43;;;;-1:-1:-1;;;;;;73201:23:0;;;;;;:19;:23;;;;;;;;73200:24;73181:43;73178:182;;;-1:-1:-1;;;;;73243:23:0;;;;;;:19;:23;;;;;;73240:109;;-1:-1:-1;;;;;73291:23:0;;;;:19;:23;;73240:109;73596:14;73607:2;73596:10;:14::i;:::-;73595:15;:50;;;;-1:-1:-1;;;;;;73614:31:0;;;;;;:25;:31;;;;;;;;73595:50;:78;;;;-1:-1:-1;;;;;;73650:23:0;;;;;;:19;:23;;;;;;;;73649:24;73595:78;73592:295;;;-1:-1:-1;;;;;73692:23:0;;;;;;:19;:23;;;;;;73719:15;-1:-1:-1;73689:187:0;;-1:-1:-1;;;;;73828:23:0;;;;;;:19;:23;;;;;;73780:80;;73808:51;;73857:1;;73808:44;;:15;;:19;:44::i;:51::-;-1:-1:-1;;;;;73780:23:0;;;;;;:19;:23;;;;;;;:27;:80::i;:::-;-1:-1:-1;;;;;73754:23:0;;;;;;:19;:23;;;;;:106;73689:187;-1:-1:-1;;;;;73903:29:0;;;;;;:25;:29;;;;;;;;73900:285;;;73958:24;;73948:6;:34;;73940:77;;;;-1:-1:-1;;;73940:77:0;;23696:2:1;73940:77:0;;;23678:21:1;23735:2;23715:18;;;23708:30;23774:32;23754:18;;;23747:60;23824:18;;73940:77:0;23668:180:1;73940:77:0;74033:36;74065:3;74033:27;74044:15;;74033:6;:10;;:27;;;;:::i;:36::-;74024:45;;73900:285;74246:4;74197:28;18131:18;;;;;;;;;;;74312;;74288:42;;;;;;;74360:33;;-1:-1:-1;74385:8:0;;-1:-1:-1;;;74385:8:0;;;;74384:9;74360:33;:73;;;;-1:-1:-1;74410:23:0;;;;;;;74360:73;:122;;;;-1:-1:-1;;;;;;74451:31:0;;;;;;:25;:31;;;;;;;;74450:32;74360:122;:162;;;;-1:-1:-1;74507:15:0;;-1:-1:-1;;;;;74499:23:0;;;74507:15;;74499:23;;74360:162;:200;;;;-1:-1:-1;74545:15:0;;-1:-1:-1;;;;;74539:21:0;;;74545:15;;74539:21;;74360:200;:241;;;;-1:-1:-1;74585:16:0;;-1:-1:-1;;;;;74577:24:0;;;74585:16;;74577:24;;74360:241;:280;;;;-1:-1:-1;74624:16:0;;-1:-1:-1;;;;;74618:22:0;;;74624:16;;74618:22;;74360:280;:318;;;;-1:-1:-1;74665:13:0;;-1:-1:-1;;;;;74657:21:0;;;74665:13;;74657:21;;74360:318;:354;;;;-1:-1:-1;74701:13:0;;-1:-1:-1;;;;;74695:19:0;;;74701:13;;74695:19;;74360:354;:395;;;;-1:-1:-1;;;;;;74732:23:0;;;;;;:19;:23;;;;;;;;74731:24;74360:395;:438;;;;-1:-1:-1;;;;;;74773:25:0;;;;;;:19;:25;;;;;;;;74772:26;74360:438;:476;;;;-1:-1:-1;;;;;;74815:21:0;;74831:4;74815:21;;74360:476;:525;;;;-1:-1:-1;74869:15:0;;-1:-1:-1;;;;;74853:32:0;;;74869:15;;74853:32;;74360:525;74343:884;;;74914:8;:15;;-1:-1:-1;;;;74914:15:0;-1:-1:-1;;;74914:15:0;;;75022:9;;74914:8;75004:12;74914:15;;74979:53;;:38;;:20;;:24;:38::i;:53::-;74958:74;;75047:26;75062:10;75047:14;:26::i;:::-;75129:4;75090:18;18131;;;;;;;;;;;75150:32;18131:18;75150:20;:32::i;:::-;-1:-1:-1;;75199:8:0;:16;;-1:-1:-1;;;;75199:16:0;;;74343:884;75257:8;;-1:-1:-1;;;;;75366:25:0;;75241:12;75366:25;;;:19;:25;;;;;;75257:8;-1:-1:-1;;;75257:8:0;;;;;75256:9;;75366:25;;:52;;-1:-1:-1;;;;;;75395:23:0;;;;;;:19;:23;;;;;;;;75366:52;:77;;;-1:-1:-1;;;;;;75422:21:0;;75438:4;75422:21;75366:77;75363:124;;;-1:-1:-1;75470:5:0;75363:124;75502:7;75499:779;;;75540:12;75555:30;75581:3;75555:21;75566:9;;75555:6;:10;;:21;;;;:::i;:30::-;-1:-1:-1;;;;;75720:29:0;;;;;;:25;:29;;;;;;75540:45;;-1:-1:-1;75720:29:0;;75717:449;;;75770:21;75794:68;75858:3;75794:59;75833:19;75794:34;75824:3;75794:25;75805:13;;75794:6;:10;;:25;;;;:::i;:34::-;:38;;:59::i;:68::-;75770:92;;75881:20;75904:73;75973:3;75904:64;75942:25;75962:4;75942:19;:25::i;:::-;75904:33;75933:3;75904:24;75915:12;;75904:6;:10;;:24;;;;:::i;:73::-;75881:96;-1:-1:-1;76005:31:0;:13;75881:96;76005:17;:31::i;:::-;-1:-1:-1;;;;;76055:25:0;;;;;;:19;:25;;;;;76083:15;76055:43;;75998:38;-1:-1:-1;;;75717:449:0;76191:16;:6;76202:4;76191:10;:16::i;:::-;76182:25;;76224:42;76240:4;76254;76261;76224:15;:42::i;:::-;75511:767;75499:779;76290:33;76306:4;76312:2;76316:6;76290:15;:33::i;:::-;76340:15;;-1:-1:-1;;;;;76340:15:0;:26;76375:4;76382:15;76375:4;-1:-1:-1;;;;;18131:18:0;18104:7;18131:18;;;;;;;;;;;;18030:127;76382:15;76340:58;;-1:-1:-1;;;;;;76340:58:0;;;;;;;-1:-1:-1;;;;;6492:32:1;;;76340:58:0;;;6474:51:1;6541:18;;;6534:34;6447:18;;76340:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76336:74;76424:15;;-1:-1:-1;;;;;76424:15:0;:26;76459:2;76464:13;76459:2;-1:-1:-1;;;;;18131:18:0;18104:7;18131:18;;;;;;;;;;;;18030:127;76464:13;76424:54;;-1:-1:-1;;;;;;76424:54:0;;;;;;;-1:-1:-1;;;;;6492:32:1;;;76424:54:0;;;6474:51:1;6541:18;;;6534:34;6447:18;;76424:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76420:70;76506:8;;-1:-1:-1;;;76506:8:0;;;;76502:356;;76545:16;;76582:15;;:28;;-1:-1:-1;;;;;;76582:28:0;;;;;26164:25:1;;;-1:-1:-1;;;;;76582:15:0;;;;:23;;26137:18:1;;76582:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76582:28:0;;;;;;;;-1:-1:-1;;76582:28:0;;;;;;;;;;;;:::i;:::-;;;76578:269;;;;;76708:86;;;27595:25:1;;;27651:2;27636:18;;27629:34;;;27679:18;;;27672:34;;;27737:2;27722:18;;27715:34;;;76784:9:0;;76773:4;;76708:86;;27582:3:1;27567:19;76708:86:0;;;;;;;76611:199;;;76578:269;76516:342;71590:5275;;;71477:5388;;;:::o;12281:192::-;12367:7;12403:12;12395:6;;;;12387:29;;;;-1:-1:-1;;;12387:29:0;;;;;;;;:::i;:::-;-1:-1:-1;12427:9:0;12439:5;12443:1;12439;:5;:::i;:::-;12427:17;12281:192;-1:-1:-1;;;;;12281:192:0:o;81336:120::-;81413:16;;81405:42;;-1:-1:-1;;;;;81413:16:0;;;;81405:42;;;;;81440:6;;81413:16;81405:42;81413:16;81405:42;81440:6;81413:16;81405:42;;;;;;;;;;;;;;;;;;;62155:619;62215:4;62683:20;;62526:66;62723:23;;;;;;:42;;-1:-1:-1;62750:15:0;;;62723:42;62715:51;62155:619;-1:-1:-1;;;;62155:619:0:o;71060:405::-;-1:-1:-1;;;;;71151:31:0;;;;;;:25;:31;;;;;;;;:40;;;;;;;71143:117;;;;;-1:-1:-1;;;71143:117:0;;13795:2:1;71143:117:0;;;13777:21:1;13814:18;;;13807:30;;;;13873:34;13853:18;;;13846:62;13944:34;13924:18;;;13917:62;13996:19;;71143:117:0;13767:254:1;71143:117:0;-1:-1:-1;;;;;71271:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;71271:39:0;;;;;;;;;;;;71323:79;;71348:15;;:42;;-1:-1:-1;;;71348:42:0;;-1:-1:-1;;;;;5935:32:1;;;71348:42:0;;;5917:51:1;71348:15:0;;;;:36;;5890:18:1;;71348:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71323:79;71417:40;;;;;;-1:-1:-1;;;;;71417:40:0;;;;;;;;71060:405;;:::o;14307:278::-;14393:7;14428:12;14421:5;14413:28;;;;-1:-1:-1;;;14413:28:0;;;;;;;;:::i;:::-;-1:-1:-1;14452:9:0;14464:5;14468:1;14464;:5;:::i;21801:573::-;-1:-1:-1;;;;;21941:20:0;;21933:70;;;;-1:-1:-1;;;21933:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22022:23:0;;22014:71;;;;-1:-1:-1;;;22014:71:0;;;;;;;:::i;:::-;22178;22200:6;22178:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22178:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;22158:17:0;;;:9;:17;;;;;;;;;;;:91;;;;22283:20;;;;;;;:32;;22308:6;22283:24;:32::i;:::-;-1:-1:-1;;;;;22260:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;22331:35;26164:25:1;;;22260:20:0;;22331:35;;;;;;26137:18:1;22331:35:0;26119:76:1;76873:2716:0;76945:12;;:16;76942:2640;;77238:12;;77194:26;;77238:16;77235:216;;77295:77;77359:12;;77295:59;77306:47;77323:29;77338:13;;77323:10;;:14;;:29;;;;:::i;:::-;77306:12;;;:16;:47::i;:::-;77295:6;;:10;:59::i;:77::-;77274:98;;77235:216;;;-1:-1:-1;77434:1:0;77235:216;77479:37;77519:30;:6;77530:18;77519:10;:30::i;:::-;77479:70;-1:-1:-1;77578:12:0;77593:25;:18;77616:1;77593:22;:25::i;:::-;77578:40;-1:-1:-1;77633:17:0;77653:28;:18;77578:40;77653:22;:28::i;:::-;77633:48;-1:-1:-1;78008:21:0;78086:22;78103:4;78086:16;:22::i;:::-;78251:18;78272:41;:21;78298:14;78272:25;:41::i;:::-;78251:62;;78375:35;78388:9;78399:10;78375:12;:35::i;:::-;78439:47;78456:29;78439:16;:47::i;:::-;78501:38;78542:41;:21;78568:14;78542:25;:41::i;:::-;78501:82;;78612:12;78672:1;78656:13;;:17;78653:417;;;78747:25;78775:84;78829:29;78844:13;;78829:10;;:14;;:29;;;;:::i;:::-;78810:13;;78775:49;;:30;;:34;:49::i;:84::-;78899:16;;78891:60;;78747:112;;-1:-1:-1;;;;;;78899:16:0;;78747:112;;78891:60;;;;78747:112;78899:16;78891:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78878:73;;;;;78978:7;78970:84;;;;;-1:-1:-1;;;78970:84:0;;14228:2:1;78970:84:0;;;14210:21:1;14247:18;;;14240:30;;;;14306:34;14286:18;;;14279:62;14377:34;14357:18;;;14350:62;14429:19;;78970:84:0;14200:254:1;78970:84:0;78674:396;78653:417;79101:10;;:14;79098:396;;79186:22;79211:81;79262:29;79277:13;;79262:10;;:14;;:29;;;;:::i;:::-;79246:10;;79211:46;;:30;;:34;:46::i;:81::-;79332:13;;79324:54;;79186:106;;-1:-1:-1;;;;;;79332:13:0;;79186:106;;79324:54;;;;79186:106;79332:13;79324:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79311:67;;;;;79405:7;79397:81;;;;-1:-1:-1;;;79397:81:0;;12199:2:1;79397:81:0;;;12181:21:1;12238:2;12218:18;;;12211:30;12277:34;12257:18;;;12250:62;12348:31;12328:18;;;12321:59;12397:19;;79397:81:0;12171:251:1;79397:81:0;79116:378;79098:396;79527:43;;;27242:25:1;;;27298:2;27283:18;;27276:34;;;27326:18;;;27319:34;;;79527:43:0;;27230:2:1;27215:18;79527:43:0;;;;;;;76962:2620;;;;;;;;76873:2716;:::o;80765:317::-;80830:24;80847:6;80830:16;:24::i;:::-;80943:15;;80935:51;;80885:21;;80865:17;;-1:-1:-1;;;;;80943:15:0;;;;80885:21;;80865:17;80935:51;80865:17;80935:51;80885:21;80943:15;80935:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80917:69;;;81002:7;80999:76;;;81031:32;;;26961:25:1;;;27017:2;27002:18;;26995:34;;;81031:32:0;;26934:18:1;81031:32:0;26916:119:1;79597:611:0;79759:16;;;79773:1;79759:16;;;;;;;;79735:21;;79759:16;;;;;;;;;;-1:-1:-1;79759:16:0;79735:40;;79804:4;79786;79791:1;79786:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;79786:23:0;;;:7;;;;;;;;;;:23;;;;79830:15;;:22;;;-1:-1:-1;;;79830:22:0;;;;:15;;;;;:20;;:22;;;;;79786:7;;79830:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;79820:4;79825:1;79820:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;79820:32:0;;;:7;;;;;;;;;:32;79897:15;;79865:62;;79882:4;;79897:15;79915:11;79865:8;:62::i;:::-;79966:15;;:224;;-1:-1:-1;;;79966:224:0;;-1:-1:-1;;;;;79966:15:0;;;;:66;;:224;;80047:11;;79966:15;;80117:4;;80144;;80164:15;;79966:224;;;:::i;80216:541::-;80406:15;;80374:62;;80391:4;;-1:-1:-1;;;;;80406:15:0;80424:11;80374:8;:62::i;:::-;80479:15;;80683;;80479:260;;-1:-1:-1;;;80479:260:0;;80551:4;80479:260;;;8304:34:1;8354:18;;;8347:34;;;80479:15:0;8397:18:1;;;8390:34;;;8440:18;;;8433:34;-1:-1:-1;;;;;80683:15:0;;;8483:19:1;;;8476:44;80713:15:0;8536:19:1;;;8529:35;80479:15:0;;;:31;;80518:9;;8238:19:1;;80479:260:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14:247:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;142:1;139;132:12;94:2;181:9;168:23;200:31;225:5;200:31;:::i;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:2;;;405:1;402;395:12;357:2;437:9;431:16;456:31;481:5;456:31;:::i;522:388::-;590:6;598;651:2;639:9;630:7;626:23;622:32;619:2;;;667:1;664;657:12;619:2;706:9;693:23;725:31;750:5;725:31;:::i;:::-;775:5;-1:-1:-1;832:2:1;817:18;;804:32;845:33;804:32;845:33;:::i;:::-;897:7;887:17;;;609:301;;;;;:::o;915:456::-;992:6;1000;1008;1061:2;1049:9;1040:7;1036:23;1032:32;1029:2;;;1077:1;1074;1067:12;1029:2;1116:9;1103:23;1135:31;1160:5;1135:31;:::i;:::-;1185:5;-1:-1:-1;1242:2:1;1227:18;;1214:32;1255:33;1214:32;1255:33;:::i;:::-;1019:352;;1307:7;;-1:-1:-1;;;1361:2:1;1346:18;;;;1333:32;;1019:352::o;1376:382::-;1441:6;1449;1502:2;1490:9;1481:7;1477:23;1473:32;1470:2;;;1518:1;1515;1508:12;1470:2;1557:9;1544:23;1576:31;1601:5;1576:31;:::i;:::-;1626:5;-1:-1:-1;1683:2:1;1668:18;;1655:32;1696:30;1655:32;1696:30;:::i;1763:681::-;1894:6;1902;1910;1918;1926;1934;1942;1950;2003:3;1991:9;1982:7;1978:23;1974:33;1971:2;;;2020:1;2017;2010:12;1971:2;2052:9;2046:16;2071:31;2096:5;2071:31;:::i;:::-;2121:5;2111:15;;;2166:2;2155:9;2151:18;2145:25;2135:35;;2210:2;2199:9;2195:18;2189:25;2179:35;;2254:2;2243:9;2239:18;2233:25;2223:35;;2298:3;2287:9;2283:19;2277:26;2267:36;;2343:3;2332:9;2328:19;2322:26;2312:36;;2388:3;2377:9;2373:19;2367:26;2357:36;;2433:3;2422:9;2418:19;2412:26;2402:36;;1961:483;;;;;;;;;;;:::o;2449:315::-;2517:6;2525;2578:2;2566:9;2557:7;2553:23;2549:32;2546:2;;;2594:1;2591;2584:12;2546:2;2633:9;2620:23;2652:31;2677:5;2652:31;:::i;:::-;2702:5;2754:2;2739:18;;;;2726:32;;-1:-1:-1;;;2536:228:1:o;2769:750::-;2861:6;2869;2877;2930:2;2918:9;2909:7;2905:23;2901:32;2898:2;;;2946:1;2943;2936:12;2898:2;2986:9;2973:23;3015:18;3056:2;3048:6;3045:14;3042:2;;;3072:1;3069;3062:12;3042:2;3110:6;3099:9;3095:22;3085:32;;3155:7;3148:4;3144:2;3140:13;3136:27;3126:2;;3177:1;3174;3167:12;3126:2;3217;3204:16;3243:2;3235:6;3232:14;3229:2;;;3259:1;3256;3249:12;3229:2;3314:7;3307:4;3297:6;3294:1;3290:14;3286:2;3282:23;3278:34;3275:47;3272:2;;;3335:1;3332;3325:12;3272:2;3366:4;3358:13;;;;-1:-1:-1;3390:6:1;-1:-1:-1;;3431:20:1;;3418:34;3461:28;3418:34;3461:28;:::i;:::-;3508:5;3498:15;;;2888:631;;;;;:::o;3524:241::-;3580:6;3633:2;3621:9;3612:7;3608:23;3604:32;3601:2;;;3649:1;3646;3639:12;3601:2;3688:9;3675:23;3707:28;3729:5;3707:28;:::i;3770:245::-;3837:6;3890:2;3878:9;3869:7;3865:23;3861:32;3858:2;;;3906:1;3903;3896:12;3858:2;3938:9;3932:16;3957:28;3979:5;3957:28;:::i;4020:180::-;4079:6;4132:2;4120:9;4111:7;4107:23;4103:32;4100:2;;;4148:1;4145;4138:12;4100:2;-1:-1:-1;4171:23:1;;4090:110;-1:-1:-1;4090:110:1:o;4205:184::-;4275:6;4328:2;4316:9;4307:7;4303:23;4299:32;4296:2;;;4344:1;4341;4334:12;4296:2;-1:-1:-1;4367:16:1;;4286:103;-1:-1:-1;4286:103:1:o;4394:306::-;4482:6;4490;4498;4551:2;4539:9;4530:7;4526:23;4522:32;4519:2;;;4567:1;4564;4557:12;4519:2;4596:9;4590:16;4580:26;;4646:2;4635:9;4631:18;4625:25;4615:35;;4690:2;4679:9;4675:18;4669:25;4659:35;;4509:191;;;;;:::o;4705:385::-;4791:6;4799;4807;4815;4868:3;4856:9;4847:7;4843:23;4839:33;4836:2;;;4885:1;4882;4875:12;4836:2;-1:-1:-1;;4908:23:1;;;4978:2;4963:18;;4950:32;;-1:-1:-1;5029:2:1;5014:18;;5001:32;;5080:2;5065:18;5052:32;;-1:-1:-1;4826:264:1;-1:-1:-1;4826:264:1:o;5095:461::-;5148:3;5186:5;5180:12;5213:6;5208:3;5201:19;5239:4;5268:2;5263:3;5259:12;5252:19;;5305:2;5298:5;5294:14;5326:1;5336:195;5350:6;5347:1;5344:13;5336:195;;;5415:13;;-1:-1:-1;;;;;5411:39:1;5399:52;;5471:12;;;;5506:15;;;;5447:1;5365:9;5336:195;;;-1:-1:-1;5547:3:1;;5156:400;-1:-1:-1;;;;;5156:400:1:o;8575:794::-;8797:2;8809:21;;;8782:18;;8865:22;;;8749:4;8944:6;8918:2;8903:18;;8749:4;8978:304;8992:6;8989:1;8986:13;8978:304;;;9067:6;9054:20;9087:31;9112:5;9087:31;:::i;:::-;-1:-1:-1;;;;;9143:31:1;9131:44;;9198:4;9257:15;;;;9222:12;;;;9171:1;9007:9;8978:304;;;8982:3;9299;9291:11;;;;9354:6;9347:14;9340:22;9333:4;9322:9;9318:20;9311:52;8758:611;;;;;;:::o;10047:510::-;10318:6;10307:9;10300:25;10361:3;10356:2;10345:9;10341:18;10334:31;10281:4;10382:57;10434:3;10423:9;10419:19;10411:6;10382:57;:::i;:::-;-1:-1:-1;;;;;10475:32:1;;;;10470:2;10455:18;;10448:60;-1:-1:-1;10539:2:1;10524:18;10517:34;10374:65;10290:267;-1:-1:-1;;10290:267:1:o;10562:597::-;10674:4;10703:2;10732;10721:9;10714:21;10764:6;10758:13;10807:6;10802:2;10791:9;10787:18;10780:34;10832:1;10842:140;10856:6;10853:1;10850:13;10842:140;;;10951:14;;;10947:23;;10941:30;10917:17;;;10936:2;10913:26;10906:66;10871:10;;10842:140;;;11000:6;10997:1;10994:13;10991:2;;;11070:1;11065:2;11056:6;11045:9;11041:22;11037:31;11030:42;10991:2;-1:-1:-1;11143:2:1;11122:15;-1:-1:-1;;11118:29:1;11103:45;;;;11150:2;11099:54;;10683:476;-1:-1:-1;;;10683:476:1:o;11164:399::-;11366:2;11348:21;;;11405:2;11385:18;;;11378:30;11444:34;11439:2;11424:18;;11417:62;-1:-1:-1;;;11510:2:1;11495:18;;11488:33;11553:3;11538:19;;11338:225::o;15790:425::-;15992:2;15974:21;;;16031:2;16011:18;;;16004:30;16070:34;16065:2;16050:18;;16043:62;16141:31;16136:2;16121:18;;16114:59;16205:3;16190:19;;15964:251::o;16220:493::-;16422:2;16404:21;;;16461:2;16441:18;;;16434:30;16500:34;16495:2;16480:18;;16473:62;16571:34;16566:2;16551:18;;16544:62;16643:27;16637:3;16622:19;;16615:56;16703:3;16688:19;;16394:319::o;17140:480::-;17342:2;17324:21;;;17381:2;17361:18;;;17354:30;17420:34;17415:2;17400:18;;17393:62;17491:34;17486:2;17471:18;;17464:62;-1:-1:-1;;;17557:3:1;17542:19;;17535:43;17610:3;17595:19;;17314:306::o;19756:356::-;19958:2;19940:21;;;19977:18;;;19970:30;20036:34;20031:2;20016:18;;20009:62;20103:2;20088:18;;19930:182::o;21778:401::-;21980:2;21962:21;;;22019:2;21999:18;;;21992:30;22058:34;22053:2;22038:18;;22031:62;-1:-1:-1;;;22124:2:1;22109:18;;22102:35;22169:3;22154:19;;21952:227::o;26200:582::-;26499:6;26488:9;26481:25;26542:6;26537:2;26526:9;26522:18;26515:34;26585:3;26580:2;26569:9;26565:18;26558:31;26462:4;26606:57;26658:3;26647:9;26643:19;26635:6;26606:57;:::i;:::-;-1:-1:-1;;;;;26699:32:1;;;;26694:2;26679:18;;26672:60;-1:-1:-1;26763:3:1;26748:19;26741:35;26598:65;26471:311;-1:-1:-1;;;26471:311:1:o;27949:128::-;27989:3;28020:1;28016:6;28013:1;28010:13;28007:2;;;28026:18;;:::i;:::-;-1:-1:-1;28062:9:1;;27997:80::o;28082:217::-;28122:1;28148;28138:2;;28192:10;28187:3;28183:20;28180:1;28173:31;28227:4;28224:1;28217:15;28255:4;28252:1;28245:15;28138:2;-1:-1:-1;28284:9:1;;28128:171::o;28304:168::-;28344:7;28410:1;28406;28402:6;28398:14;28395:1;28392:21;28387:1;28380:9;28373:17;28369:45;28366:2;;;28417:18;;:::i;:::-;-1:-1:-1;28457:9:1;;28356:116::o;28477:125::-;28517:4;28545:1;28542;28539:8;28536:2;;;28550:18;;:::i;:::-;-1:-1:-1;28587:9:1;;28526:76::o;28607:380::-;28686:1;28682:12;;;;28729;;;28750:2;;28804:4;28796:6;28792:17;28782:27;;28750:2;28857;28849:6;28846:14;28826:18;28823:38;28820:2;;;28903:10;28898:3;28894:20;28891:1;28884:31;28938:4;28935:1;28928:15;28966:4;28963:1;28956:15;28820:2;;28662:325;;;:::o;28992:135::-;29031:3;-1:-1:-1;;29052:17:1;;29049:2;;;29072:18;;:::i;:::-;-1:-1:-1;29119:1:1;29108:13;;29039:88::o;29132:127::-;29193:10;29188:3;29184:20;29181:1;29174:31;29224:4;29221:1;29214:15;29248:4;29245:1;29238:15;29264:127;29325:10;29320:3;29316:20;29313:1;29306:31;29356:4;29353:1;29346:15;29380:4;29377:1;29370:15;29528:131;-1:-1:-1;;;;;29603:31:1;;29593:42;;29583:2;;29649:1;29646;29639:12;29664:118;29750:5;29743:13;29736:21;29729:5;29726:32;29716:2;;29772:1;29769;29762:12
Swarm Source
ipfs://6a5e4ba883fe5f68c6bb97b86ceb92709f57a1089f8b75610c7d89b58f4bf77d
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.