Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
MEME
Overview
Max Total Supply
100,000,000,000,000 SHARKIE
Holders
178 (0.00%)
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 9 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
Sharkie
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-06 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol /** * @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) { return msg.data; } } // source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeMath.sol // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @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) { return a + b; } /** * @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 a - b; } /** * @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) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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 a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting 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) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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) { unchecked { require(b > 0, errorMessage); return a % b; } } } // source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/proxy/Proxy.sol /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract 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() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "[sharkie][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 { _transferOwnership(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), "[sharkie][ownable] new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } 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; } 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; } // source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol /** * @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); } // source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ abstract contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } 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] + 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) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This 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); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(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 += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(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); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(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 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 {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } contract Sharkie is Context, IERC20, Ownable{ // lib using SafeMath for uint256; using Address for address; // addresses address public ADDRESS_PAIR; address public ADDRESS_BURN = 0x000000000000000000000000000000000000dEaD; address public ADDRESS_ROUTER = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; address public ADDRESS_ERC20_USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; address public ADDRESS_MARKETING = 0xfbe5dCF729C2dA5ef2536419cEe8f9F24C937164; address public ADDRESS_DEVELOPER = 0xF82352ce25e7B412C6eAdE7D8b38E1bc7CB703C4; address public ADDRESS_BUYBACK = 0x926a0F47d1faB46153dba2C1638156bb320b0c5D; // interfaces IUniswapV2Router02 private _router; IUniswapV2Pair private _pair; ERC20 private ERC20_NATIVE; ERC20 private ERC20_USDC; // taxes uint256 public TAXES_MARKETING; uint256 public TAXES_DEVELOPER; uint256 public TAXES_BUYBACK; uint16 public TAX_BUY_MARKETING = 50; uint16 public TAX_BUY_DEVELOPER = 40; uint16 public TAX_BUY_BUYBACK = 20; uint16 public TAX_SELL_MARKETING = 50; uint16 public TAX_SELL_DEVELOPER = 40; uint16 public TAX_SELL_BUYBACK = 40; uint16 public TAX24H_SELL_MARKETING = 160; uint16 public TAX24H_SELL_DEVELOPER = 30; uint16 public TAX24H_SELL_BUYBACK = 10; // limits uint16 public LIMIT_WALLET = 2; uint16 public LIMIT_TRANSACTION = 1; uint32 public LIMIT_MCAP = 777777; bool public LIMIT_ACTIVE; bool public LIMIT24H_ACTIVE; uint256 public LIMIT24H_END; // tokenomics string private _name = "Sharkie"; string private _symbol = "SHARKIE"; uint8 private _decimals = 9; uint256 private _totalSupply = 100000000000000 * (10**9); uint256 private _roundingPrecision = 10**18; // storage struct IndividualTax{ uint16 buyMarketing; uint16 buyDeveloper; uint16 buyBuyback; uint16 sellMarketing; uint16 sellDeveloper; uint16 sellBuyback; } bool private _tradingEnabled; bool private _liquidityProvided; bool private _swapping; mapping(address => uint256) private _balances; mapping(address => mapping (address => uint256)) private _allowances; mapping(address => bool) private _addressNoTaxes; mapping(address => bool) private _addressNoLimits; mapping(address => bool) private _addressAuthorized; mapping(address => IndividualTax) private _addressIndividualTax; mapping(address => bool) private _addressIndividualTaxes; // paths // token to native address[] public PATH_TOKEN_NATIVE = new address[](2); struct Taxes{ uint16 marketing; uint16 developer; uint16 buyback; uint256 totalMarketing; uint256 totalDeveloper; uint256 totalBuyback; uint256 total; bool buy; bool sell; } // modifiers modifier onlyAuthorized(){ require(_addressAuthorized[_msgSender()], "[sharkie] only authorized wallets can call this function!"); _; } modifier onlySwapOnce(){ _swapping = true; _; _swapping = false; } receive() external payable {} constructor(){ // token creation and dinstribution _balances[address(this)] = _totalSupply; // set interfaces _router = IUniswapV2Router02(ADDRESS_ROUTER); ADDRESS_PAIR = IUniswapV2Factory(_router.factory()).createPair(address(this), _router.WETH()); _pair = IUniswapV2Pair(ADDRESS_PAIR); _approve(address(this), address(_router), 2**256 - 1); ERC20_NATIVE = ERC20(_router.WETH()); ERC20_USDC = ERC20(ADDRESS_ERC20_USDC); // set no taxes _addressNoTaxes[address(this)] = true; _addressNoTaxes[ADDRESS_BURN] = true; _addressNoTaxes[ADDRESS_MARKETING] = true; _addressNoTaxes[ADDRESS_DEVELOPER] = true; _addressNoTaxes[ADDRESS_BUYBACK] = true; // set no limits _addressNoLimits[address(this)] = true; _addressNoLimits[ADDRESS_BURN] = true; _addressNoLimits[ADDRESS_MARKETING] = true; _addressNoLimits[ADDRESS_DEVELOPER] = true; _addressNoLimits[ADDRESS_BUYBACK] = true; // set authorization _addressAuthorized[_msgSender()] = true; _addressAuthorized[ADDRESS_MARKETING] = true; _addressAuthorized[ADDRESS_DEVELOPER] = true; _addressAuthorized[ADDRESS_BUYBACK] = true; // path PATH_TOKEN_NATIVE[0] = address(this); PATH_TOKEN_NATIVE[1] = _router.WETH(); } // owner // ███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗ // ╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝ function addLiquidity() public onlyAuthorized{ require(!_liquidityProvided, "[sharkie] liquidity can only be enabled once!"); _addLiquidity(); } function enableTrading() public onlyAuthorized{ require(!_tradingEnabled, "[sharkie] trading can only be enabled and not disabled!"); _tradingEnabled = true; LIMIT24H_END = block.timestamp + 86400; LIMIT_ACTIVE = true; LIMIT24H_ACTIVE = true; } function setLimit(bool pLimit) public onlyAuthorized{ LIMIT_ACTIVE = pLimit; } function setTaxes(uint16 pMarketing, uint16 pDeveloper, uint16 pBuyback, bool pBuy) public onlyAuthorized{ require((pMarketing + pDeveloper + pBuyback) <= 200, "[sharkie] sum of all taxes cant exceed 20%!"); if(pBuy){ TAX_BUY_MARKETING = pMarketing; TAX_BUY_DEVELOPER = pDeveloper; TAX_BUY_BUYBACK = pBuyback; }else{ TAX_SELL_MARKETING = pMarketing; TAX_SELL_DEVELOPER = pDeveloper; TAX_SELL_BUYBACK = pBuyback; } } function setAuthorized(address pAddress, bool pAuthorized) public onlyAuthorized{ _addressAuthorized[pAddress] = pAuthorized; } function setNoTaxes(address pAddress, bool pNoTaxes) public onlyAuthorized{ _addressNoTaxes[pAddress] = pNoTaxes; } function setNoLimits(address pAddress, bool pLimits) public onlyAuthorized{ _addressNoLimits[pAddress] = pLimits; } function setNo24h() public onlyAuthorized{ LIMIT24H_ACTIVE = false; } function enableIndividualTaxes(address pWallet, uint16 pMarketing, uint16 pDeveloper, uint16 pBuyback, bool pBuy) public onlyAuthorized{ _addressIndividualTaxes[pWallet] = true; _addressNoTaxes[pWallet] = false; IndividualTax storage _individualtaxes = _addressIndividualTax[pWallet]; if(pBuy){ _individualtaxes.buyMarketing = pMarketing; _individualtaxes.buyDeveloper = pDeveloper; _individualtaxes.buyBuyback= pBuyback; }else{ _individualtaxes.sellMarketing = pMarketing; _individualtaxes.sellDeveloper = pDeveloper; _individualtaxes.sellBuyback= pBuyback; } } function disableIndividualTaxes(address pWallet) public onlyAuthorized{ _addressIndividualTaxes[pWallet] = false; } function send(address pTo, uint256 pAmount) public onlyAuthorized{ require(pAmount <= (balanceOf(address(this)).sub(TAXES_MARKETING.add(TAXES_DEVELOPER).add(TAXES_BUYBACK))), "[sharkie] you cant send more tokens than the contract has!"); _transactionTokens(address(this), pTo, pAmount); } // public // ███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗ // ╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝ function name() public view returns(string memory) { return(_name); } function symbol() public view returns(string memory) { return(_symbol); } function decimals() public view returns(uint8){ return(_decimals); } function totalSupply() public view override returns(uint256){ return(_totalSupply); } function balanceOf(address account) public view override returns(uint256){ return(_balances[account]); } function allowance(address owner, address spender) public view override returns(uint256){ return(_allowances[owner][spender]); } function approve(address spender, uint256 amount) public override returns(bool){ _approve(_msgSender(), spender, amount); return(true); } function _approve(address owner, address spender, uint256 amount) private { require(owner != address(0), "[sharkie] approve from the zero address"); require(spender != address(0), "[sharkie] approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function increaseAllowance(address spender, uint256 addedValue) public returns(bool){ _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return(true); } function decreaseAllowance(address spender, uint256 subtractedValue) public returns(bool){ _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "[sharkie] decreased allowance below zero")); return(true); } function transfer(address recipient, uint256 amount) public override returns(bool){ _transfer(_msgSender(), recipient, amount); return(true); } function transferFrom(address sender, address recipient, uint256 amount) public override returns(bool){ _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "[sharkie] transfer amount exceeds allowance")); return(true); } function burn() public view returns(uint256){ return(_balances[ADDRESS_BURN]); } function price() public view returns(uint256){ address[] memory pathTokenToUSDC = new address[](3); pathTokenToUSDC[0] = address(this); pathTokenToUSDC[1] = _router.WETH(); pathTokenToUSDC[2] = ADDRESS_ERC20_USDC; uint256[] memory priceTokenToUSDC = _router.getAmountsOut(1 * (10**9), pathTokenToUSDC); return(priceTokenToUSDC[2]); } function liquidity() public view returns(uint256){ address token0 = _pair.token0(); (uint256 reserve0, uint256 reserve1,) = _pair.getReserves(); if(address(this) == token0){ return(reserve0); }else{ return(reserve1); } } function marketcap() public view returns(uint256){ return( (price().mul(supply())).div(10**ERC20_USDC.decimals()) ); } function supply() public view returns(uint256){ return(totalSupply().sub(burn())); } // private // ███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗ // ╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝ event TransferTaxes(uint16 marketing, uint16 developer, uint16 buyback, string direction, bool individualTaxes); event TransferTaxesInNative(uint256 total, uint256 marketing, uint256 developer, uint256 buyback); function _transfer(address pFrom, address pTo, uint256 pAmount) private{ string memory transferDirection; if(pFrom == ADDRESS_PAIR){ transferDirection = "buy from LP"; }else if(pTo == ADDRESS_PAIR){ transferDirection = "sell to LP"; }else{ transferDirection = "transfer"; } if(LIMIT24H_ACTIVE && (block.timestamp > LIMIT24H_END)){ LIMIT24H_ACTIVE = false; } if(_addressNoTaxes[pFrom] || _addressNoTaxes[pTo]){ // event emit TransferTaxes(0, 0, 0, transferDirection, true); _transactionTokens(pFrom, pTo, pAmount); }else{ Taxes memory Tax; uint256 transferSupplyLimit = supply(); uint256 transferMarketCapLimit = marketcap(); bool transferIndividualTaxes; uint256 limitWalletTokens = ( (LIMIT_ACTIVE && (transferMarketCapLimit < LIMIT_MCAP)) ? _percentage(transferSupplyLimit, LIMIT_WALLET) : transferSupplyLimit ); uint256 limitTransactionTokens = ( (LIMIT_ACTIVE && (transferMarketCapLimit < LIMIT_MCAP)) ? _percentage(transferSupplyLimit, LIMIT_TRANSACTION) : transferSupplyLimit ); if(pFrom == ADDRESS_PAIR){ require(_tradingEnabled, "[sharkie] trading not enabled yet, stay tuned!"); if(LIMIT_ACTIVE && !_addressNoLimits[pTo]){ require(pAmount <= limitWalletTokens && _balances[pTo].add(pAmount) <= limitWalletTokens, "[sharkie] wallet limit reached, cant buy more tokens!"); require(pAmount <= limitTransactionTokens, "[sharkie] transaction limit reached, cant buy more tokens!"); } // buy from LP Tax.buy = true; if(_addressIndividualTaxes[pTo]){ Tax.marketing = _addressIndividualTax[pTo].buyMarketing; Tax.developer = _addressIndividualTax[pTo].buyDeveloper; Tax.buyback = _addressIndividualTax[pTo].buyBuyback; transferIndividualTaxes = true; }else{ Tax.marketing = TAX_BUY_MARKETING; Tax.developer = TAX_BUY_DEVELOPER; Tax.buyback = TAX_BUY_BUYBACK; } } if(pTo == ADDRESS_PAIR){ require(_tradingEnabled, "[sharkie] trading not enabled yet, stay tuned!"); if(LIMIT_ACTIVE && !_addressNoLimits[pTo]){ require(pAmount <= limitTransactionTokens, "[sharkie] transaction limit reached, cant buy more tokens!"); } // sell to LP Tax.sell = true; if(_addressIndividualTaxes[pFrom]){ Tax.marketing = _addressIndividualTax[pFrom].sellMarketing; Tax.developer = _addressIndividualTax[pFrom].sellDeveloper; Tax.buyback = _addressIndividualTax[pFrom].sellBuyback; transferIndividualTaxes = true; }else{ Tax.marketing = TAX_SELL_MARKETING; Tax.developer = TAX_SELL_DEVELOPER; Tax.buyback = TAX_SELL_BUYBACK; if(LIMIT24H_ACTIVE){ Tax.marketing = TAX24H_SELL_MARKETING; Tax.developer = TAX24H_SELL_DEVELOPER; Tax.buyback = TAX24H_SELL_BUYBACK; } } } if(!Tax.buy && !Tax.sell){ if(LIMIT_ACTIVE && !_addressNoLimits[pTo]){ require(pAmount <= limitWalletTokens && _balances[pTo].add(pAmount) <= limitWalletTokens, "[sharkie] wallet limit reached, cant transfer more tokens!"); } // transfer from wallet to wallet Tax.marketing = 0; Tax.developer = 0; Tax.buyback = 0; } // event emit TransferTaxes(Tax.marketing, Tax.developer, Tax.buyback, transferDirection, transferIndividualTaxes); if(Tax.marketing > 0){ Tax.totalMarketing = _percentage(pAmount, Tax.marketing); Tax.total = Tax.total.add(Tax.totalMarketing); TAXES_MARKETING = TAXES_MARKETING.add(Tax.totalMarketing); _transactionTokens(pFrom, address(this), Tax.totalMarketing); } if(Tax.developer > 0){ Tax.totalDeveloper = _percentage(pAmount, Tax.developer); Tax.total = Tax.total.add(Tax.totalDeveloper); TAXES_DEVELOPER = TAXES_DEVELOPER.add(Tax.totalDeveloper); _transactionTokens(pFrom, address(this), Tax.totalDeveloper); } if(Tax.buyback > 0){ Tax.totalBuyback = _percentage(pAmount, Tax.buyback); Tax.total = Tax.total.add(Tax.totalBuyback); TAXES_BUYBACK = TAXES_BUYBACK.add(Tax.totalBuyback); _transactionTokens(pFrom, address(this), Tax.totalBuyback); } if(!_swapping && pFrom != ADDRESS_PAIR){ uint256 taxesForSwap = TAXES_MARKETING.add(TAXES_DEVELOPER).add(TAXES_BUYBACK); uint256 taxesSwapped = _taxesToNative(taxesForSwap); uint256 swappedNativeMarketing; uint256 swappedNativeDeveloper; uint256 swappedNativeBuyback; if(TAXES_MARKETING > 0){ swappedNativeMarketing = TAXES_MARKETING.mul(_roundingPrecision).div(taxesForSwap).mul(taxesSwapped).div(_roundingPrecision); _transactionNative(ADDRESS_MARKETING, swappedNativeMarketing); TAXES_MARKETING = 0; } if(TAXES_DEVELOPER > 0){ swappedNativeDeveloper = TAXES_DEVELOPER.mul(_roundingPrecision).div(taxesForSwap).mul(taxesSwapped).div(_roundingPrecision); _transactionNative(ADDRESS_DEVELOPER, swappedNativeDeveloper); TAXES_DEVELOPER = 0; } if(TAXES_BUYBACK > 0){ swappedNativeBuyback = TAXES_BUYBACK.mul(_roundingPrecision).div(taxesForSwap).mul(taxesSwapped).div(_roundingPrecision); _transactionNative(ADDRESS_BUYBACK, swappedNativeBuyback); TAXES_BUYBACK = 0; } if(address(this).balance > 0){ taxesSwapped = taxesSwapped.add(address(this).balance); swappedNativeBuyback = swappedNativeBuyback.add(address(this).balance); _transactionNative(ADDRESS_BUYBACK, address(this).balance); } // event emit TransferTaxesInNative(taxesSwapped, swappedNativeMarketing, swappedNativeDeveloper, swappedNativeBuyback); } _transactionTokens(pFrom, pTo, pAmount.sub(Tax.total)); } } function _transactionTokens(address pFrom, address pTo, uint256 pAmount) private{ _balances[pFrom] = _balances[pFrom].sub(pAmount); _balances[pTo] = _balances[pTo].add(pAmount); emit Transfer(pFrom, pTo, pAmount); } function _transactionNative(address pTo, uint256 pAmount) private returns(bool){ address payable to = payable(pTo); (bool sent, ) = to.call{value:pAmount}(""); return(sent); } function _taxesToNative(uint256 pTaxes) private onlySwapOnce returns(uint256){ return(_swap(PATH_TOKEN_NATIVE, pTaxes)); } function _swap(address[] memory pPath, uint256 pTokens) private returns(uint256){ uint256 balancePreSwap = address(this).balance; _router.swapExactTokensForETHSupportingFeeOnTransferTokens( pTokens, 0, pPath, address(this), block.timestamp ); uint256 balancePostSwap = address(this).balance; return(balancePostSwap.sub(balancePreSwap)); } function _percentage(uint256 pAmount, uint16 pPercent) private pure returns(uint256){ return(pAmount.mul(pPercent).div(10**3)); } event TransferLiquidity(uint256 native, uint256 token); function _addLiquidity() private{ uint256 balance = address(this).balance; uint256 liquidityForUniswap = 50000000000000 * (10**9); require(balance > 0 && _balances[address(this)] >= liquidityForUniswap, "[sharkie] you do not have any coins or tokens to provide liquidity!"); // event emit TransferLiquidity(balance, liquidityForUniswap); _router.addLiquidityETH{value:balance}( address(this), liquidityForUniswap, 0, 0, ADDRESS_DEVELOPER, block.timestamp ); _liquidityProvided = true; renounceOwnership(); } } // Smart Contract created by ElevenCloud.eth – Open for inquiries
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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"native","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"token","type":"uint256"}],"name":"TransferLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"marketing","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"developer","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"buyback","type":"uint16"},{"indexed":false,"internalType":"string","name":"direction","type":"string"},{"indexed":false,"internalType":"bool","name":"individualTaxes","type":"bool"}],"name":"TransferTaxes","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"marketing","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"developer","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyback","type":"uint256"}],"name":"TransferTaxesInNative","type":"event"},{"inputs":[],"name":"ADDRESS_BURN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ADDRESS_BUYBACK","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ADDRESS_DEVELOPER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ADDRESS_ERC20_USDC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ADDRESS_MARKETING","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ADDRESS_PAIR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ADDRESS_ROUTER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIMIT24H_ACTIVE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIMIT24H_END","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIMIT_ACTIVE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIMIT_MCAP","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIMIT_TRANSACTION","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIMIT_WALLET","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"PATH_TOKEN_NATIVE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TAX24H_SELL_BUYBACK","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TAX24H_SELL_DEVELOPER","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TAX24H_SELL_MARKETING","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TAXES_BUYBACK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TAXES_DEVELOPER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TAXES_MARKETING","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TAX_BUY_BUYBACK","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TAX_BUY_DEVELOPER","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TAX_BUY_MARKETING","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TAX_SELL_BUYBACK","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TAX_SELL_DEVELOPER","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TAX_SELL_MARKETING","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addLiquidity","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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address","name":"pWallet","type":"address"}],"name":"disableIndividualTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pWallet","type":"address"},{"internalType":"uint16","name":"pMarketing","type":"uint16"},{"internalType":"uint16","name":"pDeveloper","type":"uint16"},{"internalType":"uint16","name":"pBuyback","type":"uint16"},{"internalType":"bool","name":"pBuy","type":"bool"}],"name":"enableIndividualTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","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":[],"name":"liquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketcap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pTo","type":"address"},{"internalType":"uint256","name":"pAmount","type":"uint256"}],"name":"send","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pAddress","type":"address"},{"internalType":"bool","name":"pAuthorized","type":"bool"}],"name":"setAuthorized","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"pLimit","type":"bool"}],"name":"setLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setNo24h","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pAddress","type":"address"},{"internalType":"bool","name":"pLimits","type":"bool"}],"name":"setNoLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pAddress","type":"address"},{"internalType":"bool","name":"pNoTaxes","type":"bool"}],"name":"setNoTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"pMarketing","type":"uint16"},{"internalType":"uint16","name":"pDeveloper","type":"uint16"},{"internalType":"uint16","name":"pBuyback","type":"uint16"},{"internalType":"bool","name":"pBuy","type":"bool"}],"name":"setTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
600280546001600160a01b031990811661dead17909155600380548216737a250d5630b4cf539739df2c5dacb4c659f2488d17905560048054821673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4817905560058054821673fbe5dcf729c2da5ef2536419cee8f9f24c93716417905560068054821673f82352ce25e7b412c6eade7d8b38e1bc7cb703c41790556007805490911673926a0f47d1fab46153dba2c1638156bb320b0c5d178155600f8054780bde3100010002000a001e00a00028002800320014002800326001600160d01b031990911617905560c0604052608081905266536861726b696560c81b60a090815262000103916011919062000828565b5060408051808201909152600780825266534841524b494560c81b6020909201918252620001349160129162000828565b506013805460ff1916600917905569152d02c7e14af6800000601455670de0b6b3a76400006015556040805160028082526060820183529091602083019080368337505081516200018d92601e925060200190620008b7565b503480156200019b57600080fd5b50620001a733620006a5565b6014543060009081526017602090815260409182902092909255600354600880546001600160a01b0319166001600160a01b03929092169182179055815163c45a015560e01b81529151909263c45a01559260048082019391829003018186803b1580156200021557600080fd5b505afa1580156200022a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000250919062000926565b6001600160a01b031663c9c6539630600860009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620002ae57600080fd5b505afa158015620002c3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002e9919062000926565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200033257600080fd5b505af115801562000347573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200036d919062000926565b600180546001600160a01b039283166001600160a01b03199182168117909255600980549091169091179055600854620003ad91309116600019620006f5565b600860009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620003fc57600080fd5b505afa15801562000411573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000437919062000926565b600a80546001600160a01b039283166001600160a01b031991821617909155600454600b8054909216908316179055306000818152601960209081526040808320805460ff1990811660019081179092556002805488168652838620805483168417905560058054891687528487208054841685179055600680548a1688528588208054851686179055600780548b1689528689208054861687179055988852601a90965284872080548416851790559054881686528386208054831684179055548716855282852080548216831790559254861684528184208054841682179055935490941682529281208054909316821790925590601b90620005393390565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905560055482168152601b9093528183208054851660019081179091556006548216845282842080548616821790556007549091168352908220805490931617909155601e8054309290620005be57620005be62000995565b60009182526020918290200180546001600160a01b0319166001600160a01b03938416179055600854604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156200061f57600080fd5b505afa15801562000634573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200065a919062000926565b601e60018154811062000671576200067162000995565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550620009ab565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038316620007615760405162461bcd60e51b815260206004820152602760248201527f5b736861726b69655d20617070726f76652066726f6d20746865207a65726f206044820152666164647265737360c81b60648201526084015b60405180910390fd5b6001600160a01b038216620007c75760405162461bcd60e51b815260206004820152602560248201527f5b736861726b69655d20617070726f766520746f20746865207a65726f206164604482015264647265737360d81b606482015260840162000758565b6001600160a01b0383811660008181526018602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b828054620008369062000958565b90600052602060002090601f0160209004810192826200085a5760008555620008a5565b82601f106200087557805160ff1916838001178555620008a5565b82800160010185558215620008a5579182015b82811115620008a557825182559160200191906001019062000888565b50620008b39291506200090f565b5090565b828054828255906000526020600020908101928215620008a5579160200282015b82811115620008a557825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620008d8565b5b80821115620008b3576000815560010162000910565b6000602082840312156200093957600080fd5b81516001600160a01b03811681146200095157600080fd5b9392505050565b600181811c908216806200096d57607f821691505b602082108114156200098f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b61308180620009bb6000396000f3fe60806040526004361061036f5760003560e01c80638a8c523c116101c6578063c0521092116100f7578063e8078d9411610095578063f2fde38b1161006f578063f2fde38b14610a29578063f558738114610a49578063f5fa8b8214610a69578063fcb827ab14610a8957600080fd5b8063e8078d94146109d2578063ea1717de146109e7578063ecef526814610a0957600080fd5b8063d0679d34116100d1578063d0679d341461092a578063dd62ed3e1461094a578063df0bcfe714610990578063e3d43496146109b257600080fd5b8063c0521092146108d2578063cbbf93d0146108f4578063cc51c2fb1461090a57600080fd5b8063a102ab1611610164578063af57be931161013e578063af57be9314610850578063b97ca94714610870578063b9fa9ea214610892578063bba1047b146108b257600080fd5b8063a102ab16146107fb578063a457c2d714610810578063a9059cbb1461083057600080fd5b8063905b3898116101a0578063905b389814610799578063954b37e6146107bb57806395d89b41146107d1578063a035b1fe146107e657600080fd5b80638a8c523c146107515780638da5cb5b146107665780638decb82d1461078457600080fd5b806344df8e70116102a057806370a082311161023e578063715018a611610218578063715018a6146106e55780637728ca98146106fa5780637970a2ca1461071b5780637fbbf78d1461073157600080fd5b806370a082311461067457806370d3cbae146106aa578063711bf9b2146106c557600080fd5b8063539bcc091161027a578063539bcc09146105d6578063619a85291461060f5780636d9eb8d11461062f5780636e8a34c61461065257600080fd5b806344df8e701461056957806348af48a5146105965780634c1eaa20146105b657600080fd5b80631c700b291161030d57806326fc3f5d116102e757806326fc3f5d146104cd5780632cf3789d14610505578063313ce56714610527578063395093511461054957600080fd5b80631c700b291461046a5780631f965dd31461048b57806323b872dd146104ad57600080fd5b806312619b6e1161034957806312619b6e146103f557806312e0f4ff1461042a57806318160ddd146104405780631a6865021461045557600080fd5b8063047fc9aa1461037b57806306fdde03146103a3578063095ea7b3146103c557600080fd5b3661037657005b600080fd5b34801561038757600080fd5b50610390610aaa565b6040519081526020015b60405180910390f35b3480156103af57600080fd5b506103b8610ad8565b60405161039a9190612c41565b3480156103d157600080fd5b506103e56103e0366004612932565b610b6a565b604051901515815260200161039a565b34801561040157600080fd5b50600f5461041790600160701b900461ffff1681565b60405161ffff909116815260200161039a565b34801561043657600080fd5b50610390600d5481565b34801561044c57600080fd5b50601454610390565b34801561046157600080fd5b50610390610b81565b34801561047657600080fd5b50600f546103e590600160d01b900460ff1681565b34801561049757600080fd5b506104ab6104a6366004612896565b610cc5565b005b3480156104b957600080fd5b506103e56104c8366004612855565b610d28565b3480156104d957600080fd5b506003546104ed906001600160a01b031681565b6040516001600160a01b03909116815260200161039a565b34801561051157600080fd5b50600f5461041790600160901b900461ffff1681565b34801561053357600080fd5b5060135460405160ff909116815260200161039a565b34801561055557600080fd5b506103e5610564366004612932565b610d91565b34801561057557600080fd5b506002546001600160a01b0316600090815260176020526040902054610390565b3480156105a257600080fd5b506002546104ed906001600160a01b031681565b3480156105c257600080fd5b506001546104ed906001600160a01b031681565b3480156105e257600080fd5b50600f546105fa90600160b01b900463ffffffff1681565b60405163ffffffff909116815260200161039a565b34801561061b57600080fd5b506004546104ed906001600160a01b031681565b34801561063b57600080fd5b50600f5461041790640100000000900461ffff1681565b34801561065e57600080fd5b50600f5461041790600160401b900461ffff1681565b34801561068057600080fd5b5061039061068f3660046127e2565b6001600160a01b031660009081526017602052604090205490565b3480156106b657600080fd5b50600f546104179061ffff1681565b3480156106d157600080fd5b506104ab6106e0366004612896565b610dc7565b3480156106f157600080fd5b506104ab610e21565b34801561070657600080fd5b50600f546104179062010000900461ffff1681565b34801561072757600080fd5b50610390600e5481565b34801561073d57600080fd5b506104ab61074c366004612a8e565b610e57565b34801561075d57600080fd5b506104ab610f9b565b34801561077257600080fd5b506000546001600160a01b03166104ed565b34801561079057600080fd5b506104ab611077565b3480156107a557600080fd5b50600f5461041790600160601b900461ffff1681565b3480156107c757600080fd5b50610390600c5481565b3480156107dd57600080fd5b506103b86110b5565b3480156107f257600080fd5b506103906110c4565b34801561080757600080fd5b5061039061128e565b34801561081c57600080fd5b506103e561082b366004612932565b611343565b34801561083c57600080fd5b506103e561084b366004612932565b611392565b34801561085c57600080fd5b506104ab61086b3660046127e2565b61139f565b34801561087c57600080fd5b50600f5461041790600160a01b900461ffff1681565b34801561089e57600080fd5b506104ab6108ad366004612896565b6113ef565b3480156108be57600080fd5b506104ed6108cd366004612ae2565b611449565b3480156108de57600080fd5b50600f5461041790600160501b900461ffff1681565b34801561090057600080fd5b5061039060105481565b34801561091657600080fd5b506007546104ed906001600160a01b031681565b34801561093657600080fd5b506104ab610945366004612932565b611473565b34801561095657600080fd5b5061039061096536600461281c565b6001600160a01b03918216600090815260186020908152604080832093909416825291909152205490565b34801561099c57600080fd5b50600f5461041790600160301b900461ffff1681565b3480156109be57600080fd5b506006546104ed906001600160a01b031681565b3480156109de57600080fd5b506104ab611561565b3480156109f357600080fd5b50600f5461041790600160801b900461ffff1681565b348015610a1557600080fd5b506104ab610a24366004612a23565b611606565b348015610a3557600080fd5b506104ab610a443660046127e2565b611653565b348015610a5557600080fd5b506104ab610a643660046128cb565b6116f8565b348015610a7557600080fd5b506005546104ed906001600160a01b031681565b348015610a9557600080fd5b50600f546103e590600160d81b900460ff1681565b6002546001600160a01b0316600090815260176020526040812054610ad3906014545b906117fb565b905090565b606060118054610ae790612f66565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1390612f66565b8015610b605780601f10610b3557610100808354040283529160200191610b60565b820191906000526020600020905b815481529060010190602001808311610b4357829003601f168201915b5050505050905090565b6000610b77338484611807565b5060015b92915050565b600080600960009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610bd257600080fd5b505afa158015610be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0a91906127ff565b9050600080600960009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015610c5d57600080fd5b505afa158015610c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c959190612a3e565b506001600160701b039182169350169050306001600160a01b0384161415610cbe575092915050565b9392505050565b336000908152601b602052604090205460ff16610cfd5760405162461bcd60e51b8152600401610cf490612cb1565b60405180910390fd5b6001600160a01b03919091166000908152601960205260409020805460ff1916911515919091179055565b6000610d35848484611933565b610d878433610d82856040518060600160405280602b8152602001613021602b91396001600160a01b038a1660009081526018602090815260408083203384529091529020549190612339565b611807565b5060019392505050565b3360008181526018602090815260408083206001600160a01b03871684529091528120549091610b77918590610d829086612365565b336000908152601b602052604090205460ff16610df65760405162461bcd60e51b8152600401610cf490612cb1565b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314610e4b5760405162461bcd60e51b8152600401610cf490612d0e565b610e556000612371565b565b336000908152601b602052604090205460ff16610e865760405162461bcd60e51b8152600401610cf490612cb1565b60c882610e938587612de2565b610e9d9190612de2565b61ffff161115610f035760405162461bcd60e51b815260206004820152602b60248201527f5b736861726b69655d2073756d206f6620616c6c2074617865732063616e742060448201526a657863656564203230252160a81b6064820152608401610cf4565b8015610f4757600f805461ffff8481166401000000000265ffff0000000019878316620100000263ffffffff19909416928916929092179290921716179055610f95565b600f805469ffffffff0000000000001916600160301b61ffff8781169190910261ffff60401b191691909117600160401b868316021761ffff60501b1916600160501b918516919091021790555b50505050565b336000908152601b602052604090205460ff16610fca5760405162461bcd60e51b8152600401610cf490612cb1565b60165460ff16156110435760405162461bcd60e51b815260206004820152603760248201527f5b736861726b69655d2074726164696e672063616e206f6e6c7920626520656e60448201527f61626c656420616e64206e6f742064697361626c6564210000000000000000006064820152608401610cf4565b6016805460ff1916600117905561105d4262015180612e08565b601055600f805461ffff60d01b191661010160d01b179055565b336000908152601b602052604090205460ff166110a65760405162461bcd60e51b8152600401610cf490612cb1565b600f805460ff60d81b19169055565b606060128054610ae790612f66565b604080516003808252608082019092526000918291906020820160608036833701905050905030816000815181106110fe576110fe612fb7565b6001600160a01b03928316602091820292909201810191909152600854604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561115257600080fd5b505afa158015611166573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118a91906127ff565b8160018151811061119d5761119d612fb7565b6001600160a01b0392831660209182029290920101526004548251911690829060029081106111ce576111ce612fb7565b6001600160a01b03928316602091820292909201015260085460405163d06ca61f60e01b8152600092919091169063d06ca61f9061121690633b9aca00908690600401612c20565b60006040518083038186803b15801561122e57600080fd5b505afa158015611242573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261126a919081019061295e565b90508060028151811061127f5761127f612fb7565b60200260200101519250505090565b6000610ad3600b60009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156112e157600080fd5b505afa1580156112f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113199190612b29565b61132490600a612e85565b61133d61132f610aaa565b6113376110c4565b906123c1565b906123cd565b6000610b773384610d8285604051806060016040528060288152602001612ff9602891393360009081526018602090815260408083206001600160a01b038d1684529091529020549190612339565b6000610b77338484611933565b336000908152601b602052604090205460ff166113ce5760405162461bcd60e51b8152600401610cf490612cb1565b6001600160a01b03166000908152601d60205260409020805460ff19169055565b336000908152601b602052604090205460ff1661141e5760405162461bcd60e51b8152600401610cf490612cb1565b6001600160a01b03919091166000908152601a60205260409020805460ff1916911515919091179055565b601e818154811061145957600080fd5b6000918252602090912001546001600160a01b0316905081565b336000908152601b602052604090205460ff166114a25760405162461bcd60e51b8152600401610cf490612cb1565b6114dd6114c8600e546114c2600d54600c5461236590919063ffffffff16565b90612365565b30600090815260176020526040902054610acd565b8111156115525760405162461bcd60e51b815260206004820152603a60248201527f5b736861726b69655d20796f752063616e742073656e64206d6f726520746f6b60448201527f656e73207468616e2074686520636f6e747261637420686173210000000000006064820152608401610cf4565b61155d3083836123d9565b5050565b336000908152601b602052604090205460ff166115905760405162461bcd60e51b8152600401610cf490612cb1565b601654610100900460ff16156115fe5760405162461bcd60e51b815260206004820152602d60248201527f5b736861726b69655d206c69717569646974792063616e206f6e6c792062652060448201526c656e61626c6564206f6e63652160981b6064820152608401610cf4565b610e5561247f565b336000908152601b602052604090205460ff166116355760405162461bcd60e51b8152600401610cf490612cb1565b600f8054911515600160d01b0260ff60d01b19909216919091179055565b6000546001600160a01b0316331461167d5760405162461bcd60e51b8152600401610cf490612d0e565b6001600160a01b0381166116ec5760405162461bcd60e51b815260206004820152603060248201527f5b736861726b69655d5b6f776e61626c655d206e6577206f776e65722069732060448201526f746865207a65726f206164647265737360801b6064820152608401610cf4565b6116f581612371565b50565b336000908152601b602052604090205460ff166117275760405162461bcd60e51b8152600401610cf490612cb1565b6001600160a01b0385166000908152601d60209081526040808320805460ff199081166001179091556019835281842080549091169055601c909152902081156117a757805461ffff8481166401000000000265ffff0000000019878316620100000263ffffffff199094169289169290921792909217161781556117f3565b805469ffffffff0000000000001916600160301b61ffff8781169190910261ffff60401b191691909117600160401b868316021761ffff60501b1916600160501b918516919091021781555b505050505050565b6000610cbe8284612f4f565b6001600160a01b03831661186d5760405162461bcd60e51b815260206004820152602760248201527f5b736861726b69655d20617070726f76652066726f6d20746865207a65726f206044820152666164647265737360c81b6064820152608401610cf4565b6001600160a01b0382166118d15760405162461bcd60e51b815260206004820152602560248201527f5b736861726b69655d20617070726f766520746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610cf4565b6001600160a01b0383811660008181526018602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001546060906001600160a01b0385811691161415611974575060408051808201909152600b81526a06275792066726f6d204c560ac1b60208201526119d2565b6001546001600160a01b03848116911614156119b1575060408051808201909152600a815269073656c6c20746f204c560b41b60208201526119d2565b506040805180820190915260088152673a3930b739b332b960c11b60208201525b600f54600160d81b900460ff1680156119ec575060105442115b156119ff57600f805460ff60d81b191690555b6001600160a01b03841660009081526019602052604090205460ff1680611a3e57506001600160a01b03831660009081526019602052604090205460ff165b15611a95577f2adac66d1a9369a0beace91165951491d421c413e490391da838228e9cf1f1bb6000806000846001604051611a7d959493929190612bdd565b60405180910390a1611a908484846123d9565b610f95565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905290611ae6610aaa565b90506000611af261128e565b9050600080600f601a9054906101000a900460ff168015611b215750600f54600160b01b900463ffffffff1683105b611b2b5783611b44565b600f54611b44908590600160901b900461ffff1661261e565b600f54909150600090600160d01b900460ff168015611b715750600f54600160b01b900463ffffffff1684105b611b7b5784611b94565b600f54611b94908690600160a01b900461ffff1661261e565b6001549091506001600160a01b038b811691161415611d635760165460ff16611bcf5760405162461bcd60e51b8152600401610cf490612d58565b600f54600160d01b900460ff168015611c0157506001600160a01b0389166000908152601a602052604090205460ff16155b15611cc357818811158015611c3957506001600160a01b0389166000908152601760205260409020548290611c36908a612365565b11155b611ca35760405162461bcd60e51b815260206004820152603560248201527f5b736861726b69655d2077616c6c6574206c696d697420726561636865642c2060448201527463616e7420627579206d6f726520746f6b656e732160581b6064820152608401610cf4565b80881115611cc35760405162461bcd60e51b8152600401610cf490612c54565b600160e08701526001600160a01b0389166000908152601d602052604090205460ff1615611d3b576001600160a01b0389166000818152601c602081815260408084205461ffff8082168d5262010000820481168d850152959094529190526401000000009091049091169087015260019250611d63565b600f5461ffff8082168852620100008204811660208901526401000000009091041660408701525b6001546001600160a01b038a811691161415611edb5760165460ff16611d9b5760405162461bcd60e51b8152600401610cf490612d58565b600f54600160d01b900460ff168015611dcd57506001600160a01b0389166000908152601a602052604090205460ff16155b15611df25780881115611df25760405162461bcd60e51b8152600401610cf490612c54565b60016101008701526001600160a01b038a166000908152601d602052604090205460ff1615611e71576001600160a01b038a166000818152601c602081815260408084205461ffff600160301b820481168d52600160401b820481168d85015295909452919052600160501b9091049091169087015260019250611edb565b600f5461ffff600160301b820481168852600160401b820481166020890152600160501b820416604088015260ff600160d81b9091041615611edb57600f5461ffff600160601b820481168852600160701b820481166020890152600160801b9091041660408701525b8560e00151158015611ef05750856101000151155b15611fe357600f54600160d01b900460ff168015611f2757506001600160a01b0389166000908152601a602052604090205460ff16155b15611fd157818811158015611f5f57506001600160a01b0389166000908152601760205260409020548290611f5c908a612365565b11155b611fd15760405162461bcd60e51b815260206004820152603a60248201527f5b736861726b69655d2077616c6c6574206c696d697420726561636865642c2060448201527f63616e74207472616e73666572206d6f726520746f6b656e73210000000000006064820152608401610cf4565b60008087526020870181905260408701525b7f2adac66d1a9369a0beace91165951491d421c413e490391da838228e9cf1f1bb8660000151876020015188604001518a87604051612026959493929190612bdd565b60405180910390a1855161ffff16156120875761204788876000015161261e565b6060870181905260c087015161205c91612365565b60c08701526060860151600c5461207291612365565b600c819055506120878a3088606001516123d9565b602086015161ffff16156120e3576120a388876020015161261e565b6080870181905260c08701516120b891612365565b60c08701526080860151600d546120ce91612365565b600d819055506120e38a3088608001516123d9565b604086015161ffff161561213f576120ff88876040015161261e565b60a0870181905260c087015161211491612365565b60c087015260a0860151600e5461212a91612365565b600e8190555061213f8a308860a001516123d9565b60165462010000900460ff1615801561216657506001546001600160a01b038b8116911614155b1561230c57600061218a600e546114c2600d54600c5461236590919063ffffffff16565b9050600061219782612634565b9050600080600080600c5411156121ed576121cd60155461133d866113378961133d601554600c546123c190919063ffffffff16565b6005549093506121e6906001600160a01b0316846126be565b506000600c555b600d541561223a5761221a60155461133d866113378961133d601554600d546123c190919063ffffffff16565b600654909250612233906001600160a01b0316836126be565b506000600d555b600e54156122875761226760155461133d866113378961133d601554600e546123c190919063ffffffff16565b600754909150612280906001600160a01b0316826126be565b506000600e555b47156122be576122978447612365565b93506122a38147612365565b6007549091506122bc906001600160a01b0316476126be565b505b6040805185815260208101859052908101839052606081018290527fcec7cadc9557eaaea7c0a00446142f07a616b8237c39898a22b0697851f1d0ec9060800160405180910390a150505050505b61232d8a8a6123288960c001518c6117fb90919063ffffffff16565b6123d9565b50505050505050505050565b6000818484111561235d5760405162461bcd60e51b8152600401610cf49190612c41565b505050900390565b6000610cbe8284612e08565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610cbe8284612f30565b6000610cbe8284612e20565b6001600160a01b0383166000908152601760205260409020546123fc90826117fb565b6001600160a01b03808516600090815260176020526040808220939093559084168152205461242b9082612365565b6001600160a01b0380841660008181526017602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906119269085815260200190565b47690a968163f0a57b40000081158015906124a95750306000908152601760205260409020548111155b6125275760405162461bcd60e51b815260206004820152604360248201527f5b736861726b69655d20796f7520646f206e6f74206861766520616e7920636f60448201527f696e73206f7220746f6b656e7320746f2070726f76696465206c69717569646960648201526274792160e81b608482015260a401610cf4565b60408051838152602081018390527fb553eac91610eb9f1e3689f208ea945b374d1bc2b3a64a7de5d8c424e8f45078910160405180910390a160085460065460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990849060c4016060604051808303818588803b1580156125cb57600080fd5b505af11580156125df573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906126049190612afb565b50506016805461ff0019166101001790555061155d610e21565b6000610cbe6103e861133d8561ffff86166123c1565b6016805462ff0000191662010000179055601e8054604080516020808402820181019092528281526000936126ac9391929091908301828280156126a157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612683575b50505050508361271e565b6016805462ff00001916905592915050565b604051600090839082906001600160a01b0383169085908381818185875af1925050503d806000811461270d576040519150601f19603f3d011682016040523d82523d6000602084013e612712565b606091505b50909695505050505050565b60085460405163791ac94760e01b815260009147916001600160a01b039091169063791ac9479061275b9086908690899030904290600401612da6565b600060405180830381600087803b15801561277557600080fd5b505af1158015612789573d6000803e3d6000fd5b5047925061279b9150829050836117fb565b95945050505050565b803580151581146127b457600080fd5b919050565b80516001600160701b03811681146127b457600080fd5b803561ffff811681146127b457600080fd5b6000602082840312156127f457600080fd5b8135610cbe81612fe3565b60006020828403121561281157600080fd5b8151610cbe81612fe3565b6000806040838503121561282f57600080fd5b823561283a81612fe3565b9150602083013561284a81612fe3565b809150509250929050565b60008060006060848603121561286a57600080fd5b833561287581612fe3565b9250602084013561288581612fe3565b929592945050506040919091013590565b600080604083850312156128a957600080fd5b82356128b481612fe3565b91506128c2602084016127a4565b90509250929050565b600080600080600060a086880312156128e357600080fd5b85356128ee81612fe3565b94506128fc602087016127d0565b935061290a604087016127d0565b9250612918606087016127d0565b9150612926608087016127a4565b90509295509295909350565b6000806040838503121561294557600080fd5b823561295081612fe3565b946020939093013593505050565b6000602080838503121561297157600080fd5b825167ffffffffffffffff8082111561298957600080fd5b818501915085601f83011261299d57600080fd5b8151818111156129af576129af612fcd565b8060051b604051601f19603f830116810181811085821117156129d4576129d4612fcd565b604052828152858101935084860182860187018a10156129f357600080fd5b600095505b83861015612a165780518552600195909501949386019386016129f8565b5098975050505050505050565b600060208284031215612a3557600080fd5b610cbe826127a4565b600080600060608486031215612a5357600080fd5b612a5c846127b9565b9250612a6a602085016127b9565b9150604084015163ffffffff81168114612a8357600080fd5b809150509250925092565b60008060008060808587031215612aa457600080fd5b612aad856127d0565b9350612abb602086016127d0565b9250612ac9604086016127d0565b9150612ad7606086016127a4565b905092959194509250565b600060208284031215612af457600080fd5b5035919050565b600080600060608486031215612b1057600080fd5b8351925060208401519150604084015190509250925092565b600060208284031215612b3b57600080fd5b815160ff81168114610cbe57600080fd5b600081518084526020808501945080840160005b83811015612b855781516001600160a01b031687529582019590820190600101612b60565b509495945050505050565b6000815180845260005b81811015612bb657602081850181015186830182015201612b9a565b81811115612bc8576000602083870101525b50601f01601f19169290920160200192915050565b600061ffff8088168352808716602084015280861660408401525060a06060830152612c0c60a0830185612b90565b905082151560808301529695505050505050565b828152604060208201526000612c396040830184612b4c565b949350505050565b602081526000610cbe6020830184612b90565b6020808252603a908201527f5b736861726b69655d207472616e73616374696f6e206c696d6974207265616360408201527f6865642c2063616e7420627579206d6f726520746f6b656e7321000000000000606082015260800190565b60208082526039908201527f5b736861726b69655d206f6e6c7920617574686f72697a65642077616c6c657460408201527f732063616e2063616c6c20746869732066756e6374696f6e2100000000000000606082015260800190565b6020808252602a908201527f5b736861726b69655d5b6f776e61626c655d2063616c6c6572206973206e6f74604082015269103a34329037bbb732b960b11b606082015260800190565b6020808252602e908201527f5b736861726b69655d2074726164696e67206e6f7420656e61626c656420796560408201526d742c20737461792074756e65642160901b606082015260800190565b85815284602082015260a060408201526000612dc560a0830186612b4c565b6001600160a01b0394909416606083015250608001529392505050565b600061ffff808316818516808303821115612dff57612dff612fa1565b01949350505050565b60008219821115612e1b57612e1b612fa1565b500190565b600082612e3d57634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115612e7d578160001904821115612e6357612e63612fa1565b80851615612e7057918102915b93841c9390800290612e47565b509250929050565b6000610cbe60ff841683600082612e9e57506001610b7b565b81612eab57506000610b7b565b8160018114612ec15760028114612ecb57612ee7565b6001915050610b7b565b60ff841115612edc57612edc612fa1565b50506001821b610b7b565b5060208310610133831016604e8410600b8410161715612f0a575081810a610b7b565b612f148383612e42565b8060001904821115612f2857612f28612fa1565b029392505050565b6000816000190483118215151615612f4a57612f4a612fa1565b500290565b600082821015612f6157612f61612fa1565b500390565b600181811c90821680612f7a57607f821691505b60208210811415612f9b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146116f557600080fdfe5b736861726b69655d2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f5b736861726b69655d207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212209275a0dcf3156d432ce5f5ce868506a29c3396767f4f948389b29111b083fac164736f6c63430008070033
Deployed Bytecode
0x60806040526004361061036f5760003560e01c80638a8c523c116101c6578063c0521092116100f7578063e8078d9411610095578063f2fde38b1161006f578063f2fde38b14610a29578063f558738114610a49578063f5fa8b8214610a69578063fcb827ab14610a8957600080fd5b8063e8078d94146109d2578063ea1717de146109e7578063ecef526814610a0957600080fd5b8063d0679d34116100d1578063d0679d341461092a578063dd62ed3e1461094a578063df0bcfe714610990578063e3d43496146109b257600080fd5b8063c0521092146108d2578063cbbf93d0146108f4578063cc51c2fb1461090a57600080fd5b8063a102ab1611610164578063af57be931161013e578063af57be9314610850578063b97ca94714610870578063b9fa9ea214610892578063bba1047b146108b257600080fd5b8063a102ab16146107fb578063a457c2d714610810578063a9059cbb1461083057600080fd5b8063905b3898116101a0578063905b389814610799578063954b37e6146107bb57806395d89b41146107d1578063a035b1fe146107e657600080fd5b80638a8c523c146107515780638da5cb5b146107665780638decb82d1461078457600080fd5b806344df8e70116102a057806370a082311161023e578063715018a611610218578063715018a6146106e55780637728ca98146106fa5780637970a2ca1461071b5780637fbbf78d1461073157600080fd5b806370a082311461067457806370d3cbae146106aa578063711bf9b2146106c557600080fd5b8063539bcc091161027a578063539bcc09146105d6578063619a85291461060f5780636d9eb8d11461062f5780636e8a34c61461065257600080fd5b806344df8e701461056957806348af48a5146105965780634c1eaa20146105b657600080fd5b80631c700b291161030d57806326fc3f5d116102e757806326fc3f5d146104cd5780632cf3789d14610505578063313ce56714610527578063395093511461054957600080fd5b80631c700b291461046a5780631f965dd31461048b57806323b872dd146104ad57600080fd5b806312619b6e1161034957806312619b6e146103f557806312e0f4ff1461042a57806318160ddd146104405780631a6865021461045557600080fd5b8063047fc9aa1461037b57806306fdde03146103a3578063095ea7b3146103c557600080fd5b3661037657005b600080fd5b34801561038757600080fd5b50610390610aaa565b6040519081526020015b60405180910390f35b3480156103af57600080fd5b506103b8610ad8565b60405161039a9190612c41565b3480156103d157600080fd5b506103e56103e0366004612932565b610b6a565b604051901515815260200161039a565b34801561040157600080fd5b50600f5461041790600160701b900461ffff1681565b60405161ffff909116815260200161039a565b34801561043657600080fd5b50610390600d5481565b34801561044c57600080fd5b50601454610390565b34801561046157600080fd5b50610390610b81565b34801561047657600080fd5b50600f546103e590600160d01b900460ff1681565b34801561049757600080fd5b506104ab6104a6366004612896565b610cc5565b005b3480156104b957600080fd5b506103e56104c8366004612855565b610d28565b3480156104d957600080fd5b506003546104ed906001600160a01b031681565b6040516001600160a01b03909116815260200161039a565b34801561051157600080fd5b50600f5461041790600160901b900461ffff1681565b34801561053357600080fd5b5060135460405160ff909116815260200161039a565b34801561055557600080fd5b506103e5610564366004612932565b610d91565b34801561057557600080fd5b506002546001600160a01b0316600090815260176020526040902054610390565b3480156105a257600080fd5b506002546104ed906001600160a01b031681565b3480156105c257600080fd5b506001546104ed906001600160a01b031681565b3480156105e257600080fd5b50600f546105fa90600160b01b900463ffffffff1681565b60405163ffffffff909116815260200161039a565b34801561061b57600080fd5b506004546104ed906001600160a01b031681565b34801561063b57600080fd5b50600f5461041790640100000000900461ffff1681565b34801561065e57600080fd5b50600f5461041790600160401b900461ffff1681565b34801561068057600080fd5b5061039061068f3660046127e2565b6001600160a01b031660009081526017602052604090205490565b3480156106b657600080fd5b50600f546104179061ffff1681565b3480156106d157600080fd5b506104ab6106e0366004612896565b610dc7565b3480156106f157600080fd5b506104ab610e21565b34801561070657600080fd5b50600f546104179062010000900461ffff1681565b34801561072757600080fd5b50610390600e5481565b34801561073d57600080fd5b506104ab61074c366004612a8e565b610e57565b34801561075d57600080fd5b506104ab610f9b565b34801561077257600080fd5b506000546001600160a01b03166104ed565b34801561079057600080fd5b506104ab611077565b3480156107a557600080fd5b50600f5461041790600160601b900461ffff1681565b3480156107c757600080fd5b50610390600c5481565b3480156107dd57600080fd5b506103b86110b5565b3480156107f257600080fd5b506103906110c4565b34801561080757600080fd5b5061039061128e565b34801561081c57600080fd5b506103e561082b366004612932565b611343565b34801561083c57600080fd5b506103e561084b366004612932565b611392565b34801561085c57600080fd5b506104ab61086b3660046127e2565b61139f565b34801561087c57600080fd5b50600f5461041790600160a01b900461ffff1681565b34801561089e57600080fd5b506104ab6108ad366004612896565b6113ef565b3480156108be57600080fd5b506104ed6108cd366004612ae2565b611449565b3480156108de57600080fd5b50600f5461041790600160501b900461ffff1681565b34801561090057600080fd5b5061039060105481565b34801561091657600080fd5b506007546104ed906001600160a01b031681565b34801561093657600080fd5b506104ab610945366004612932565b611473565b34801561095657600080fd5b5061039061096536600461281c565b6001600160a01b03918216600090815260186020908152604080832093909416825291909152205490565b34801561099c57600080fd5b50600f5461041790600160301b900461ffff1681565b3480156109be57600080fd5b506006546104ed906001600160a01b031681565b3480156109de57600080fd5b506104ab611561565b3480156109f357600080fd5b50600f5461041790600160801b900461ffff1681565b348015610a1557600080fd5b506104ab610a24366004612a23565b611606565b348015610a3557600080fd5b506104ab610a443660046127e2565b611653565b348015610a5557600080fd5b506104ab610a643660046128cb565b6116f8565b348015610a7557600080fd5b506005546104ed906001600160a01b031681565b348015610a9557600080fd5b50600f546103e590600160d81b900460ff1681565b6002546001600160a01b0316600090815260176020526040812054610ad3906014545b906117fb565b905090565b606060118054610ae790612f66565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1390612f66565b8015610b605780601f10610b3557610100808354040283529160200191610b60565b820191906000526020600020905b815481529060010190602001808311610b4357829003601f168201915b5050505050905090565b6000610b77338484611807565b5060015b92915050565b600080600960009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610bd257600080fd5b505afa158015610be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0a91906127ff565b9050600080600960009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015610c5d57600080fd5b505afa158015610c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c959190612a3e565b506001600160701b039182169350169050306001600160a01b0384161415610cbe575092915050565b9392505050565b336000908152601b602052604090205460ff16610cfd5760405162461bcd60e51b8152600401610cf490612cb1565b60405180910390fd5b6001600160a01b03919091166000908152601960205260409020805460ff1916911515919091179055565b6000610d35848484611933565b610d878433610d82856040518060600160405280602b8152602001613021602b91396001600160a01b038a1660009081526018602090815260408083203384529091529020549190612339565b611807565b5060019392505050565b3360008181526018602090815260408083206001600160a01b03871684529091528120549091610b77918590610d829086612365565b336000908152601b602052604090205460ff16610df65760405162461bcd60e51b8152600401610cf490612cb1565b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314610e4b5760405162461bcd60e51b8152600401610cf490612d0e565b610e556000612371565b565b336000908152601b602052604090205460ff16610e865760405162461bcd60e51b8152600401610cf490612cb1565b60c882610e938587612de2565b610e9d9190612de2565b61ffff161115610f035760405162461bcd60e51b815260206004820152602b60248201527f5b736861726b69655d2073756d206f6620616c6c2074617865732063616e742060448201526a657863656564203230252160a81b6064820152608401610cf4565b8015610f4757600f805461ffff8481166401000000000265ffff0000000019878316620100000263ffffffff19909416928916929092179290921716179055610f95565b600f805469ffffffff0000000000001916600160301b61ffff8781169190910261ffff60401b191691909117600160401b868316021761ffff60501b1916600160501b918516919091021790555b50505050565b336000908152601b602052604090205460ff16610fca5760405162461bcd60e51b8152600401610cf490612cb1565b60165460ff16156110435760405162461bcd60e51b815260206004820152603760248201527f5b736861726b69655d2074726164696e672063616e206f6e6c7920626520656e60448201527f61626c656420616e64206e6f742064697361626c6564210000000000000000006064820152608401610cf4565b6016805460ff1916600117905561105d4262015180612e08565b601055600f805461ffff60d01b191661010160d01b179055565b336000908152601b602052604090205460ff166110a65760405162461bcd60e51b8152600401610cf490612cb1565b600f805460ff60d81b19169055565b606060128054610ae790612f66565b604080516003808252608082019092526000918291906020820160608036833701905050905030816000815181106110fe576110fe612fb7565b6001600160a01b03928316602091820292909201810191909152600854604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561115257600080fd5b505afa158015611166573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118a91906127ff565b8160018151811061119d5761119d612fb7565b6001600160a01b0392831660209182029290920101526004548251911690829060029081106111ce576111ce612fb7565b6001600160a01b03928316602091820292909201015260085460405163d06ca61f60e01b8152600092919091169063d06ca61f9061121690633b9aca00908690600401612c20565b60006040518083038186803b15801561122e57600080fd5b505afa158015611242573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261126a919081019061295e565b90508060028151811061127f5761127f612fb7565b60200260200101519250505090565b6000610ad3600b60009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156112e157600080fd5b505afa1580156112f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113199190612b29565b61132490600a612e85565b61133d61132f610aaa565b6113376110c4565b906123c1565b906123cd565b6000610b773384610d8285604051806060016040528060288152602001612ff9602891393360009081526018602090815260408083206001600160a01b038d1684529091529020549190612339565b6000610b77338484611933565b336000908152601b602052604090205460ff166113ce5760405162461bcd60e51b8152600401610cf490612cb1565b6001600160a01b03166000908152601d60205260409020805460ff19169055565b336000908152601b602052604090205460ff1661141e5760405162461bcd60e51b8152600401610cf490612cb1565b6001600160a01b03919091166000908152601a60205260409020805460ff1916911515919091179055565b601e818154811061145957600080fd5b6000918252602090912001546001600160a01b0316905081565b336000908152601b602052604090205460ff166114a25760405162461bcd60e51b8152600401610cf490612cb1565b6114dd6114c8600e546114c2600d54600c5461236590919063ffffffff16565b90612365565b30600090815260176020526040902054610acd565b8111156115525760405162461bcd60e51b815260206004820152603a60248201527f5b736861726b69655d20796f752063616e742073656e64206d6f726520746f6b60448201527f656e73207468616e2074686520636f6e747261637420686173210000000000006064820152608401610cf4565b61155d3083836123d9565b5050565b336000908152601b602052604090205460ff166115905760405162461bcd60e51b8152600401610cf490612cb1565b601654610100900460ff16156115fe5760405162461bcd60e51b815260206004820152602d60248201527f5b736861726b69655d206c69717569646974792063616e206f6e6c792062652060448201526c656e61626c6564206f6e63652160981b6064820152608401610cf4565b610e5561247f565b336000908152601b602052604090205460ff166116355760405162461bcd60e51b8152600401610cf490612cb1565b600f8054911515600160d01b0260ff60d01b19909216919091179055565b6000546001600160a01b0316331461167d5760405162461bcd60e51b8152600401610cf490612d0e565b6001600160a01b0381166116ec5760405162461bcd60e51b815260206004820152603060248201527f5b736861726b69655d5b6f776e61626c655d206e6577206f776e65722069732060448201526f746865207a65726f206164647265737360801b6064820152608401610cf4565b6116f581612371565b50565b336000908152601b602052604090205460ff166117275760405162461bcd60e51b8152600401610cf490612cb1565b6001600160a01b0385166000908152601d60209081526040808320805460ff199081166001179091556019835281842080549091169055601c909152902081156117a757805461ffff8481166401000000000265ffff0000000019878316620100000263ffffffff199094169289169290921792909217161781556117f3565b805469ffffffff0000000000001916600160301b61ffff8781169190910261ffff60401b191691909117600160401b868316021761ffff60501b1916600160501b918516919091021781555b505050505050565b6000610cbe8284612f4f565b6001600160a01b03831661186d5760405162461bcd60e51b815260206004820152602760248201527f5b736861726b69655d20617070726f76652066726f6d20746865207a65726f206044820152666164647265737360c81b6064820152608401610cf4565b6001600160a01b0382166118d15760405162461bcd60e51b815260206004820152602560248201527f5b736861726b69655d20617070726f766520746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610cf4565b6001600160a01b0383811660008181526018602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001546060906001600160a01b0385811691161415611974575060408051808201909152600b81526a06275792066726f6d204c560ac1b60208201526119d2565b6001546001600160a01b03848116911614156119b1575060408051808201909152600a815269073656c6c20746f204c560b41b60208201526119d2565b506040805180820190915260088152673a3930b739b332b960c11b60208201525b600f54600160d81b900460ff1680156119ec575060105442115b156119ff57600f805460ff60d81b191690555b6001600160a01b03841660009081526019602052604090205460ff1680611a3e57506001600160a01b03831660009081526019602052604090205460ff165b15611a95577f2adac66d1a9369a0beace91165951491d421c413e490391da838228e9cf1f1bb6000806000846001604051611a7d959493929190612bdd565b60405180910390a1611a908484846123d9565b610f95565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905290611ae6610aaa565b90506000611af261128e565b9050600080600f601a9054906101000a900460ff168015611b215750600f54600160b01b900463ffffffff1683105b611b2b5783611b44565b600f54611b44908590600160901b900461ffff1661261e565b600f54909150600090600160d01b900460ff168015611b715750600f54600160b01b900463ffffffff1684105b611b7b5784611b94565b600f54611b94908690600160a01b900461ffff1661261e565b6001549091506001600160a01b038b811691161415611d635760165460ff16611bcf5760405162461bcd60e51b8152600401610cf490612d58565b600f54600160d01b900460ff168015611c0157506001600160a01b0389166000908152601a602052604090205460ff16155b15611cc357818811158015611c3957506001600160a01b0389166000908152601760205260409020548290611c36908a612365565b11155b611ca35760405162461bcd60e51b815260206004820152603560248201527f5b736861726b69655d2077616c6c6574206c696d697420726561636865642c2060448201527463616e7420627579206d6f726520746f6b656e732160581b6064820152608401610cf4565b80881115611cc35760405162461bcd60e51b8152600401610cf490612c54565b600160e08701526001600160a01b0389166000908152601d602052604090205460ff1615611d3b576001600160a01b0389166000818152601c602081815260408084205461ffff8082168d5262010000820481168d850152959094529190526401000000009091049091169087015260019250611d63565b600f5461ffff8082168852620100008204811660208901526401000000009091041660408701525b6001546001600160a01b038a811691161415611edb5760165460ff16611d9b5760405162461bcd60e51b8152600401610cf490612d58565b600f54600160d01b900460ff168015611dcd57506001600160a01b0389166000908152601a602052604090205460ff16155b15611df25780881115611df25760405162461bcd60e51b8152600401610cf490612c54565b60016101008701526001600160a01b038a166000908152601d602052604090205460ff1615611e71576001600160a01b038a166000818152601c602081815260408084205461ffff600160301b820481168d52600160401b820481168d85015295909452919052600160501b9091049091169087015260019250611edb565b600f5461ffff600160301b820481168852600160401b820481166020890152600160501b820416604088015260ff600160d81b9091041615611edb57600f5461ffff600160601b820481168852600160701b820481166020890152600160801b9091041660408701525b8560e00151158015611ef05750856101000151155b15611fe357600f54600160d01b900460ff168015611f2757506001600160a01b0389166000908152601a602052604090205460ff16155b15611fd157818811158015611f5f57506001600160a01b0389166000908152601760205260409020548290611f5c908a612365565b11155b611fd15760405162461bcd60e51b815260206004820152603a60248201527f5b736861726b69655d2077616c6c6574206c696d697420726561636865642c2060448201527f63616e74207472616e73666572206d6f726520746f6b656e73210000000000006064820152608401610cf4565b60008087526020870181905260408701525b7f2adac66d1a9369a0beace91165951491d421c413e490391da838228e9cf1f1bb8660000151876020015188604001518a87604051612026959493929190612bdd565b60405180910390a1855161ffff16156120875761204788876000015161261e565b6060870181905260c087015161205c91612365565b60c08701526060860151600c5461207291612365565b600c819055506120878a3088606001516123d9565b602086015161ffff16156120e3576120a388876020015161261e565b6080870181905260c08701516120b891612365565b60c08701526080860151600d546120ce91612365565b600d819055506120e38a3088608001516123d9565b604086015161ffff161561213f576120ff88876040015161261e565b60a0870181905260c087015161211491612365565b60c087015260a0860151600e5461212a91612365565b600e8190555061213f8a308860a001516123d9565b60165462010000900460ff1615801561216657506001546001600160a01b038b8116911614155b1561230c57600061218a600e546114c2600d54600c5461236590919063ffffffff16565b9050600061219782612634565b9050600080600080600c5411156121ed576121cd60155461133d866113378961133d601554600c546123c190919063ffffffff16565b6005549093506121e6906001600160a01b0316846126be565b506000600c555b600d541561223a5761221a60155461133d866113378961133d601554600d546123c190919063ffffffff16565b600654909250612233906001600160a01b0316836126be565b506000600d555b600e54156122875761226760155461133d866113378961133d601554600e546123c190919063ffffffff16565b600754909150612280906001600160a01b0316826126be565b506000600e555b47156122be576122978447612365565b93506122a38147612365565b6007549091506122bc906001600160a01b0316476126be565b505b6040805185815260208101859052908101839052606081018290527fcec7cadc9557eaaea7c0a00446142f07a616b8237c39898a22b0697851f1d0ec9060800160405180910390a150505050505b61232d8a8a6123288960c001518c6117fb90919063ffffffff16565b6123d9565b50505050505050505050565b6000818484111561235d5760405162461bcd60e51b8152600401610cf49190612c41565b505050900390565b6000610cbe8284612e08565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610cbe8284612f30565b6000610cbe8284612e20565b6001600160a01b0383166000908152601760205260409020546123fc90826117fb565b6001600160a01b03808516600090815260176020526040808220939093559084168152205461242b9082612365565b6001600160a01b0380841660008181526017602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906119269085815260200190565b47690a968163f0a57b40000081158015906124a95750306000908152601760205260409020548111155b6125275760405162461bcd60e51b815260206004820152604360248201527f5b736861726b69655d20796f7520646f206e6f74206861766520616e7920636f60448201527f696e73206f7220746f6b656e7320746f2070726f76696465206c69717569646960648201526274792160e81b608482015260a401610cf4565b60408051838152602081018390527fb553eac91610eb9f1e3689f208ea945b374d1bc2b3a64a7de5d8c424e8f45078910160405180910390a160085460065460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990849060c4016060604051808303818588803b1580156125cb57600080fd5b505af11580156125df573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906126049190612afb565b50506016805461ff0019166101001790555061155d610e21565b6000610cbe6103e861133d8561ffff86166123c1565b6016805462ff0000191662010000179055601e8054604080516020808402820181019092528281526000936126ac9391929091908301828280156126a157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612683575b50505050508361271e565b6016805462ff00001916905592915050565b604051600090839082906001600160a01b0383169085908381818185875af1925050503d806000811461270d576040519150601f19603f3d011682016040523d82523d6000602084013e612712565b606091505b50909695505050505050565b60085460405163791ac94760e01b815260009147916001600160a01b039091169063791ac9479061275b9086908690899030904290600401612da6565b600060405180830381600087803b15801561277557600080fd5b505af1158015612789573d6000803e3d6000fd5b5047925061279b9150829050836117fb565b95945050505050565b803580151581146127b457600080fd5b919050565b80516001600160701b03811681146127b457600080fd5b803561ffff811681146127b457600080fd5b6000602082840312156127f457600080fd5b8135610cbe81612fe3565b60006020828403121561281157600080fd5b8151610cbe81612fe3565b6000806040838503121561282f57600080fd5b823561283a81612fe3565b9150602083013561284a81612fe3565b809150509250929050565b60008060006060848603121561286a57600080fd5b833561287581612fe3565b9250602084013561288581612fe3565b929592945050506040919091013590565b600080604083850312156128a957600080fd5b82356128b481612fe3565b91506128c2602084016127a4565b90509250929050565b600080600080600060a086880312156128e357600080fd5b85356128ee81612fe3565b94506128fc602087016127d0565b935061290a604087016127d0565b9250612918606087016127d0565b9150612926608087016127a4565b90509295509295909350565b6000806040838503121561294557600080fd5b823561295081612fe3565b946020939093013593505050565b6000602080838503121561297157600080fd5b825167ffffffffffffffff8082111561298957600080fd5b818501915085601f83011261299d57600080fd5b8151818111156129af576129af612fcd565b8060051b604051601f19603f830116810181811085821117156129d4576129d4612fcd565b604052828152858101935084860182860187018a10156129f357600080fd5b600095505b83861015612a165780518552600195909501949386019386016129f8565b5098975050505050505050565b600060208284031215612a3557600080fd5b610cbe826127a4565b600080600060608486031215612a5357600080fd5b612a5c846127b9565b9250612a6a602085016127b9565b9150604084015163ffffffff81168114612a8357600080fd5b809150509250925092565b60008060008060808587031215612aa457600080fd5b612aad856127d0565b9350612abb602086016127d0565b9250612ac9604086016127d0565b9150612ad7606086016127a4565b905092959194509250565b600060208284031215612af457600080fd5b5035919050565b600080600060608486031215612b1057600080fd5b8351925060208401519150604084015190509250925092565b600060208284031215612b3b57600080fd5b815160ff81168114610cbe57600080fd5b600081518084526020808501945080840160005b83811015612b855781516001600160a01b031687529582019590820190600101612b60565b509495945050505050565b6000815180845260005b81811015612bb657602081850181015186830182015201612b9a565b81811115612bc8576000602083870101525b50601f01601f19169290920160200192915050565b600061ffff8088168352808716602084015280861660408401525060a06060830152612c0c60a0830185612b90565b905082151560808301529695505050505050565b828152604060208201526000612c396040830184612b4c565b949350505050565b602081526000610cbe6020830184612b90565b6020808252603a908201527f5b736861726b69655d207472616e73616374696f6e206c696d6974207265616360408201527f6865642c2063616e7420627579206d6f726520746f6b656e7321000000000000606082015260800190565b60208082526039908201527f5b736861726b69655d206f6e6c7920617574686f72697a65642077616c6c657460408201527f732063616e2063616c6c20746869732066756e6374696f6e2100000000000000606082015260800190565b6020808252602a908201527f5b736861726b69655d5b6f776e61626c655d2063616c6c6572206973206e6f74604082015269103a34329037bbb732b960b11b606082015260800190565b6020808252602e908201527f5b736861726b69655d2074726164696e67206e6f7420656e61626c656420796560408201526d742c20737461792074756e65642160901b606082015260800190565b85815284602082015260a060408201526000612dc560a0830186612b4c565b6001600160a01b0394909416606083015250608001529392505050565b600061ffff808316818516808303821115612dff57612dff612fa1565b01949350505050565b60008219821115612e1b57612e1b612fa1565b500190565b600082612e3d57634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115612e7d578160001904821115612e6357612e63612fa1565b80851615612e7057918102915b93841c9390800290612e47565b509250929050565b6000610cbe60ff841683600082612e9e57506001610b7b565b81612eab57506000610b7b565b8160018114612ec15760028114612ecb57612ee7565b6001915050610b7b565b60ff841115612edc57612edc612fa1565b50506001821b610b7b565b5060208310610133831016604e8410600b8410161715612f0a575081810a610b7b565b612f148383612e42565b8060001904821115612f2857612f28612fa1565b029392505050565b6000816000190483118215151615612f4a57612f4a612fa1565b500290565b600082821015612f6157612f61612fa1565b500390565b600181811c90821680612f7a57607f821691505b60208210811415612f9b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146116f557600080fdfe5b736861726b69655d2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f5b736861726b69655d207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212209275a0dcf3156d432ce5f5ce868506a29c3396767f4f948389b29111b083fac164736f6c63430008070033
Deployed Bytecode Sourcemap
42003:23596:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55013:98;;;;;;;;;;;;;:::i;:::-;;;16171:25:1;;;16159:2;16144:18;55013:98:0;;;;;;;;51880:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;52539:160::-;;;;;;;;;;-1:-1:-1;52539:160:0;;;;;:::i;:::-;;:::i;:::-;;;8151:14:1;;8144:22;8126:41;;8114:2;8099:18;52539:160:0;7986:187:1;43376:40:0;;;;;;;;;;-1:-1:-1;43376:40:0;;;;-1:-1:-1;;;43376:40:0;;;;;;;;;15438:6:1;15426:19;;;15408:38;;15396:2;15381:18;43376:40:0;15264:188:1;42955:30:0;;;;;;;;;;;;;;;;52156:99;;;;;;;;;;-1:-1:-1;52234:12:0;;52156:99;;54547:296;;;;;;;;;;;;;:::i;43625:24::-;;;;;;;;;;-1:-1:-1;43625:24:0;;;;-1:-1:-1;;;43625:24:0;;;;;;49393:129;;;;;;;;;;-1:-1:-1;49393:129:0;;;;;:::i;:::-;;:::i;:::-;;53720:315;;;;;;;;;;-1:-1:-1;53720:315:0;;;;;:::i;:::-;;:::i;42285:74::-;;;;;;;;;;-1:-1:-1;42285:74:0;;;;-1:-1:-1;;;;;42285:74:0;;;;;;-1:-1:-1;;;;;7330:32:1;;;7312:51;;7300:2;7285:18;42285:74:0;7166:203:1;43494:30:0;;;;;;;;;;-1:-1:-1;43494:30:0;;;;-1:-1:-1;;;43494:30:0;;;;;;52066:82;;;;;;;;;;-1:-1:-1;52130:9:0;;52066:82;;52130:9;;;;17782:36:1;;17770:2;17755:18;52066:82:0;17640:184:1;53058:209:0;;;;;;;;;;-1:-1:-1;53058:209:0;;;;;:::i;:::-;;:::i;54045:94::-;;;;;;;;;;-1:-1:-1;54117:12:0;;-1:-1:-1;;;;;54117:12:0;54081:7;54107:23;;;:9;:23;;;;;;54045:94;;42201:72;;;;;;;;;;-1:-1:-1;42201:72:0;;;;-1:-1:-1;;;;;42201:72:0;;;42163:27;;;;;;;;;;-1:-1:-1;42163:27:0;;;;-1:-1:-1;;;;;42163:27:0;;;43581:33;;;;;;;;;;-1:-1:-1;43581:33:0;;;;-1:-1:-1;;;43581:33:0;;;;;;;;;17617:10:1;17605:23;;;17587:42;;17575:2;17560:18;43581:33:0;17443:192:1;42370:78:0;;;;;;;;;;-1:-1:-1;42370:78:0;;;;-1:-1:-1;;;;;42370:78:0;;;43132:34;;;;;;;;;;-1:-1:-1;43132:34:0;;;;;;;;;;;43227:37;;;;;;;;;;-1:-1:-1;43227:37:0;;;;-1:-1:-1;;;43227:37:0;;;;;;52263:118;;;;;;;;;;-1:-1:-1;52263:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;52354:18:0;52328:7;52354:18;;;:9;:18;;;;;;;52263:118;43037:36;;;;;;;;;;-1:-1:-1;43037:36:0;;;;;;;;49244:141;;;;;;;;;;-1:-1:-1;49244:141:0;;;;;:::i;:::-;;:::i;17740:103::-;;;;;;;;;;;;;:::i;43084:36::-;;;;;;;;;;-1:-1:-1;43084:36:0;;;;;;;;;;;42996:28;;;;;;;;;;;;;;;;48700:536;;;;;;;;;;-1:-1:-1;48700:536:0;;;;;:::i;:::-;;:::i;48298:294::-;;;;;;;;;;;;;:::i;17079:87::-;;;;;;;;;;-1:-1:-1;17125:7:0;17152:6;-1:-1:-1;;;;;17152:6:0;17079:87;;49667:83;;;;;;;;;;;;;:::i;43324:41::-;;;;;;;;;;-1:-1:-1;43324:41:0;;;;-1:-1:-1;;;43324:41:0;;;;;;42914:30;;;;;;;;;;;;;;;;51971:87;;;;;;;;;;;;;:::i;54147:392::-;;;;;;;;;;;;;:::i;54851:154::-;;;;;;;;;;;;;:::i;53275:263::-;;;;;;;;;;-1:-1:-1;53275:263:0;;;;;:::i;:::-;;:::i;53546:166::-;;;;;;;;;;-1:-1:-1;53546:166:0;;;;;:::i;:::-;;:::i;50467:129::-;;;;;;;;;;-1:-1:-1;50467:129:0;;;;;:::i;:::-;;:::i;43535:35::-;;;;;;;;;;-1:-1:-1;43535:35:0;;;;-1:-1:-1;;;43535:35:0;;;;;;49530:129;;;;;;;;;;-1:-1:-1;49530:129:0;;;;;:::i;:::-;;:::i;44889:53::-;;;;;;;;;;-1:-1:-1;44889:53:0;;;;;:::i;:::-;;:::i;43276:35::-;;;;;;;;;;-1:-1:-1;43276:35:0;;;;-1:-1:-1;;;43276:35:0;;;;;;43698:27;;;;;;;;;;;;;;;;42635:75;;;;;;;;;;-1:-1:-1;42635:75:0;;;;-1:-1:-1;;;;;42635:75:0;;;50604:311;;;;;;;;;;-1:-1:-1;50604:311:0;;;;;:::i;:::-;;:::i;52389:142::-;;;;;;;;;;-1:-1:-1;52389:142:0;;;;;:::i;:::-;-1:-1:-1;;;;;52495:18:0;;;52469:7;52495:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;52389:142;43179:37;;;;;;;;;;-1:-1:-1;43179:37:0;;;;-1:-1:-1;;;43179:37:0;;;;;;42547:77;;;;;;;;;;-1:-1:-1;42547:77:0;;;;-1:-1:-1;;;;;42547:77:0;;;48123:167;;;;;;;;;;;;;:::i;43428:38::-;;;;;;;;;;-1:-1:-1;43428:38:0;;;;-1:-1:-1;;;43428:38:0;;;;;;48600:92;;;;;;;;;;-1:-1:-1;48600:92:0;;;;;:::i;:::-;;:::i;17998:211::-;;;;;;;;;;-1:-1:-1;17998:211:0;;;;;:::i;:::-;;:::i;49758:701::-;;;;;;;;;;-1:-1:-1;49758:701:0;;;;;:::i;:::-;;:::i;42459:77::-;;;;;;;;;;-1:-1:-1;42459:77:0;;;;-1:-1:-1;;;;;42459:77:0;;;43660:27;;;;;;;;;;-1:-1:-1;43660:27:0;;;;-1:-1:-1;;;43660:27:0;;;;;;55013:98;54117:12;;-1:-1:-1;;;;;54117:12:0;55051:7;54107:23;;;:9;:23;;;;;;55077:25;;52234:12;;55077:13;:17;;:25::i;:::-;55070:33;;55013:98;:::o;51880:83::-;51916:13;51949:5;51942:13;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51880:83;:::o;52539:160::-;52613:4;52629:39;795:10;52652:7;52661:6;52629:8;:39::i;:::-;-1:-1:-1;52686:4:0;52539:160;;;;;:::o;54547:296::-;54588:7;54607:14;54624:5;;;;;;;;;-1:-1:-1;;;;;54624:5:0;-1:-1:-1;;;;;54624:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54607:31;;54650:16;54668;54689:5;;;;;;;;;-1:-1:-1;;;;;54689:5:0;-1:-1:-1;;;;;54689:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;54649:59:0;;;;-1:-1:-1;54649:59:0;;-1:-1:-1;54730:4:0;-1:-1:-1;;;;;54722:23:0;;;54719:117;;;-1:-1:-1;54768:8:0;54547:296;-1:-1:-1;;54547:296:0:o;54719:117::-;54815:8;54547:296;-1:-1:-1;;;54547:296:0:o;49393:129::-;795:10;45336:32;;;;:18;:32;;;;;;;;45328:102;;;;-1:-1:-1;;;45328:102:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;49478:25:0;;;::::1;;::::0;;;:15:::1;:25;::::0;;;;:36;;-1:-1:-1;;49478:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;49393:129::o;53720:315::-;53817:4;53833:36;53843:6;53851:9;53862:6;53833:9;:36::i;:::-;53880:124;53889:6;795:10;53911:92;53949:6;53911:92;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53911:19:0;;;;;;:11;:19;;;;;;;;795:10;53911:33;;;;;;;;;;:37;:92::i;:::-;53880:8;:124::i;:::-;-1:-1:-1;54022:4:0;53720:315;;;;;:::o;53058:209::-;795:10;53137:4;53185:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;53185:34:0;;;;;;;;;;53137:4;;53153:83;;53176:7;;53185:50;;53224:10;53185:38;:50::i;49244:141::-;795:10;45336:32;;;;:18;:32;;;;;;;;45328:102;;;;-1:-1:-1;;;45328:102:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49335:28:0;;;::::1;;::::0;;;:18:::1;:28;::::0;;;;:42;;-1:-1:-1;;49335:42:0::1;::::0;::::1;;::::0;;;::::1;::::0;;49244:141::o;17740:103::-;17125:7;17152:6;-1:-1:-1;;;;;17152:6:0;795:10;17299:23;17291:78;;;;-1:-1:-1;;;17291:78:0;;;;;;;:::i;:::-;17805:30:::1;17832:1;17805:18;:30::i;:::-;17740:103::o:0;48700:536::-;795:10;45336:32;;;;:18;:32;;;;;;;;45328:102;;;;-1:-1:-1;;;45328:102:0;;;;;;;:::i;:::-;48864:3:::1;48851:8:::0;48825:23:::1;48838:10:::0;48825;:23:::1;:::i;:::-;:34;;;;:::i;:::-;48824:43;;;;48816:99;;;::::0;-1:-1:-1;;;48816:99:0;;10830:2:1;48816:99:0::1;::::0;::::1;10812:21:1::0;10869:2;10849:18;;;10842:30;10908:34;10888:18;;;10881:62;-1:-1:-1;;;10959:18:1;;;10952:41;11010:19;;48816:99:0::1;10628:407:1::0;48816:99:0::1;48931:4;48928:301;;;48951:17;:30:::0;;::::1;49041:26:::0;;::::1;::::0;::::1;-1:-1:-1::0;;48996:30:0;;::::1;::::0;::::1;-1:-1:-1::0;;48996:30:0;;;48951;;::::1;48996::::0;;;;;;;::::1;49041:26;;::::0;;48928:301:::1;;;49098:18;:31:::0;;-1:-1:-1;;49144:31:0;-1:-1:-1;;;49098:31:0::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;49144:31:0;;;;;-1:-1:-1;;;49144:31:0;;::::1;;;-1:-1:-1::0;;;;49190:27:0::1;-1:-1:-1::0;;;49190:27:0;;::::1;::::0;;;::::1;;::::0;;48928:301:::1;48700:536:::0;;;;:::o;48298:294::-;795:10;45336:32;;;;:18;:32;;;;;;;;45328:102;;;;-1:-1:-1;;;45328:102:0;;;;;;;:::i;:::-;48364:15:::1;::::0;::::1;;48363:16;48355:84;;;::::0;-1:-1:-1;;;48355:84:0;;12907:2:1;48355:84:0::1;::::0;::::1;12889:21:1::0;12946:2;12926:18;;;12919:30;12985:34;12965:18;;;12958:62;13056:25;13036:18;;;13029:53;13099:19;;48355:84:0::1;12705:419:1::0;48355:84:0::1;48450:15;:22:::0;;-1:-1:-1;;48450:22:0::1;48468:4;48450:22;::::0;;48498:23:::1;:15;48516:5;48498:23;:::i;:::-;48483:12;:38:::0;48532:12:::1;:19:::0;;-1:-1:-1;;;;48562:22:0;-1:-1:-1;;;48562:22:0;;;48298:294::o;49667:83::-;795:10;45336:32;;;;:18;:32;;;;;;;;45328:102;;;;-1:-1:-1;;;45328:102:0;;;;;;;:::i;:::-;49719:15:::1;:23:::0;;-1:-1:-1;;;;49719:23:0::1;::::0;;49667:83::o;51971:87::-;52009:13;52042:7;52035:15;;;;;:::i;54147:392::-;54238:16;;;54252:1;54238:16;;;;;;;;;54184:7;;;;54238:16;;;;;;;;;;;-1:-1:-1;54238:16:0;54203:51;;54294:4;54265:15;54281:1;54265:18;;;;;;;;:::i;:::-;-1:-1:-1;;;;;54265:34:0;;;:18;;;;;;;;;;:34;;;;54331:7;;:14;;;-1:-1:-1;;;54331:14:0;;;;:7;;;;;:12;;:14;;;;;54265:18;;54331:14;;;;;:7;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54310:15;54326:1;54310:18;;;;;;;;:::i;:::-;-1:-1:-1;;;;;54310:35:0;;;:18;;;;;;;;;:35;54377:18;;54356;;54377;;;54356:15;;54372:1;;54356:18;;;;;;:::i;:::-;-1:-1:-1;;;;;54356:39:0;;;:18;;;;;;;;;:39;54442:7;;:51;;-1:-1:-1;;;54442:51:0;;54406:33;;54442:7;;;;;:21;;:51;;54464:11;;54477:15;;54442:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54442:51:0;;;;;;;;;;;;:::i;:::-;54406:87;;54511:16;54528:1;54511:19;;;;;;;;:::i;:::-;;;;;;;54504:27;;;;54147:392;:::o;54851:154::-;54892:7;54932:54;54964:10;;;;;;;;;-1:-1:-1;;;;;54964:10:0;-1:-1:-1;;;;;54964:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54960:25;;:2;:25;:::i;:::-;54933:21;54945:8;:6;:8::i;:::-;54933:7;:5;:7::i;:::-;:11;;:21::i;:::-;54932:27;;:54::i;53275:263::-;53359:4;53375:132;795:10;53398:7;53407:99;53446:15;53407:99;;;;;;;;;;;;;;;;;795:10;53407:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;53407:34:0;;;;;;;;;;;;:38;:99::i;53546:166::-;53623:4;53639:42;795:10;53663:9;53674:6;53639:9;:42::i;50467:129::-;795:10;45336:32;;;;:18;:32;;;;;;;;45328:102;;;;-1:-1:-1;;;45328:102:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50548:32:0::1;50583:5;50548:32:::0;;;:23:::1;:32;::::0;;;;:40;;-1:-1:-1;;50548:40:0::1;::::0;;50467:129::o;49530:::-;795:10;45336:32;;;;:18;:32;;;;;;;;45328:102;;;;-1:-1:-1;;;45328:102:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49615:26:0;;;::::1;;::::0;;;:16:::1;:26;::::0;;;;:36;;-1:-1:-1;;49615:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;49530:129::o;44889:53::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44889:53:0;;-1:-1:-1;44889:53:0;:::o;50604:311::-;795:10;45336:32;;;;:18;:32;;;;;;;;45328:102;;;;-1:-1:-1;;;45328:102:0;;;;;;;:::i;:::-;50700:85:::1;50729:55;50770:13;;50729:36;50749:15;;50729;;:19;;:36;;;;:::i;:::-;:40:::0;::::1;:55::i;:::-;50718:4;52328:7:::0;52354:18;;;:9;:18;;;;;;50700:24:::1;52263:118:::0;50700:85:::1;50688:7;:98;;50680:169;;;::::0;-1:-1:-1;;;50680:169:0;;14624:2:1;50680:169:0::1;::::0;::::1;14606:21:1::0;14663:2;14643:18;;;14636:30;14702:34;14682:18;;;14675:62;14773:28;14753:18;;;14746:56;14819:19;;50680:169:0::1;14422:422:1::0;50680:169:0::1;50860:47;50887:4;50894:3;50899:7;50860:18;:47::i;:::-;50604:311:::0;;:::o;48123:167::-;795:10;45336:32;;;;:18;:32;;;;;;;;45328:102;;;;-1:-1:-1;;;45328:102:0;;;;;;;:::i;:::-;48188:18:::1;::::0;::::1;::::0;::::1;;;48187:19;48179:77;;;::::0;-1:-1:-1;;;48179:77:0;;11650:2:1;48179:77:0::1;::::0;::::1;11632:21:1::0;11689:2;11669:18;;;11662:30;11728:34;11708:18;;;11701:62;-1:-1:-1;;;11779:18:1;;;11772:43;11832:19;;48179:77:0::1;11448:409:1::0;48179:77:0::1;48267:15;:13;:15::i;48600:92::-:0;795:10;45336:32;;;;:18;:32;;;;;;;;45328:102;;;;-1:-1:-1;;;45328:102:0;;;;;;;:::i;:::-;48663:12:::1;:21:::0;;;::::1;;-1:-1:-1::0;;;48663:21:0::1;-1:-1:-1::0;;;;48663:21:0;;::::1;::::0;;;::::1;::::0;;48600:92::o;17998:211::-;17125:7;17152:6;-1:-1:-1;;;;;17152:6:0;795:10;17299:23;17291:78;;;;-1:-1:-1;;;17291:78:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18087:22:0;::::1;18079:83;;;::::0;-1:-1:-1;;;18079:83:0;;12064:2:1;18079:83:0::1;::::0;::::1;12046:21:1::0;12103:2;12083:18;;;12076:30;12142:34;12122:18;;;12115:62;-1:-1:-1;;;12193:18:1;;;12186:46;12249:19;;18079:83:0::1;11862:412:1::0;18079:83:0::1;18173:28;18192:8;18173:18;:28::i;:::-;17998:211:::0;:::o;49758:701::-;795:10;45336:32;;;;:18;:32;;;;;;;;45328:102;;;;-1:-1:-1;;;45328:102:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49904:32:0;::::1;;::::0;;;:23:::1;:32;::::0;;;;;;;:39;;-1:-1:-1;;49904:39:0;;::::1;49939:4;49904:39;::::0;;;49954:15:::1;:24:::0;;;;;:32;;;;::::1;::::0;;50038:21:::1;:30:::0;;;;;50081:371;::::1;;;50104:42:::0;;::::1;50218:37:::0;;::::1;::::0;::::1;-1:-1:-1::0;;50161:42:0;;::::1;::::0;::::1;-1:-1:-1::0;;50161:42:0;;;50104;;::::1;50161::::0;;;;;;;::::1;50218:37;;::::0;;50081:371:::1;;;50286:43:::0;;-1:-1:-1;;50344:43:0;-1:-1:-1;;;50286:43:0::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;50344:43:0;;;;;-1:-1:-1;;;50344:43:0;;::::1;;;-1:-1:-1::0;;;;50402:38:0::1;-1:-1:-1::0;;;50402:38:0;;::::1;::::0;;;::::1;;::::0;;50081:371:::1;49893:566;49758:701:::0;;;;;:::o;4140:98::-;4198:7;4225:5;4229:1;4225;:5;:::i;52707:343::-;-1:-1:-1;;;;;52800:19:0;;52792:71;;;;-1:-1:-1;;;52792:71:0;;11242:2:1;52792:71:0;;;11224:21:1;11281:2;11261:18;;;11254:30;11320:34;11300:18;;;11293:62;-1:-1:-1;;;11371:18:1;;;11364:37;11418:19;;52792:71:0;11040:403:1;52792:71:0;-1:-1:-1;;;;;52882:21:0;;52874:71;;;;-1:-1:-1;;;52874:71:0;;13807:2:1;52874:71:0;;;13789:21:1;13846:2;13826:18;;;13819:30;13885:34;13865:18;;;13858:62;-1:-1:-1;;;13936:18:1;;;13929:35;13981:19;;52874:71:0;13605:401:1;52874:71:0;-1:-1:-1;;;;;52958:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;53010:32;;16171:25:1;;;53010:32:0;;16144:18:1;53010:32:0;;;;;;;;52707:343;;;:::o;56291:7315::-;56427:12;;56373:31;;-1:-1:-1;;;;;56418:21:0;;;56427:12;;56418:21;56415:233;;;-1:-1:-1;56455:33:0;;;;;;;;;;;;-1:-1:-1;;;56455:33:0;;;;56415:233;;;56515:12;;-1:-1:-1;;;;;56508:19:0;;;56515:12;;56508:19;56505:143;;;-1:-1:-1;56543:32:0;;;;;;;;;;;;-1:-1:-1;;;56543:32:0;;;;56505:143;;;-1:-1:-1;56606:30:0;;;;;;;;;;;;-1:-1:-1;;;56606:30:0;;;;56505:143;56663:15;;-1:-1:-1;;;56663:15:0;;;;:51;;;;;56701:12;;56683:15;:30;56663:51;56660:105;;;56730:15;:23;;-1:-1:-1;;;;56730:23:0;;;56660:105;-1:-1:-1;;;;;56780:22:0;;;;;;:15;:22;;;;;;;;;:46;;-1:-1:-1;;;;;;56806:20:0;;;;;;:15;:20;;;;;;;;56780:46;56777:6822;;;56873:47;56887:1;56890;56893;56896:17;56915:4;56873:47;;;;;;;;;;:::i;:::-;;;;;;;;56937:39;56956:5;56963:3;56968:7;56937:18;:39::i;:::-;56777:6822;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57070:8:0;:6;:8::i;:::-;57040:38;;57093:30;57126:11;:9;:11::i;:::-;57093:44;;57152:28;57197:25;57245:12;;;;;;;;;;;:53;;;;-1:-1:-1;57287:10:0;;-1:-1:-1;;;57287:10:0;;;;57262:35;;57245:53;57244:143;;57368:19;57244:143;;;57335:12;;57302:46;;57314:19;;-1:-1:-1;;;57335:12:0;;;;57302:11;:46::i;:::-;57470:12;;57197:205;;-1:-1:-1;57417:30:0;;-1:-1:-1;;;57470:12:0;;;;:53;;;;-1:-1:-1;57512:10:0;;-1:-1:-1;;;57512:10:0;;;;57487:35;;57470:53;57469:148;;57598:19;57469:148;;;57560:17;;57527:51;;57539:19;;-1:-1:-1;;;57560:17:0;;;;57527:11;:51::i;:::-;57661:12;;57417:215;;-1:-1:-1;;;;;;57652:21:0;;;57661:12;;57652:21;57649:1118;;;57701:15;;;;57693:74;;;;-1:-1:-1;;;57693:74:0;;;;;;;:::i;:::-;57789:12;;-1:-1:-1;;;57789:12:0;;;;:38;;;;-1:-1:-1;;;;;;57806:21:0;;;;;;:16;:21;;;;;;;;57805:22;57789:38;57786:358;;;57870:17;57859:7;:28;;:80;;;;-1:-1:-1;;;;;;57891:14:0;;;;;;:9;:14;;;;;;57922:17;;57891:27;;57910:7;57891:18;:27::i;:::-;:48;;57859:80;57851:146;;;;-1:-1:-1;;;57851:146:0;;10408:2:1;57851:146:0;;;10390:21:1;10447:2;10427:18;;;10420:30;10486:34;10466:18;;;10459:62;-1:-1:-1;;;10537:18:1;;;10530:51;10598:19;;57851:146:0;10206:417:1;57851:146:0;58039:22;58028:7;:33;;58020:104;;;;-1:-1:-1;;;58020:104:0;;;;;;;:::i;:::-;58206:4;58196:7;;;:14;-1:-1:-1;;;;;58232:28:0;;58196:14;58232:28;;;:23;:28;;;;;;;;58229:523;;;-1:-1:-1;;;;;58300:26:0;;;;;;:21;:26;;;;;;;;:39;;;;;58284:55;;58378:39;;;;;58362:13;;;:55;58454:26;;;;;;;:37;;;;;;;58440:11;;;:51;58300:39;;-1:-1:-1;58229:523:0;;;58607:17;;;;;;58591:33;;58663:17;;;;;58647:13;;;:33;58717:15;;;;;58703:11;;;:29;58229:523;58793:12;;-1:-1:-1;;;;;58786:19:0;;;58793:12;;58786:19;58783:1216;;;58833:15;;;;58825:74;;;;-1:-1:-1;;;58825:74:0;;;;;;;:::i;:::-;58921:12;;-1:-1:-1;;;58921:12:0;;;;:38;;;;-1:-1:-1;;;;;;58938:21:0;;;;;;:16;:21;;;;;;;;58937:22;58921:38;58918:189;;;59002:22;58991:7;:33;;58983:104;;;;-1:-1:-1;;;58983:104:0;;;;;;;:::i;:::-;59169:4;59158:8;;;:15;-1:-1:-1;;;;;59195:30:0;;59158:15;59195:30;;;:23;:30;;;;;;;;59192:792;;;-1:-1:-1;;;;;59265:28:0;;;;;;:21;:28;;;;;;;;:42;;-1:-1:-1;;;59265:42:0;;;;59249:58;;-1:-1:-1;;;59346:42:0;;;;59330:13;;;:58;59425:28;;;;;;;-1:-1:-1;;;59425:40:0;;;;;;59411:11;;;:54;59514:4;;-1:-1:-1;59192:792:0;;;59581:18;;;-1:-1:-1;;;59581:18:0;;;;59565:34;;-1:-1:-1;;;59638:18:0;;;;59622:13;;;:34;-1:-1:-1;;;59693:16:0;;;59679:11;;;:30;59737:15;-1:-1:-1;;;59737:15:0;;;;59734:231;;;59796:21;;;-1:-1:-1;;;59796:21:0;;;;59780:37;;-1:-1:-1;;;59860:21:0;;;;59844:13;;;:37;-1:-1:-1;;;59922:19:0;;;;59908:11;;;:33;59734:231;60019:3;:7;;;60018:8;:21;;;;;60031:3;:8;;;60030:9;60018:21;60015:454;;;60062:12;;-1:-1:-1;;;60062:12:0;;;;:38;;;;-1:-1:-1;;;;;;60079:21:0;;;;;;:16;:21;;;;;;;;60078:22;60062:38;60059:236;;;60143:17;60132:7;:28;;:80;;;;-1:-1:-1;;;;;;60164:14:0;;;;;;:9;:14;;;;;;60195:17;;60164:27;;60183:7;60164:18;:27::i;:::-;:48;;60132:80;60124:151;;;;-1:-1:-1;;;60124:151:0;;9554:2:1;60124:151:0;;;9536:21:1;9593:2;9573:18;;;9566:30;9632:34;9612:18;;;9605:62;9703:28;9683:18;;;9676:56;9749:19;;60124:151:0;9352:422:1;60124:151:0;60382:1;60366:17;;;60402:13;;;:17;;;60438:11;;;:15;60015:454;60516:100;60530:3;:13;;;60545:3;:13;;;60560:3;:11;;;60573:17;60592:23;60516:100;;;;;;;;;;:::i;:::-;;;;;;;;60636:13;;:17;;;60633:331;;60694:35;60706:7;60715:3;:13;;;60694:11;:35::i;:::-;60673:18;;;:56;;;60760:9;;;;:33;;:13;:33::i;:::-;60748:9;;;:45;60850:18;;;;60830:15;;:39;;:19;:39::i;:::-;60812:15;:57;;;;60888:60;60907:5;60922:4;60929:3;:18;;;60888;:60::i;:::-;60983:13;;;;:17;;;60980:331;;61041:35;61053:7;61062:3;:13;;;61041:11;:35::i;:::-;61020:18;;;:56;;;61107:9;;;;:33;;:13;:33::i;:::-;61095:9;;;:45;61197:18;;;;61177:15;;:39;;:19;:39::i;:::-;61159:15;:57;;;;61235:60;61254:5;61269:4;61276:3;:18;;;61235;:60::i;:::-;61330:11;;;;:15;;;61327:315;;61384:33;61396:7;61405:3;:11;;;61384;:33::i;:::-;61365:16;;;:52;;;61448:9;;;;:31;;:13;:31::i;:::-;61436:9;;;:43;61532:16;;;;61514:13;;:35;;:17;:35::i;:::-;61498:13;:51;;;;61568:58;61587:5;61602:4;61609:3;:16;;;61568:18;:58::i;:::-;61662:9;;;;;;;61661:10;:35;;;;-1:-1:-1;61684:12:0;;-1:-1:-1;;;;;61675:21:0;;;61684:12;;61675:21;;61661:35;61658:1859;;;61716:20;61739:55;61780:13;;61739:36;61759:15;;61739;;:19;;:36;;;;:::i;:55::-;61716:78;;61813:20;61836:28;61851:12;61836:14;:28::i;:::-;61813:51;;61883:30;61932;61981:28;62051:1;62033:15;;:19;62030:331;;;62116:99;62196:18;;62116:75;62178:12;62116:57;62160:12;62116:39;62136:18;;62116:15;;:19;;:39;;;;:::i;:99::-;62257:17;;62091:124;;-1:-1:-1;62238:61:0;;-1:-1:-1;;;;;62257:17:0;62091:124;62238:18;:61::i;:::-;-1:-1:-1;62340:1:0;62322:15;:19;62030:331;62384:15;;:19;62381:316;;62452:99;62532:18;;62452:75;62514:12;62452:57;62496:12;62452:39;62472:18;;62452:15;;:19;;:39;;;;:::i;:99::-;62593:17;;62427:124;;-1:-1:-1;62574:61:0;;-1:-1:-1;;;;;62593:17:0;62427:124;62574:18;:61::i;:::-;-1:-1:-1;62676:1:0;62658:15;:19;62381:316;62720:13;;:17;62717:304;;62784:97;62862:18;;62784:73;62844:12;62784:55;62826:12;62784:37;62802:18;;62784:13;;:17;;:37;;;;:::i;:97::-;62923:15;;62761:120;;-1:-1:-1;62904:57:0;;-1:-1:-1;;;;;62923:15:0;62761:120;62904:18;:57::i;:::-;-1:-1:-1;63000:1:0;62984:13;:17;62717:304;63044:21;:25;63041:300;;63108:39;:12;63125:21;63108:16;:39::i;:::-;63093:54;-1:-1:-1;63193:47:0;:20;63218:21;63193:24;:47::i;:::-;63282:15;;63170:70;;-1:-1:-1;63263:58:0;;-1:-1:-1;;;;;63282:15:0;63299:21;63263:18;:58::i;:::-;;63041:300;63396:105;;;17278:25:1;;;17334:2;17319:18;;17312:34;;;17362:18;;;17355:34;;;17420:2;17405:18;;17398:34;;;63396:105:0;;17265:3:1;17250:19;63396:105:0;;;;;;;61697:1820;;;;;61658:1859;63533:54;63552:5;63559:3;63564:22;63576:3;:9;;;63564:7;:11;;:22;;;;:::i;:::-;63533:18;:54::i;:::-;56992:6607;;;;;;56362:7244;56291:7315;;;:::o;6038:240::-;6158:7;6219:12;6211:6;;;;6203:29;;;;-1:-1:-1;;;6203:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;6254:5:0;;;6038:240::o;3759:98::-;3817:7;3844:5;3848:1;3844;:5;:::i;18369:191::-;18443:16;18462:6;;-1:-1:-1;;;;;18479:17:0;;;-1:-1:-1;;;;;;18479:17:0;;;;;;18512:40;;18462:6;;;;;;;18512:40;;18443:16;18512:40;18432:128;18369:191;:::o;4497:98::-;4555:7;4582:5;4586:1;4582;:5;:::i;4896:98::-;4954:7;4981:5;4985:1;4981;:5;:::i;63614:249::-;-1:-1:-1;;;;;63724:16:0;;;;;;:9;:16;;;;;;:29;;63745:7;63724:20;:29::i;:::-;-1:-1:-1;;;;;63705:16:0;;;;;;;:9;:16;;;;;;:48;;;;63781:14;;;;;;;:27;;63800:7;63781:18;:27::i;:::-;-1:-1:-1;;;;;63764:14:0;;;;;;;:9;:14;;;;;;;:44;;;;63826:29;;;;;;;;;;63847:7;16171:25:1;;16159:2;16144:18;;16025:177;64903:693:0;64964:21;65026:24;65071:11;;;;;:62;;-1:-1:-1;65104:4:0;65086:24;;;;:9;:24;;;;;;:47;-1:-1:-1;65086:47:0;65071:62;65063:142;;;;-1:-1:-1;;;65063:142:0;;13331:2:1;65063:142:0;;;13313:21:1;13370:2;13350:18;;;13343:30;13409:34;13389:18;;;13382:62;13480:34;13460:18;;;13453:62;-1:-1:-1;;;13531:19:1;;;13524:34;13575:19;;65063:142:0;13129:471:1;65063:142:0;65253:47;;;16968:25:1;;;17024:2;17009:18;;17002:34;;;65253:47:0;;16941:18:1;65253:47:0;;;;;;;65313:7;;65460:17;;65313:205;;-1:-1:-1;;;65313:205:0;;65374:4;65313:205;;;7715:34:1;7765:18;;;7758:34;;;65313:7:0;7808:18:1;;;7801:34;;;7851:18;;;7844:34;-1:-1:-1;;;;;65460:17:0;;;7894:19:1;;;7887:44;65492:15:0;7947:19:1;;;7940:35;65313:7:0;;;:23;;65343:7;;7649:19:1;;65313:205:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;65531:18:0;:25;;-1:-1:-1;;65531:25:0;;;;;-1:-1:-1;65569:19:0;:17;:19::i;64691:143::-;64767:7;64793:32;64819:5;64793:21;:7;:21;;;:11;:21::i;64086:136::-;45508:9;:16;;-1:-1:-1;;45508:16:0;;;;;64187:17:::1;64181:32:::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;64155:7;;64181:32:::1;::::0;;;64187:17;;64181:32;;::::1;64187:17:::0;64181:32;;::::1;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;64181:32:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;64206:6;64181:5;:32::i;:::-;45555:9:::0;:17;;-1:-1:-1;;45555:17:0;;;64174:40;64086:136;-1:-1:-1;;64086:136:0:o;63871:207::-;64021:26;;63945:4;;63990:3;;63945:4;;-1:-1:-1;;;;;64021:7:0;;;64035;;63945:4;64021:26;63945:4;64021:26;64035:7;64021;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64005:42:0;;63871:207;-1:-1:-1;;;;;;63871:207:0:o;64230:453::-;64378:7;;:185;;-1:-1:-1;;;64378:185:0;;64302:7;;64346:21;;-1:-1:-1;;;;;64378:7:0;;;;:58;;:185;;64451:7;;64302;;64489:5;;64517:4;;64537:15;;64378:185;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64600:21:0;;-1:-1:-1;64639:35:0;;-1:-1:-1;64600:21:0;;-1:-1:-1;64659:14:0;64639:19;:35::i;:::-;64632:43;64230:453;-1:-1:-1;;;;;64230:453:0:o;14:160:1:-;79:20;;135:13;;128:21;118:32;;108:60;;164:1;161;154:12;108:60;14:160;;;:::o;179:188::-;258:13;;-1:-1:-1;;;;;300:42:1;;290:53;;280:81;;357:1;354;347:12;372:159;439:20;;499:6;488:18;;478:29;;468:57;;521:1;518;511:12;536:247;595:6;648:2;636:9;627:7;623:23;619:32;616:52;;;664:1;661;654:12;616:52;703:9;690:23;722:31;747:5;722:31;:::i;788:251::-;858:6;911:2;899:9;890:7;886:23;882:32;879:52;;;927:1;924;917:12;879:52;959:9;953:16;978:31;1003:5;978:31;:::i;1044:388::-;1112:6;1120;1173:2;1161:9;1152:7;1148:23;1144:32;1141:52;;;1189:1;1186;1179:12;1141:52;1228:9;1215:23;1247:31;1272:5;1247:31;:::i;:::-;1297:5;-1:-1:-1;1354:2:1;1339:18;;1326:32;1367:33;1326:32;1367:33;:::i;:::-;1419:7;1409:17;;;1044:388;;;;;:::o;1437:456::-;1514:6;1522;1530;1583:2;1571:9;1562:7;1558:23;1554:32;1551:52;;;1599:1;1596;1589:12;1551:52;1638:9;1625:23;1657:31;1682:5;1657:31;:::i;:::-;1707:5;-1:-1:-1;1764:2:1;1749:18;;1736:32;1777:33;1736:32;1777:33;:::i;:::-;1437:456;;1829:7;;-1:-1:-1;;;1883:2:1;1868:18;;;;1855:32;;1437:456::o;1898:315::-;1963:6;1971;2024:2;2012:9;2003:7;1999:23;1995:32;1992:52;;;2040:1;2037;2030:12;1992:52;2079:9;2066:23;2098:31;2123:5;2098:31;:::i;:::-;2148:5;-1:-1:-1;2172:35:1;2203:2;2188:18;;2172:35;:::i;:::-;2162:45;;1898:315;;;;;:::o;2218:533::-;2307:6;2315;2323;2331;2339;2392:3;2380:9;2371:7;2367:23;2363:33;2360:53;;;2409:1;2406;2399:12;2360:53;2448:9;2435:23;2467:31;2492:5;2467:31;:::i;:::-;2517:5;-1:-1:-1;2541:37:1;2574:2;2559:18;;2541:37;:::i;:::-;2531:47;;2597:37;2630:2;2619:9;2615:18;2597:37;:::i;:::-;2587:47;;2653:37;2686:2;2675:9;2671:18;2653:37;:::i;:::-;2643:47;;2709:36;2740:3;2729:9;2725:19;2709:36;:::i;:::-;2699:46;;2218:533;;;;;;;;:::o;2756:315::-;2824:6;2832;2885:2;2873:9;2864:7;2860:23;2856:32;2853:52;;;2901:1;2898;2891:12;2853:52;2940:9;2927:23;2959:31;2984:5;2959:31;:::i;:::-;3009:5;3061:2;3046:18;;;;3033:32;;-1:-1:-1;;;2756:315:1:o;3076:1116::-;3171:6;3202:2;3245;3233:9;3224:7;3220:23;3216:32;3213:52;;;3261:1;3258;3251:12;3213:52;3294:9;3288:16;3323:18;3364:2;3356:6;3353:14;3350:34;;;3380:1;3377;3370:12;3350:34;3418:6;3407:9;3403:22;3393:32;;3463:7;3456:4;3452:2;3448:13;3444:27;3434:55;;3485:1;3482;3475:12;3434:55;3514:2;3508:9;3536:2;3532;3529:10;3526:36;;;3542:18;;:::i;:::-;3588:2;3585:1;3581:10;3620:2;3614:9;3683:2;3679:7;3674:2;3670;3666:11;3662:25;3654:6;3650:38;3738:6;3726:10;3723:22;3718:2;3706:10;3703:18;3700:46;3697:72;;;3749:18;;:::i;:::-;3785:2;3778:22;3835:18;;;3869:15;;;;-1:-1:-1;3904:11:1;;;3934;;;3930:20;;3927:33;-1:-1:-1;3924:53:1;;;3973:1;3970;3963:12;3924:53;3995:1;3986:10;;4005:156;4019:2;4016:1;4013:9;4005:156;;;4076:10;;4064:23;;4037:1;4030:9;;;;;4107:12;;;;4139;;4005:156;;;-1:-1:-1;4180:6:1;3076:1116;-1:-1:-1;;;;;;;;3076:1116:1:o;4197:180::-;4253:6;4306:2;4294:9;4285:7;4281:23;4277:32;4274:52;;;4322:1;4319;4312:12;4274:52;4345:26;4361:9;4345:26;:::i;4382:450::-;4469:6;4477;4485;4538:2;4526:9;4517:7;4513:23;4509:32;4506:52;;;4554:1;4551;4544:12;4506:52;4577:40;4607:9;4577:40;:::i;:::-;4567:50;;4636:49;4681:2;4670:9;4666:18;4636:49;:::i;:::-;4626:59;;4728:2;4717:9;4713:18;4707:25;4772:10;4765:5;4761:22;4754:5;4751:33;4741:61;;4798:1;4795;4788:12;4741:61;4821:5;4811:15;;;4382:450;;;;;:::o;4837:397::-;4917:6;4925;4933;4941;4994:3;4982:9;4973:7;4969:23;4965:33;4962:53;;;5011:1;5008;5001:12;4962:53;5034:28;5052:9;5034:28;:::i;:::-;5024:38;;5081:37;5114:2;5103:9;5099:18;5081:37;:::i;:::-;5071:47;;5137:37;5170:2;5159:9;5155:18;5137:37;:::i;:::-;5127:47;;5193:35;5224:2;5213:9;5209:18;5193:35;:::i;:::-;5183:45;;4837:397;;;;;;;:::o;5239:180::-;5298:6;5351:2;5339:9;5330:7;5326:23;5322:32;5319:52;;;5367:1;5364;5357:12;5319:52;-1:-1:-1;5390:23:1;;5239:180;-1:-1:-1;5239:180:1:o;5424:306::-;5512:6;5520;5528;5581:2;5569:9;5560:7;5556:23;5552:32;5549:52;;;5597:1;5594;5587:12;5549:52;5626:9;5620:16;5610:26;;5676:2;5665:9;5661:18;5655:25;5645:35;;5720:2;5709:9;5705:18;5699:25;5689:35;;5424:306;;;;;:::o;5735:273::-;5803:6;5856:2;5844:9;5835:7;5831:23;5827:32;5824:52;;;5872:1;5869;5862:12;5824:52;5904:9;5898:16;5954:4;5947:5;5943:16;5936:5;5933:27;5923:55;;5974:1;5971;5964:12;6013:461;6066:3;6104:5;6098:12;6131:6;6126:3;6119:19;6157:4;6186:2;6181:3;6177:12;6170:19;;6223:2;6216:5;6212:14;6244:1;6254:195;6268:6;6265:1;6262:13;6254:195;;;6333:13;;-1:-1:-1;;;;;6329:39:1;6317:52;;6389:12;;;;6424:15;;;;6365:1;6283:9;6254:195;;;-1:-1:-1;6465:3:1;;6013:461;-1:-1:-1;;;;;6013:461:1:o;6479:472::-;6521:3;6559:5;6553:12;6586:6;6581:3;6574:19;6611:1;6621:162;6635:6;6632:1;6629:13;6621:162;;;6697:4;6753:13;;;6749:22;;6743:29;6725:11;;;6721:20;;6714:59;6650:12;6621:162;;;6801:6;6798:1;6795:13;6792:87;;;6867:1;6860:4;6851:6;6846:3;6842:16;6838:27;6831:38;6792:87;-1:-1:-1;6933:2:1;6912:15;-1:-1:-1;;6908:29:1;6899:39;;;;6940:4;6895:50;;6479:472;-1:-1:-1;;6479:472:1:o;8178:590::-;8417:4;8446:6;8491:2;8483:6;8479:15;8468:9;8461:34;8543:2;8535:6;8531:15;8526:2;8515:9;8511:18;8504:43;8595:2;8587:6;8583:15;8578:2;8567:9;8563:18;8556:43;;8635:3;8630:2;8619:9;8615:18;8608:31;8656:46;8697:3;8686:9;8682:19;8674:6;8656:46;:::i;:::-;8648:54;;8753:6;8746:14;8739:22;8733:3;8722:9;8718:19;8711:51;8178:590;;;;;;;;:::o;8773:349::-;8997:6;8986:9;8979:25;9040:2;9035;9024:9;9020:18;9013:30;8960:4;9060:56;9112:2;9101:9;9097:18;9089:6;9060:56;:::i;:::-;9052:64;8773:349;-1:-1:-1;;;;8773:349:1:o;9127:220::-;9276:2;9265:9;9258:21;9239:4;9296:45;9337:2;9326:9;9322:18;9314:6;9296:45;:::i;9779:422::-;9981:2;9963:21;;;10020:2;10000:18;;;9993:30;10059:34;10054:2;10039:18;;10032:62;10130:28;10125:2;10110:18;;10103:56;10191:3;10176:19;;9779:422::o;12279:421::-;12481:2;12463:21;;;12520:2;12500:18;;;12493:30;12559:34;12554:2;12539:18;;12532:62;12630:27;12625:2;12610:18;;12603:55;12690:3;12675:19;;12279:421::o;14011:406::-;14213:2;14195:21;;;14252:2;14232:18;;;14225:30;14291:34;14286:2;14271:18;;14264:62;-1:-1:-1;;;14357:2:1;14342:18;;14335:40;14407:3;14392:19;;14011:406::o;14849:410::-;15051:2;15033:21;;;15090:2;15070:18;;;15063:30;15129:34;15124:2;15109:18;;15102:62;-1:-1:-1;;;15195:2:1;15180:18;;15173:44;15249:3;15234:19;;14849:410::o;16207:582::-;16506:6;16495:9;16488:25;16549:6;16544:2;16533:9;16529:18;16522:34;16592:3;16587:2;16576:9;16572:18;16565:31;16469:4;16613:57;16665:3;16654:9;16650:19;16642:6;16613:57;:::i;:::-;-1:-1:-1;;;;;16706:32:1;;;;16701:2;16686:18;;16679:60;-1:-1:-1;16770:3:1;16755:19;16748:35;16605:65;16207:582;-1:-1:-1;;;16207:582:1:o;17829:224::-;17868:3;17896:6;17929:2;17926:1;17922:10;17959:2;17956:1;17952:10;17990:3;17986:2;17982:12;17977:3;17974:21;17971:47;;;17998:18;;:::i;:::-;18034:13;;17829:224;-1:-1:-1;;;;17829:224:1:o;18058:128::-;18098:3;18129:1;18125:6;18122:1;18119:13;18116:39;;;18135:18;;:::i;:::-;-1:-1:-1;18171:9:1;;18058:128::o;18191:217::-;18231:1;18257;18247:132;;18301:10;18296:3;18292:20;18289:1;18282:31;18336:4;18333:1;18326:15;18364:4;18361:1;18354:15;18247:132;-1:-1:-1;18393:9:1;;18191:217::o;18413:422::-;18502:1;18545:5;18502:1;18559:270;18580:7;18570:8;18567:21;18559:270;;;18639:4;18635:1;18631:6;18627:17;18621:4;18618:27;18615:53;;;18648:18;;:::i;:::-;18698:7;18688:8;18684:22;18681:55;;;18718:16;;;;18681:55;18797:22;;;;18757:15;;;;18559:270;;;18563:3;18413:422;;;;;:::o;18840:140::-;18898:5;18927:47;18968:4;18958:8;18954:19;18948:4;19034:5;19064:8;19054:80;;-1:-1:-1;19105:1:1;19119:5;;19054:80;19153:4;19143:76;;-1:-1:-1;19190:1:1;19204:5;;19143:76;19235:4;19253:1;19248:59;;;;19321:1;19316:130;;;;19228:218;;19248:59;19278:1;19269:10;;19292:5;;;19316:130;19353:3;19343:8;19340:17;19337:43;;;19360:18;;:::i;:::-;-1:-1:-1;;19416:1:1;19402:16;;19431:5;;19228:218;;19530:2;19520:8;19517:16;19511:3;19505:4;19502:13;19498:36;19492:2;19482:8;19479:16;19474:2;19468:4;19465:12;19461:35;19458:77;19455:159;;;-1:-1:-1;19567:19:1;;;19599:5;;19455:159;19646:34;19671:8;19665:4;19646:34;:::i;:::-;19716:6;19712:1;19708:6;19704:19;19695:7;19692:32;19689:58;;;19727:18;;:::i;:::-;19765:20;;18985:806;-1:-1:-1;;;18985:806:1:o;19796:168::-;19836:7;19902:1;19898;19894:6;19890:14;19887:1;19884:21;19879:1;19872:9;19865:17;19861:45;19858:71;;;19909:18;;:::i;:::-;-1:-1:-1;19949:9:1;;19796:168::o;19969:125::-;20009:4;20037:1;20034;20031:8;20028:34;;;20042:18;;:::i;:::-;-1:-1:-1;20079:9:1;;19969:125::o;20099:380::-;20178:1;20174:12;;;;20221;;;20242:61;;20296:4;20288:6;20284:17;20274:27;;20242:61;20349:2;20341:6;20338:14;20318:18;20315:38;20312:161;;;20395:10;20390:3;20386:20;20383:1;20376:31;20430:4;20427:1;20420:15;20458:4;20455:1;20448:15;20312:161;;20099:380;;;:::o;20484:127::-;20545:10;20540:3;20536:20;20533:1;20526:31;20576:4;20573:1;20566:15;20600:4;20597:1;20590:15;20616:127;20677:10;20672:3;20668:20;20665:1;20658:31;20708:4;20705:1;20698:15;20732:4;20729:1;20722:15;20748:127;20809:10;20804:3;20800:20;20797:1;20790:31;20840:4;20837:1;20830:15;20864:4;20861:1;20854:15;20880:131;-1:-1:-1;;;;;20955:31:1;;20945:42;;20935:70;;21001:1;20998;20991:12
Swarm Source
ipfs://9275a0dcf3156d432ce5f5ce868506a29c3396767f4f948389b29111b083fac1
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.