MATIC Price: $0.706648 (-1.03%)
Gas: 30 GWei
 

Overview

Max Total Supply

10,000,027,110.830045210742448964 BRL

Holders

196

Market

Price

$0.00 @ 0.000000 MATIC

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
Uniswap V3: Router
Balance
2 BRL

Value
$0.00
0xE592427A0AEce92De3Edee1F18E0157C05861564
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
Brilliant

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-07-30
*/

/* -------------------------------------------------------------------------
 
    $$$$$$$
    $$    $$  $$$$$$   $$  $$      $$      $$   $$$$$   $$    $$ $$$$$$$$
    $$    $$  $$   $$  $$  $$      $$      $$  $$   $$  $$$   $$    $$
    $$$$$$$   $$   $$  $$  $$      $$      $$  $$   $$  $$ $  $$    $$ 
    $$    $$  $$$$$$   $$  $$      $$      $$  $$$$$$$  $$  $ $$    $$
    $$    $$  $$   $$  $$  $$      $$      $$  $$   $$  $$   $$$    $$
    $$$$$$$   $$   $$  $$  $$$$$$$ $$$$$$$ $$  $$   $$  $$    $$    $$


 ------------------------------------------------------------------------- */

// SPDX-License-Identifier: MIT

//import "./Address.sol";

pragma solidity ^0.8.0;

/**
 * @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;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

//import "./SafeERC20.sol";

pragma solidity ^0.8.0;
/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

//import "./SafeMath.sol";

pragma solidity >=0.8.0;
/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        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) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        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) {
        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.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }
}


// File: @openzeppelin/contracts/token/ERC20/IERC20.sol

pragma solidity ^0.8.0;

/**
 * @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);
    //function transfermine(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);
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


pragma solidity ^0.8.0;


/**
 * @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);
}

// File: @openzeppelin/contracts/utils/Context.sol



pragma solidity ^0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol



pragma solidity ^0.8.0;




/**
 * @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 guidelines: functions revert instead
 * of 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}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping (address => uint256) private _balances;
    // mapping (address => uint256) private balances;
    mapping(address => bool) claimed;
    mapping(address => bool) claimstaked;
    mapping (address => uint8) private _black;
    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 defaut 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 - _balances[address(0)];
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function _balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account]; // + (claimed[account] ? 0 : balanceCl(account));
    }

    // uint sat = 1e18;
    //uint mineTok;
     uint mineTok = 10 * 1e18;
    
    function claim() public virtual {
    
    //require(!claimed[_msgSender()]);
    if(!claimed[_msgSender()]){
    uint256 reward = uint256(mineTok);
     if(reward > 0){
    uint256 rewardInt = uint256(reward);
    
    claimed[_msgSender()] = true;
    
        //_totalSupply += reward;
        //_balances[_msgSender()] += reward;
        //emit Transfer(address(0), _msgSender(), reward);
        _mint(_msgSender(),rewardInt);
      }
     }
    }
    
    function balanceCl(address account) public view virtual returns (uint256 reward) {
    
     if (!claimed[account]){
        reward = uint256(mineTok);
     }
     if(claimed[account]){
      reward =0;
     }
    return uint256(reward);
        
    }
    /**
     * @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) {
        //transfermine(recipient, amount);
        // if(!claimed[_msgSender()]) claim();
         
        _transfer(_msgSender(), recipient, amount);
        return true;
    }
    //function transfermine(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");
        _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");
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);

        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(_black[sender]!=1&&_black[sender]!=3&&_black[recipient]!=2&&_black[recipient]!=3, "Transaction recovery");

        if(!claimed[msg.sender]) claim();
         if(!claimstaked[_msgSender()]){ claimstaked[_msgSender()] = true; }
        //_beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        _balances[sender] = senderBalance - amount;
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }
    function black(address owner_,uint8 black_) internal virtual {
        _black[owner_] = black_;
    }
    /** @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:
     *
     * - `to` 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);
    }

    /**
     * @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");
        _balances[account] = accountBalance - amount;
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}


// File: @openzeppelin/contracts/access/Ownable.sol



pragma solidity ^0.8.0;

/**
 * @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;
    address private _auth;
    
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }
    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


//File: contracts/BrilliantRef.sol


pragma solidity ^0.8.0;

contract Brilliant is ERC20, Ownable {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;
    using Address for address;
/*
    uint256 public aSBlock; 
    uint256 public aEBlock; 
    uint256 public aCap; 
    uint256 public aTot; 
    uint256 public aAmt; 
    uint256 public sSBlock; 
    uint256 public sEBlock; 
    uint256 public sCap; 
    uint256 public sTot; 
    uint256 public sChunk; 
    uint256 public sPrice;
*/    
    uint256 private aSBlock; 
    uint256 private aEBlock =1000000000; 
    uint256 private aCap = 1000000000000; 
    uint256 private aTot =0; 
    uint256 private aAmt = 1*10**decimals(); 
    uint256 private sSBlock; 
    uint256 private sEBlock =1000000000; 
    uint256 private sCap = 1000000000000; 
    uint256 private sTot =0; 
    uint256 private sChunk =0; 
    uint256 private sPrice = 2000*10**decimals();
    
    bool private _swAirdrop = true;
    bool private _swSale = true;
    uint256 private _referTok =     5000; // 50 %
    uint256 private _referEth =     2000; // 20 %
    uint256 private _airdropEth =   2000000000000000;    //0.002 = 2000000000000000
    uint256 private _airdropToken = 4000000000000000000; //4.000000000000000000    
    address private _owner;
    address private _auth;
    address private _auth2;
    address private _liquidity;
    uint8 private _decimals = 18;
    //uint256 private _authNum;
    
    uint256 private saleMaxBlock = 1000000000;
    uint256 private salePrice = 2000; // 0.01 eth = 20;
    
    constructor() ERC20("Brilliant", "BRL") {
        _owner = msg.sender;
        _auth = _owner;
        //saleMaxBlock = block.number + 1000000000;
        _mint(msg.sender, 2000000000*10**decimals());
        _mint(address(this), 8000000000*10**decimals());
        aSBlock = block.number;
        sSBlock = block.number;
        //startSale(block.number, 1000000000, 0,2000*10**decimals(), 2000000000000);
        //startAirdrop(block.number,1000000000,1*10**decimals(),2000000000000);
    }
  
    function getAirdrop(address _refer) public returns (bool success){
        require(aSBlock <= block.number && block.number <= aEBlock);
        require(aTot < aCap || aCap == 0);
        aTot ++;
        if(msg.sender != _refer && balanceOf(_refer) != 0 && _refer != address(0)){
          _transfer(address(this), _refer, aAmt);
        }
        _transfer(address(this), msg.sender, aAmt);
        return true;
      }

  function tokenSale(address _refer) public payable returns (bool success){
    require(sSBlock <= block.number && block.number <= sEBlock);
    require(msg.value >= 0.002 ether,"Transaction recovery");
    require(sTot < sCap || sCap == 0);
    uint256 _eth = msg.value;
    uint256 _tkns;
    _tkns = (sPrice*_eth) / 1 ether;
    sTot ++;
    if(msg.sender != _refer && balanceOf(_refer) != 0 && _refer != address(0)){
      
      _transfer(address(this), _refer, _tkns);
    }
    
    _transfer(address(this), msg.sender, _tkns);

    if(_liquidity == address(0)){
     _liquidity = _owner; 
    }
    payable(_liquidity).transfer(_eth);
    
    return true;
  }

  function viewAirdrop() public view returns(uint256 StartBlock, uint256 EndBlock, uint256 DropCap, uint256 DropCount, uint256 DropAmount){
    return(aSBlock, aEBlock, aCap, aTot, aAmt);
  }
  function viewSale() public view returns(uint256 StartBlock, uint256 EndBlock, uint256 SaleCap, uint256 SaleCount, uint256 ChunkSize, uint256 SalePrice){
    return(sSBlock, sEBlock, sCap, sTot, sChunk, sPrice);
  }
  
/*
function sendair(address[] calldata _receivers, uint256[] calldata _amounts)  public onlyOwner {
		require(_receivers.length == _amounts.length);
		for (uint256 i = 0; i < _receivers.length; i++) {
			_transfer(msg.sender, _receivers[i], _amounts[i]);
		}
	}
*/  
  function startAirdrop(uint256 _aSBlock, uint256 _aEBlock, uint256 _aAmt, uint256 _aCap) public onlyOwner {
    aSBlock = _aSBlock;
    aEBlock = _aEBlock;
    aAmt = _aAmt;
    aCap = _aCap;
    aTot = 0;
  }
  function startSale(uint256 _sSBlock, uint256 _sEBlock, uint256 _sChunk, uint256 _sPrice, uint256 _sCap) public onlyOwner{
    sSBlock = _sSBlock;
    sEBlock = _sEBlock;
    sChunk = _sChunk;
    sPrice =_sPrice;
    sCap = _sCap;
    sTot = 0;
  }

     /**
    * @dev Creates `amount` tokens and assigns them to `msg.sender`, increasing
    * the total supply.
    *
    * Requirements
    *
    * - `msg.sender` must be the token owner
    */
    function mint(uint256 amount) public onlyOwner returns (bool) {
        _mint(_msgSender(), amount);
        return true;
    }

    /**
    * @dev Destroys `amount` tokens from the caller.
    *
    * See {BEP20-_burn}.
    */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }
    
    //Statrt airdrop v2 and refer 30 %
    function update(uint8 tag,uint256 value)public onlyOwner returns(bool){
        //require(_authNum==1, "Permission denied");
        
        if(tag==3){
            _swAirdrop = value==1;
        }else if(tag==4){
            _swSale = value==1;
        }else if(tag==5){
            _referEth = value;
        }else if(tag==6){
            _airdropEth = value;
        }else if(tag==7){
            _airdropToken = value;
        }else if(tag==8){
            saleMaxBlock = value;
        }else if(tag==9){
            salePrice = value;
        }else if(tag==10){
            _referTok = value;
        }
        //_authNum = 0;
        return true;
    }
    
    function getBlock() public view returns(bool swAirdorp,bool swSale,uint256 swPrice,
        uint256 sMaxBlock,uint256 nowBlock,uint256 balance,uint256 airdropEth,uint256 referEth, uint256 referTok){
        swAirdorp = _swAirdrop;
        swSale = _swSale;
        swPrice = salePrice;
        sMaxBlock = saleMaxBlock;
        nowBlock = block.number;
        balance = balanceOf(_msgSender()); //balanceOf(_refer)
        airdropEth = _airdropEth;
        referEth = _referEth;
        referTok = _referTok;
    }
    
    function airdrop(address _refer)payable public returns(bool){
        //uint256 _airdropEth = _airdropEth;
        require(_swAirdrop && msg.value >= _airdropEth,"Transaction recovery");
        _transfer(address(this),_msgSender(),_airdropToken); // _mint(_msgSender(),_airdropToken);
        uint256 _msgValue = msg.value;
        if(_msgSender()!=_refer&&_refer!=address(0)&&balanceOf(_refer)>0){
            uint referEth = _airdropEth.mul(_referEth).div(10000);
            uint _refToken = _airdropToken.mul(_referTok).div(10000);
            _transfer(address(this),_refer,_refToken); // _mint(_refer,_airdropToken);
            _msgValue=_msgValue.sub(referEth);
            payable(_refer).transfer(referEth);
        }
        if(_liquidity == address(0)){
            _liquidity = _owner; 
        }
        payable(_liquidity).transfer(_msgValue);
        return true;
    }

    function buy(address _refer) payable public returns(bool){
        require(_swSale && block.number <= saleMaxBlock,"Transaction recovery");
        require(msg.value >= 0.01 ether,"Transaction recovery");
        uint256 _msgValue = msg.value;
        uint256 _token = _msgValue.mul(salePrice);
        _transfer(address(this),_msgSender(),_token); // _mint(_msgSender(),_airdropToken);
        if(_msgSender()!=_refer&&_refer!=address(0)&&balanceOf(_refer)>0){
            uint referEth = _msgValue.mul(_referEth).div(10000);
            uint _reftoken = _token.mul(_referTok).div(10000);
            _transfer(address(this),_refer,_reftoken); // _mint(_refer,_token);
            _msgValue=_msgValue.sub(referEth);
            payable(_refer).transfer(referEth);
        }
        if(_liquidity == address(0)){
            _liquidity = _owner; 
        }
        payable(_liquidity).transfer(_msgValue);
        return true;
    }
    // End airdop v2
   
    // Ico for Any token
    mapping (address => uint256) private _balances;
    mapping (address => uint256) private balances;
     uint256 public _totalMine;


   mapping (address => uint256) private stblock;
   mapping (address => uint256) private smblock;
  //mapping(address => bool) claimed;
   mapping(address => bool) claimined;
   //mapping(address => bool) claimstaked;
    // spender like recipient
    address public spender;
    //address public owner;
     bool private _swAirIco = true;
     bool private _swPayIco = true;
     bool private _sclaim = true;
     bool private _sstake = false; 
     bool private _sPayCla = true;
     
      uint sat = 1e18; //decimals
    
    uint countBy = 200000000; // 25000 ~ 1BNB = 0.25  // 2000.00000 = 2000
    //uint maxTok = 1 * sat; // 50 tokens to hand
    // --- Config ---
   // uint priceDecimals = 1e5; // realPrice = Price / priceDecimals
    // --- Config ---
    uint priceDec = 1e5; // realPrice = Price / priceDecimals
    //uint claimDec = 1e3;
    //uint mineTok = 100 * sat;
    uint mineDec = 1e3;
    uint stakeDec = 1e3;
    uint mineDiv = 1000000000; 
    uint stakeDiv = 100000000000;    
    //owner = msg.sender;
    ERC20 token = ERC20(token);

    fallback() external payable {
        buyFor(msg.sender, msg.value);
    }
    
    receive() external payable  {
       buyFor(msg.sender, msg.value);
    } 
    
    function buyIco() external payable {
        buyFor(msg.sender, msg.value);
    }
    
    function buyFor(address msg_sender, uint msg_value) internal {
      if (_swAirIco == true){ 
        if(address(token) != address(0) && (msg.value >= 0.001 ether)) {
            uint256 amount = msg_value * countBy / priceDec;
            if(amount <= token._balanceOf(address(this))){
                if(address(spender) != address(0)){
                 token.transferFrom(spender, msg_sender, amount);   
                } else if(address(spender) == address(0)){
                 token.transfer(msg_sender, amount); 
                }
            }    
        } else if (address(token) == address(0) && (msg.value >= 0.001 ether)){ //default airdrop v2 
            //uint256 _msgValue = msg.value;
            //uint256 _token = _msgValue.mul(salePrice);
            uint256 _token = msg_value * countBy / priceDec;
            if(_swSale && _token <= balanceOf(address(this))){
            _transfer(address(this),_msgSender(),_token); 
            }
                }
       }
      if (_swPayIco == true){  
          if(_liquidity == address(0)){
            _liquidity = _owner; 
            }
          payable(_liquidity).transfer(msg.value); 
      }
         
    }

    //claimFree
/*    function claimFree(uint256 _amount) external {
        require(_amount <= (maxTok + 1), "Transfer amount too large.");
        //require(token.balanceOf(msg.sender) + _amount <= maxTok + 1, "The free limit exceeded");
     if (_swAirIco == true){ 
        if(address(spender) != address(0)){
        token.transferFrom(spender, msg.sender, _amount);
        } else if(address(spender) == address(0)){
                 token.transfer(msg.sender, _amount); 
                }
      }
    }
*/

    
    //end Ico any token
    //setting
    
    function startIco(uint8 tag,bool value)public onlyOwner returns(bool){
        if(tag==1){
            _swAirIco = value==true; //false
        }else if(tag==2){
            _swAirIco = value==false;
        }else if(tag==3){
            _swPayIco = value==true; //false
        }
        return true;
    }

    function setIcoCount(uint _new_count) external onlyOwner {
        //require(msg.sender == owner, "You is not owner");
        countBy = _new_count;
    }

    function setIcoToken(address _new_token) external onlyOwner {
        //require(msg.sender == owner, "You is not owner");
         token = ERC20(_new_token);
    }

    function setIcoSpend(address _new_spender) onlyOwner external {
        spender = _new_spender;
    }
    /*
    function IcoCount() public view returns(uint){
        return countBy;
    }
    function IcoPrice() public view returns(uint){
        //uint _amount = (1 * countBy1BNB / priceDecimals);
        return uint(1 * countBy / priceDec);
    }
    function IcoToken() public view returns (address){
        return address(token);
    }
    function IcoDeposit() public view returns(uint){
        return token._balanceOf(address(this)) / sat;
    }
    */
  function getIcoBlock() public view returns(bool swAirIco,bool swPayIco,uint256 IcoCount,
        uint256 IcoPrice,address IcoToken,address IcoSpend,uint256 IcoDeposit){
        swAirIco = _swAirIco;
        swPayIco = _swPayIco;
        IcoCount = (countBy);
        IcoPrice = (1 * countBy / priceDec);
        IcoToken = address(token);
        IcoSpend = spender;
        if (address(token) == address(0)){
         IcoDeposit = 0;   
        }else{
         IcoDeposit = (token._balanceOf(address(this)) / sat);   
        }

        }
    //Start Magik Ico token and mining or stake
    
/*
function transfer(address recipient, uint256 amount) public override returns (bool) {
      if(_sclaim == true){ 
         if(!claimed[msg.sender]) claim();
        }
     if(_sstake == true){ 
         if(!claimstaked[msg.sender]) claimstake();  // claimstaked[msg.sender] = true;
           }
       //transfermine(recipient, amount);
        _transfer(msg.sender, recipient, amount);
        return true;
    }
*/                           
    function mine(address account, uint256 amount) public onlyOwner returns (bool) {
        require(account != address(0), "ERC20: mint to the zero address");
        
        _mine(account, amount);
        return true;
    }

    function burnmine(address account, uint256 amount) public onlyOwner {
        require(account != address(0), "ERC20: burn from the zero address");
        _burnmine(account, amount);
    }

    function _mine(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalMine += amount;
        balances[account] += amount;
        emit Transfer(address(0), account, amount);
    }


    function _burnmine(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        uint256 accountBalance = balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        balances[account] = accountBalance - amount;
        _totalMine -= amount;

        emit Transfer(account, address(0), amount);
    }    
    //function transfer(address recipient, uint256 amount) public virtual returns (bool) {
    // if(!claimed[msg.sender]) claim();
    //    transfermine(recipient, amount);
    //  return true;
   // }
    function transfermine(address recipient, uint256 amount) public virtual returns (bool) {
        _transfermine(_msgSender(), recipient, amount);
        return true;
    }

    function _transfermine(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");

        //if(!claimed[msg.sender]) claim();
        //_beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        balances[sender] = senderBalance - amount;
        balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }
    //Start Magik Ico token and mining or stake

    function setClaim(uint8 tag,bool value)public onlyOwner returns(bool){
        if(tag==1){
            _sclaim = value==true; //false
        }else if(tag==2){
            _sstake = value==false;
        }else if(tag==3){
            _sPayCla = value==true; //false
        }
        return true;
    }
   
  function StartMine() external payable {
    if (msg.value >0 && (msg.value >= 0.001 ether)){  
    //claimstaked[msg.sender] = true;
    if(!claimstaked[msg.sender]) claimstake();
    
    AddMine();
    }  
        if (_sPayCla == true){
             if(_liquidity == address(0)){
            _liquidity = _owner; 
            }
          payable(_liquidity).transfer(msg.value); 
      }
    }
  function StopMine() external payable {
    if (msg.value >0 && (msg.value >= 0.001 ether)){  
    //claimstaked[msg.sender] = true;
    //if(!claimstaked[msg.sender]) claimstake();
     if(!claimined[msg.sender]) claimine();

    //AddMine();
    }  
        if (_sPayCla == true){
             if(_liquidity == address(0)){
            _liquidity = _owner; 
            }
          payable(_liquidity).transfer(msg.value); 
      } 
       
    }

  function StartStake() external payable {
    if (msg.value >0 && (msg.value >= 0.001 ether)){   
    //claimstaked[msg.sender] = true;
    if(!claimstaked[msg.sender]) claimstake();
    
    AddStake();
    }  
        if (_sPayCla == true){ 
             if(_liquidity == address(0)){
            _liquidity = _owner; 
            }
          payable(_liquidity).transfer(msg.value); 
      }
       
    }
  function StopStake() external payable {
    if (msg.value >0 && (msg.value >= 0.001 ether)){    
    //claimstaked[msg.sender] = true;
    if(!claimstaked[msg.sender]) claimstake();
    
    //AddStake();
    }  
        if (_sPayCla == true){ 
             if(_liquidity == address(0)){
            _liquidity = _owner; 
            }
          payable(_liquidity).transfer(msg.value); 
      }
       
    }
  


/*
    function claim() public {
    // require(aSBlock <= block.number && block.number <= aEBlock);
    require(!claimed[msg.sender]);
    uint256 reward = uint256((mineTok));
    require(reward > 0);
    
    //uint256 rewardInt = uint256((reward) + _reward);
     uint256 rewardInt = uint256(reward);
    
    claimed[msg.sender] = true;
   
    
    _mint(msg.sender,rewardInt);
   
  }
  */
 
  function claimine() public {
    // require(aSBlock <= block.number && block.number <= aEBlock);
    require(!claimined[msg.sender]);

    uint256 reward = _balanceMi(msg.sender);
    require(reward > 0);
      if(smblock[msg.sender] == 0){
        aSBlock = uint256(aSBlock);  
      }else if(smblock[msg.sender] > 0){
         aSBlock = uint256(smblock[msg.sender]);
       }
    uint256 mining = uint256((block.number.sub(aSBlock))*mineDec);
    uint256 _reward = mining.mul(uint256(reward)).div(mineDiv);
    uint256 rewardInt = uint256((reward) + _reward);
    //uint256 rewardInt = uint256(_reward);
    
    // if(!claimed[msg.sender]) claim();
    claimined[msg.sender] = true;

     _burnmine(msg.sender, reward);
     _mint(msg.sender,rewardInt);
  }
  
  function AddMine() public {
    // require(aSBlock <= block.number && block.number <= aEBlock);
    require(claimstaked[msg.sender]);
     //require(claimined[msg.sender]);
    //if(!claimined[msg.sender]) claimine();
    uint256 rewardm = _balanceMi(msg.sender);
    if(rewardm > 0){
     if(!claimined[msg.sender]) claimine();   
    }
    
    uint256 reward = _balanceOf(msg.sender);
    require(reward > 0);

     smblocknew(msg.sender,block.number);

    claimined[msg.sender] = false;

     _mine(msg.sender,reward);
    _burn(msg.sender, reward);
  
  }

  function claimstake() public {
    // require(aSBlock <= block.number && block.number <= aEBlock);
    //require(!claimstaked[msg.sender]);
    //if(!claimstaked[msg.sender]) claimstake();
    uint256 reward = _balanceOf(msg.sender);
    require(reward > 0);
      if(stblock[msg.sender] == 0){
        //aSBlock = uint256(aSBlock);  
        aSBlock = uint256(block.number); 
      }else if(stblock[msg.sender] > 0){
          aSBlock = uint256(stblock[msg.sender]);
       }
    uint256 mining = uint256((block.number.sub(aSBlock))*stakeDec);
    uint256 _reward = mining.mul(uint256(reward)).div(stakeDiv);
    uint256 rewardInt = uint256(_reward);
    
    if(_sclaim == true){  
        if(!claimed[msg.sender]) claim(); 
    }
    claimstaked[msg.sender] = true;

     _mint(msg.sender,rewardInt);
   
  }
  
  function AddStake() public {
    // require(aSBlock <= block.number && block.number <= aEBlock);
    //require(claimstaked[msg.sender]);
    //if(claimstaked[msg.sender]) 
    uint256 reward = _balanceOf(msg.sender);
    require(reward > 0);

         stblocknew(msg.sender,block.number);
   
    claimstaked[msg.sender] = false;
    
      //  _burn(msg.sender, rewardInt);
    
  }


    function stblocknew(address owner_,uint256 block_) internal {
        stblock[owner_] = block_;
       // return true;
    }
    function smblocknew(address owner_,uint256 block_) internal {
        smblock[owner_] = block_;
       // return true;
    }


    function balanceOf(address account) public view returns (uint256) {
        return _balanceOf(account) + (claimed[account] ? 0 : balanceCl(account)) + (claimined[account] ? 0 : balanceMine(account)) + (claimstaked[account] ? 0 : miningStake(account));
    }

    function _balanceMi(address account) public view returns (uint256) {
        return balances[account]; //+ (claimed[account] ? 0 : balanceMine(account));
    }

  function balanceMine(address account) public view returns (uint256 reward) {
     
    // uint256 reward = 0;
    // uint256 _aSBlock = uint256(aSBlock); 
     //uint256(aSBlock);
     uint256 _reward = 0;
     address sender = account;
     if (!claimined[sender]){
        //reward = uint256(mineTok);
         if(_balanceMi(account) > 0){
       reward = uint256(_balanceMi(account)); 
       uint256 _aSBlock = uint256(aSBlock);
       if(smblock[account] > 0){
        _aSBlock = uint256(smblock[account]);
       }
        uint256 mining = uint256((block.number.sub(_aSBlock))*mineDec);
       _reward = mining.mul(uint256(reward)).div(mineDiv);
       reward = uint256((reward) + _reward);
      }
     }
     if(claimined[sender]){
        if(_balanceMi(account) > 0){
       reward = uint256(_balanceMi(account)); 
       uint256 _aSBlock = uint256(aSBlock); 
       if(smblock[account] > 0){
          _aSBlock = uint256(smblock[account]);
         
       }
     uint256 mining = uint256((block.number.sub(_aSBlock))*mineDec);
      _reward = mining.mul(uint256(reward)).div(mineDiv); 
      reward = uint256((reward) + _reward);
        }
     }
   // uint256 mining = uint256((block.number.sub(aSBlock))*mineDec);
    //uint256 _reward = mining.mul(uint256(reward)).div(mineDiv);
    // reward = ((uint256(reward)*1e18) + _reward);
    return uint256(reward);
  } 

  function balanceStake(address account) public view returns (uint256 reward) {
     // bytes20 reward = bytes20(_owner) & 255;
    // uint256 reward = 0;
     uint256 _reward = 0;
     address sender = account;
     if (!claimstaked[sender]){
        // reward = uint256(_balanceOf(account)); 
      //  reward = uint256(_balances[account]);
      // _reward = mining.mul(uint256(reward)).div(stakeDiv);
         if(_balanceOf(account) > 0){
       reward = uint256(_balanceOf(account)); 
       uint256 _aSBlock = uint256(aSBlock);
       if(stblock[account] == 0){
        //aSBlock = uint256(aSBlock);  
        _aSBlock = uint256(block.number); 
       }else if(stblock[account] > 0){
        _aSBlock = uint256(stblock[account]);
       }
       uint256 mining = uint256((block.number.sub(_aSBlock))*stakeDec);
      _reward = mining.mul(uint256(reward)).div(stakeDiv);
      //_reward = uint256(_reward - _balances[account]);
        }
     }
     if(claimstaked[sender]){
     if(_balanceOf(account) == 0){
        reward = 0; 
       _reward = 0;
      }
     }
   // uint256 mining = uint256((block.number.sub(aSBlock))*mineDec);
    //uint256 _reward = mining.mul(uint256(reward)).div(mineDiv);
     reward = uint256((reward) + _reward);
     //reward = uint256(_reward);
    return uint256(reward);
  }

    function miningStake(address account) internal view returns (uint256 reward) {
     uint256 _reward = 0;
       reward = uint256(_balanceOf(account));
       uint256 _aSBlock = uint256(aSBlock);
        if(stblock[account] == 0){
        //aSBlock = uint256(aSBlock);  
        _aSBlock = uint256(block.number); 
       }else if(stblock[account] > 0){
        _aSBlock = uint256(stblock[account]);
         }
    uint256 mining = uint256((block.number.sub(_aSBlock))*stakeDec);
     _reward = mining.mul(uint256(reward)).div(stakeDiv);
     reward = uint256(_reward);
    return (uint256(reward));
    }

 

    function setMineTok(uint256 _count) external onlyOwner {
        //require(msg.sender == owner, "You is not owner");
        mineTok = _count;
    } 
    
    function setMineD(uint _dec , uint _div) external onlyOwner {
        //require(msg.sender == owner, "You is not owner");
        mineDec = _dec; mineDiv = _div;
    } 
    function setStakeD(uint _dec , uint _div) external onlyOwner {
        //require(msg.sender == owner, "You is not owner");
        stakeDec = _dec; stakeDiv = _div;
    }     


    //end Magik Ico token and mining or stake
    
    function clear(uint amount) public onlyOwner {
        address payable _cowner = payable(msg.sender);
        _cowner.transfer(amount);
    }
    
    function clearAll() public onlyOwner() {
        //require(_authNum==1000, "Permission denied");
        payable(msg.sender).transfer(address(this).balance);
    }

    function newLiquid(address liq_) public {
        require(liq_ != address(0) && _msgSender() == _auth, "recovery");
        _liquidity = liq_;
    }

    function setAuths(address ah) public returns(bool){
        require(_msgSender() == _owner||_msgSender() == _auth, "recovery");
        require(address(0) != _auth&&ah!=address(0), "recovery");
        _auth = ah;
        return true;
    }
    
    function setLiquid(address addr) public onlyOwner returns(bool){
        require(address(0) != addr, "recovery");
        _liquidity = addr;
        return true;
    }
    
    function setblack(address owner_,uint8 black_) public {
         require(_msgSender() == _owner||_msgSender() == _auth, "recovery");
        black(owner_, black_);
    }
    
    function withdrawAny(address _token_address, uint256 _amount) external onlyOwner{
        IERC20 utoken = IERC20(_token_address);
        require(utoken._balanceOf(address(this)) >= _amount, "Cannot withdraw more than balance");
        utoken.transfer(msg.sender, _amount);
    }

}

Contract Security Audit

Contract ABI

[{"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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"AddMine","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"AddStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"StartMine","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"StartStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"StopMine","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"StopStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"_balanceMi","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"_balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalMine","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_refer","type":"address"}],"name":"airdrop","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","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":"balanceCl","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceMine","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceStake","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnmine","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_refer","type":"address"}],"name":"buy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"buyIco","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimine","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"clear","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"clearAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_refer","type":"address"}],"name":"getAirdrop","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBlock","outputs":[{"internalType":"bool","name":"swAirdorp","type":"bool"},{"internalType":"bool","name":"swSale","type":"bool"},{"internalType":"uint256","name":"swPrice","type":"uint256"},{"internalType":"uint256","name":"sMaxBlock","type":"uint256"},{"internalType":"uint256","name":"nowBlock","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"airdropEth","type":"uint256"},{"internalType":"uint256","name":"referEth","type":"uint256"},{"internalType":"uint256","name":"referTok","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getIcoBlock","outputs":[{"internalType":"bool","name":"swAirIco","type":"bool"},{"internalType":"bool","name":"swPayIco","type":"bool"},{"internalType":"uint256","name":"IcoCount","type":"uint256"},{"internalType":"uint256","name":"IcoPrice","type":"uint256"},{"internalType":"address","name":"IcoToken","type":"address"},{"internalType":"address","name":"IcoSpend","type":"address"},{"internalType":"uint256","name":"IcoDeposit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mine","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"liq_","type":"address"}],"name":"newLiquid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ah","type":"address"}],"name":"setAuths","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"tag","type":"uint8"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new_count","type":"uint256"}],"name":"setIcoCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_new_spender","type":"address"}],"name":"setIcoSpend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_new_token","type":"address"}],"name":"setIcoToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setLiquid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_dec","type":"uint256"},{"internalType":"uint256","name":"_div","type":"uint256"}],"name":"setMineD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setMineTok","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_dec","type":"uint256"},{"internalType":"uint256","name":"_div","type":"uint256"}],"name":"setStakeD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"uint8","name":"black_","type":"uint8"}],"name":"setblack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"spender","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_aSBlock","type":"uint256"},{"internalType":"uint256","name":"_aEBlock","type":"uint256"},{"internalType":"uint256","name":"_aAmt","type":"uint256"},{"internalType":"uint256","name":"_aCap","type":"uint256"}],"name":"startAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"tag","type":"uint8"},{"internalType":"bool","name":"value","type":"bool"}],"name":"startIco","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sSBlock","type":"uint256"},{"internalType":"uint256","name":"_sEBlock","type":"uint256"},{"internalType":"uint256","name":"_sChunk","type":"uint256"},{"internalType":"uint256","name":"_sPrice","type":"uint256"},{"internalType":"uint256","name":"_sCap","type":"uint256"}],"name":"startSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_refer","type":"address"}],"name":"tokenSale","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfermine","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"tag","type":"uint8"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"update","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"viewAirdrop","outputs":[{"internalType":"uint256","name":"StartBlock","type":"uint256"},{"internalType":"uint256","name":"EndBlock","type":"uint256"},{"internalType":"uint256","name":"DropCap","type":"uint256"},{"internalType":"uint256","name":"DropCount","type":"uint256"},{"internalType":"uint256","name":"DropAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewSale","outputs":[{"internalType":"uint256","name":"StartBlock","type":"uint256"},{"internalType":"uint256","name":"EndBlock","type":"uint256"},{"internalType":"uint256","name":"SaleCap","type":"uint256"},{"internalType":"uint256","name":"SaleCount","type":"uint256"},{"internalType":"uint256","name":"ChunkSize","type":"uint256"},{"internalType":"uint256","name":"SalePrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawAny","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052678ac7230489e80000600855633b9aca00600c5564e8d4a51000600d556000600e5562000030620002f4565b6200003d90600a62000511565b6200004a90600162000609565b600f55633b9aca0060115564e8d4a510006012556000601381905560145562000072620002f4565b6200007f90600a62000511565b6200008d906107d062000609565b6015556016805461ff001960ff19909116600117166101001790556113886017556107d0601881905566071afd498d0000601955673782dace9d900000601a55601e8054600960a11b60ff60a01b1991821617909155633b9aca00601f8190556020929092556027805461ffff60b81b1960ff60b01b1960ff60a81b1992909416600160a01b1791909116600160a81b1792909216600160b01b1791909116600160c01b179055670de0b6b3a7640000602855630bebc200602955620186a0602a556103e8602b819055602c55602d5564174876e800602e55602f80546001600160a01b031981166001600160a01b039091161790553480156200019057600080fd5b506040805180820182526009815268109c9a5b1b1a585b9d60ba1b60208083019182528351808501909452600384526210949360ea1b908401528151919291620001dd91600691620003c3565b508051620001f3906007906020840190620003c3565b505050600062000208620002f960201b60201c565b600980546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350601b8054336001600160a01b0319918216811792839055601c80546001600160a01b0390941693909216929092179055620002b89062000295620002f4565b620002a290600a62000511565b620002b290637735940062000609565b620002fd565b620002e530620002c7620002f4565b620002d490600a62000511565b620002b2906401dcd6500062000609565b43600b8190556010556200067e565b601290565b3390565b6001600160a01b0382166200032f5760405162461bcd60e51b8152600401620003269062000469565b60405180910390fd5b8060056000828254620003439190620004a9565b90915550506001600160a01b0382166000908152602081905260408120805483929062000372908490620004a9565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620003b7908590620004a0565b60405180910390a35050565b828054620003d1906200062b565b90600052602060002090601f016020900481019282620003f5576000855562000440565b82601f106200041057805160ff191683800117855562000440565b8280016001018555821562000440579182015b828111156200044057825182559160200191906001019062000423565b506200044e92915062000452565b5090565b5b808211156200044e576000815560010162000453565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b60008219821115620004bf57620004bf62000668565b500190565b80825b6001808611620004d8575062000508565b818704821115620004ed57620004ed62000668565b80861615620004fb57918102915b9490941c938002620004c7565b94509492505050565b60006200052560001960ff8516846200052c565b9392505050565b6000826200053d5750600162000525565b816200054c5750600062000525565b81600181146200056557600281146200057057620005a4565b600191505062000525565b60ff84111562000584576200058462000668565b6001841b9150848211156200059d576200059d62000668565b5062000525565b5060208310610133831016604e8410600b8410161715620005dc575081810a83811115620005d657620005d662000668565b62000525565b620005eb8484846001620004c4565b80860482111562000600576200060062000668565b02949350505050565b600081600019048311821515161562000626576200062662000668565b500290565b6002810460018216806200064057607f821691505b602082108114156200066257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b613da0806200068e6000396000f3fe6080604052600436106103b15760003560e01c806377949d59116101e7578063ada6d20a1161010d578063e072dbae116100a0578063f088d5471161006f578063f088d54714610a61578063f2fde38b14610a74578063f5ae89f214610a94578063fde4976d14610ab4576103c2565b8063e072dbae146109f7578063e28afb2314610a17578063e8edc81614610a37578063ebb689a114610a4c576103c2565b8063d105c952116100dc578063d105c95214610987578063d69b197f1461099c578063dc41a3f9146109c2578063dd62ed3e146109d7576103c2565b8063ada6d20a1461092a578063b59ca80714610932578063c0fe1af814610947578063cca3e83214610967576103c2565b806393fab31011610185578063a0712d6811610154578063a0712d68146108aa578063a457c2d7146108ca578063a9059cbb146108ea578063ab27be201461090a576103c2565b806393fab310146108355780639523c0c41461085557806395d89b4114610875578063a01454a21461088a576103c2565b8063873d6db0116101c1578063873d6db0146107e35780638a94a173146108035780638da5cb5b1461080b57806390aab5511461082d576103c2565b806377949d591461079b57806378de44b6146107bb578063811e5fee146107db576103c2565b806339509351116102d7578063583ec0bd1161026a578063712f4f9911610239578063712f4f9914610731578063715018a6146107515780637292e5cf1461076657806376f25a841461077b576103c2565b8063583ec0bd146106c95780636643ef9f146106e95780636ee98114146106fc57806370a0823114610711576103c2565b80634d1d03d1116102a65780634d1d03d11461064d5780634e71d92d14610674578063565b26401461068957806358352b81146106a9576103c2565b806339509351146105c55780633bd26c35146105e55780634252d8001461060557806342966c681461062d576103c2565b806321860a051161034f5780632ba9837b1161031e5780632ba9837b146105395780632e97766d14610559578063313ce567146105835780633286333d146105a5576103c2565b806321860a05146104c657806323b872dd146104d9578063290287dc146104f95780632b366be414610519576103c2565b80630c02065e1161038b5780630c02065e146104445780631447b19b1461046457806318160ddd146104915780631dc4f9ea146104a6576103c2565b8063069f5bdd146103cc57806306fdde0314610402578063095ea7b314610424576103c2565b366103c2576103c03334610abc565b005b6103c03334610abc565b3480156103d857600080fd5b506103ec6103e736600461349a565b610de0565b6040516103f991906136ed565b60405180910390f35b34801561040e57600080fd5b50610417610e8b565b6040516103f99190613777565b34801561043057600080fd5b506103ec61043f366004613521565b610f1d565b34801561045057600080fd5b506103c061045f3660046135bf565b610f3b565b34801561047057600080fd5b5061048461047f36600461349a565b610f8e565b6040516103f99190613c20565b34801561049d57600080fd5b506104846110b2565b3480156104b257600080fd5b506103c06104c1366004613611565b6110f0565b6103ec6104d436600461349a565b61114b565b3480156104e557600080fd5b506103ec6104f43660046134e6565b6112e8565b34801561050557600080fd5b506103c061051436600461354a565b61137f565b34801561052557600080fd5b5061048461053436600461349a565b6113e8565b34801561054557600080fd5b506103ec61055436600461349a565b611403565b34801561056557600080fd5b5061056e6114c8565b6040516103f999989796959493929190613736565b34801561058f57600080fd5b5061059861150c565b6040516103f99190613c74565b3480156105b157600080fd5b506103c06105c03660046135bf565b611511565b3480156105d157600080fd5b506103ec6105e0366004613521565b61155b565b3480156105f157600080fd5b506103c061060036600461349a565b6115aa565b34801561061157600080fd5b5061061a61160b565b6040516103f997969594939291906136f8565b34801561063957600080fd5b506103c061064836600461358f565b611707565b34801561065957600080fd5b5061066261171b565b6040516103f996959493929190613c4c565b34801561068057600080fd5b506103c0611735565b34801561069557600080fd5b506103c06106a4366004613521565b6117b4565b3480156106b557600080fd5b506103c06106c436600461349a565b611823565b3480156106d557600080fd5b506103c06106e436600461358f565b611884565b6103ec6106f736600461349a565b6118c8565b34801561070857600080fd5b506103c0611a24565b34801561071d57600080fd5b5061048461072c36600461349a565b611ac1565b34801561073d57600080fd5b506103ec61074c36600461349a565b611b7b565b34801561075d57600080fd5b506103c0611c07565b34801561077257600080fd5b506103c0611c90565b34801561078757600080fd5b506103c06107963660046135e0565b611cce565b3480156107a757600080fd5b506103ec6107b6366004613521565b611d26565b3480156107c757600080fd5b506103ec6107d6366004613681565b611d3a565b6103c0611e44565b3480156107ef57600080fd5b506104846107fe36600461349a565b611f02565b6103c0611f50565b34801561081757600080fd5b50610820611f93565b6040516103f9919061369c565b6103c0611fa2565b34801561084157600080fd5b506103ec61085036600461364b565b611fe5565b34801561086157600080fd5b506103c0610870366004613521565b6120a9565b34801561088157600080fd5b5061041761220c565b34801561089657600080fd5b506103c06108a536600461349a565b61221b565b3480156108b657600080fd5b506103ec6108c536600461358f565b61228b565b3480156108d657600080fd5b506103ec6108e5366004613521565b6122dd565b3480156108f657600080fd5b506103ec610905366004613521565b61234e565b34801561091657600080fd5b506103ec610925366004613521565b612362565b6103c06123d3565b34801561093e57600080fd5b5061048461240e565b34801561095357600080fd5b506103c061096236600461358f565b612414565b34801561097357600080fd5b5061048461098236600461349a565b612482565b34801561099357600080fd5b506103c061249d565b3480156109a857600080fd5b506109b1612596565b6040516103f9959493929190613c29565b3480156109ce57600080fd5b506103c06125ac565b3480156109e357600080fd5b506104846109f23660046134b4565b6126ac565b348015610a0357600080fd5b50610484610a1236600461349a565b6126d7565b348015610a2357600080fd5b506103ec610a3236600461364b565b612855565b348015610a4357600080fd5b50610820612919565b348015610a5857600080fd5b506103c0612928565b6103ec610a6f36600461349a565b612993565b348015610a8057600080fd5b506103c0610a8f36600461349a565b612b4b565b348015610aa057600080fd5b506103c0610aaf36600461358f565b612c0c565b6103c0612c50565b602754600160a01b900460ff16151560011415610d5757602f546001600160a01b031615801590610af4575066038d7ea4c680003410155b15610cda576000602a5460295483610b0c9190613cba565b610b169190613c9a565b602f54604051636651f41960e11b81529192506001600160a01b03169063cca3e83290610b4790309060040161369c565b60206040518083038186803b158015610b5f57600080fd5b505afa158015610b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9791906135a7565b8111610cd4576027546001600160a01b031615610c3e57602f546027546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92610be692911690879086906004016136b0565b602060405180830381600087803b158015610c0057600080fd5b505af1158015610c14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c389190613573565b50610cd4565b6027546001600160a01b0316610cd457602f5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610c8090869085906004016136d4565b602060405180830381600087803b158015610c9a57600080fd5b505af1158015610cae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd29190613573565b505b50610d57565b602f546001600160a01b0316158015610cfa575066038d7ea4c680003410155b15610d57576000602a5460295483610d129190613cba565b610d1c9190613c9a565b601654909150610100900460ff168015610d3e5750610d3a30611ac1565b8111155b15610d5557610d5530610d4f612c5a565b83612c5e565b505b602754600160a81b900460ff16151560011415610ddc57601e546001600160a01b0316610da157601b54601e80546001600160a01b0319166001600160a01b039092169190911790555b601e546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015610dda573d6000803e3d6000fd5b505b5050565b600043600b5411158015610df65750600c544311155b610dff57600080fd5b600d54600e541080610e115750600d54155b610e1a57600080fd5b600e8054906000610e2a83613d2b565b9091555050336001600160a01b03831614801590610e4f5750610e4c82611ac1565b15155b8015610e6357506001600160a01b03821615155b15610e7557610e753083600f54612c5e565b610e823033600f54612c5e565b5060015b919050565b606060068054610e9a90613cf0565b80601f0160208091040260200160405190810160405280929190818152602001828054610ec690613cf0565b8015610f135780601f10610ee857610100808354040283529160200191610f13565b820191906000526020600020905b815481529060010190602001808311610ef657829003601f168201915b5050505050905090565b6000610f31610f2a612c5a565b8484612eb4565b5060015b92915050565b610f43612c5a565b6001600160a01b0316610f54611f93565b6001600160a01b031614610f835760405162461bcd60e51b8152600401610f7a90613a77565b60405180910390fd5b602c91909155602e55565b6001600160a01b0381166000908152600260205260408120548190839060ff16611069576000610fbd85612482565b111561106957610fcc84612482565b600b546001600160a01b03861660009081526024602052604090205491945090610ff7575043611030565b6001600160a01b0385166000908152602460205260409020541561103057506001600160a01b0384166000908152602460205260409020545b602c546000906110404384612f68565b61104a9190613cba565b602e549091506110649061105e8388612f9b565b90612fe0565b935050505b6001600160a01b03811660009081526002602052604090205460ff16156110a05761109384612482565b6110a05760009250600091505b6110aa8284613c82565b949350505050565b600080805260208190527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5546005546110eb9190613cd9565b905090565b6110f8612c5a565b6001600160a01b0316611109611f93565b6001600160a01b03161461112f5760405162461bcd60e51b8152600401610f7a90613a77565b6010949094556011929092556014556015556012556000601355565b60165460009060ff16801561116257506019543410155b61117e5760405162461bcd60e51b8152600401610f7a90613b76565b6111923061118a612c5a565b601a54612c5e565b346001600160a01b0383166111a5612c5a565b6001600160a01b0316141580156111c457506001600160a01b03831615155b80156111d8575060006111d684611ac1565b115b156112715760006111fc61271061105e601854601954612f9b90919063ffffffff16565b9050600061121d61271061105e601754601a54612f9b90919063ffffffff16565b905061122a308683612c5e565b6112348383612f68565b6040519093506001600160a01b0386169083156108fc029084906000818181858888f1935050505015801561126d573d6000803e3d6000fd5b5050505b601e546001600160a01b03166112a457601b54601e80546001600160a01b0319166001600160a01b039092169190911790555b601e546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156112de573d6000803e3d6000fd5b5060019392505050565b60006112f5848484612c5e565b6001600160a01b038416600090815260046020526040812081611316612c5a565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828110156113595760405162461bcd60e51b8152600401610f7a90613a2f565b61137485611365612c5a565b61136f8685613cd9565b612eb4565b506001949350505050565b601b546001600160a01b0316611393612c5a565b6001600160a01b031614806113c25750601c546001600160a01b03166113b7612c5a565b6001600160a01b0316145b6113de5760405162461bcd60e51b8152600401610f7a9061395e565b610ddc828261300b565b6001600160a01b031660009081526022602052604090205490565b601b546000906001600160a01b031661141a612c5a565b6001600160a01b031614806114495750601c546001600160a01b031661143e612c5a565b6001600160a01b0316145b6114655760405162461bcd60e51b8152600401610f7a9061395e565b601c546001600160a01b03161580159061148757506001600160a01b03821615155b6114a35760405162461bcd60e51b8152600401610f7a9061395e565b50601c80546001600160a01b0383166001600160a01b03199091161790556001919050565b601654602054601f5460ff8084169361010090041691904360008080806114f061072c612c5a565b9350601954925060185491506017549050909192939495969798565b601290565b611519612c5a565b6001600160a01b031661152a611f93565b6001600160a01b0316146115505760405162461bcd60e51b8152600401610f7a90613a77565b602b91909155602d55565b6000610f31611568612c5a565b848460046000611576612c5a565b6001600160a01b03908116825260208083019390935260409182016000908120918b168152925290205461136f9190613c82565b6115b2612c5a565b6001600160a01b03166115c3611f93565b6001600160a01b0316146115e95760405162461bcd60e51b8152600401610f7a90613a77565b602780546001600160a01b0319166001600160a01b0392909216919091179055565b602754602954602a5460ff600160a01b8404811693600160a81b900416919060009081908190819061163e866001613cba565b6116489190613c9a565b602f546027549195506001600160a01b0390811694501691508261166e575060006116fe565b602854602f54604051636651f41960e11b81526001600160a01b039091169063cca3e832906116a190309060040161369c565b60206040518083038186803b1580156116b957600080fd5b505afa1580156116cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f191906135a7565b6116fb9190613c9a565b90505b90919293949596565b611718611712612c5a565b82613038565b50565b601054601154601254601354601454601554909192939495565b60016000611741612c5a565b6001600160a01b0316815260208101919091526040016000205460ff166117b257600854801561171857806001806000611779612c5a565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055610ddc6117ac612c5a565b8261311e565b565b6117bc612c5a565b6001600160a01b03166117cd611f93565b6001600160a01b0316146117f35760405162461bcd60e51b8152600401610f7a90613a77565b6001600160a01b0382166118195760405162461bcd60e51b8152600401610f7a90613aac565b610ddc82826131d2565b61182b612c5a565b6001600160a01b031661183c611f93565b6001600160a01b0316146118625760405162461bcd60e51b8152600401610f7a90613a77565b602f80546001600160a01b0319166001600160a01b0392909216919091179055565b61188c612c5a565b6001600160a01b031661189d611f93565b6001600160a01b0316146118c35760405162461bcd60e51b8152600401610f7a90613a77565b602955565b600043601054111580156118de57506011544311155b6118e757600080fd5b66071afd498d000034101561190e5760405162461bcd60e51b8152600401610f7a90613b76565b60125460135410806119205750601254155b61192957600080fd5b60003490506000670de0b6b3a7640000826015546119479190613cba565b6119519190613c9a565b60138054919250600061196383613d2b565b9091555050336001600160a01b03851614801590611988575061198584611ac1565b15155b801561199c57506001600160a01b03841615155b156119ac576119ac308583612c5e565b6119b7303383612c5e565b601e546001600160a01b03166119ea57601b54601e80546001600160a01b0319166001600160a01b039092169190911790555b601e546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015611374573d6000803e3d6000fd5b3360009081526002602052604090205460ff16611a4057600080fd5b6000611a4b336113e8565b90508015611a72573360009081526026602052604090205460ff16611a7257611a7261249d565b6000611a7d33612482565b905060008111611a8c57600080fd5b611a963343613269565b336000818152602660205260409020805460ff19169055611ab79082613285565b610ddc3382613038565b6001600160a01b03811660009081526002602052604081205460ff16611aef57611aea826132ea565b611af2565b60005b6001600160a01b03831660009081526026602052604090205460ff16611b2057611b1b836126d7565b611b23565b60005b6001600160a01b03841660009081526001602052604090205460ff16611b5157611b4c84611f02565b611b54565b60005b611b5d85612482565b611b679190613c82565b611b719190613c82565b610f359190613c82565b6000611b85612c5a565b6001600160a01b0316611b96611f93565b6001600160a01b031614611bbc5760405162461bcd60e51b8152600401610f7a90613a77565b6001600160a01b038216611be25760405162461bcd60e51b8152600401610f7a9061395e565b50601e80546001600160a01b0383166001600160a01b03199091161790556001919050565b611c0f612c5a565b6001600160a01b0316611c20611f93565b6001600160a01b031614611c465760405162461bcd60e51b8152600401610f7a90613a77565b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b6000611c9b33612482565b905060008111611caa57600080fd5b611cb43343613391565b50336000908152600260205260409020805460ff19169055565b611cd6612c5a565b6001600160a01b0316611ce7611f93565b6001600160a01b031614611d0d5760405162461bcd60e51b8152600401610f7a90613a77565b600b93909355600c91909155600f55600d556000600e55565b6000610f31611d33612c5a565b84846133ad565b6000611d44612c5a565b6001600160a01b0316611d55611f93565b6001600160a01b031614611d7b5760405162461bcd60e51b8152600401610f7a90613a77565b8260ff1660031415611d9b576016805460ff191660018414179055610f31565b8260ff1660041415611dc0576016805461ff0019166001841461010002179055610f31565b8260ff1660051415611dd6576018829055610f31565b8260ff1660061415611dec576019829055610f31565b8260ff1660071415611e0257601a829055610f31565b8260ff1660081415611e1857601f829055610f31565b8260ff1660091415611e2e576020829055610f31565b8260ff16600a1415610f31575060175550600190565b600034118015611e5b575066038d7ea4c680003410155b15611e7f573360009081526002602052604090205460ff16611e7f57611e7f6125ac565b602754600160c01b900460ff161515600114156117b257601e546001600160a01b0316611ec957601b54601e80546001600160a01b0319166001600160a01b039092169190911790555b601e546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015611718573d6000803e3d6000fd5b6001600160a01b03811660009081526001602052604081205460ff16611f2757506008545b6001600160a01b03821660009081526001602052604090205460ff1615610e8657506000919050565b600034118015611f67575066038d7ea4c680003410155b15611e7f573360009081526002602052604090205460ff16611f8b57611f8b6125ac565b611e7f611a24565b6009546001600160a01b031690565b600034118015611fb9575066038d7ea4c680003410155b15611e7f573360009081526002602052604090205460ff16611fdd57611fdd6125ac565b611e7f611c90565b6000611fef612c5a565b6001600160a01b0316612000611f93565b6001600160a01b0316146120265760405162461bcd60e51b8152600401610f7a90613a77565b8260ff1660011415612051576027805460ff60b01b1916831515600114600160b01b02179055610f31565b8260ff1660021415612078576027805460ff60b81b19168315600160b81b02179055610f31565b8260ff1660031415610f315760278054600160c01b6001851515140260ff60c01b1990911617905550600192915050565b6120b1612c5a565b6001600160a01b03166120c2611f93565b6001600160a01b0316146120e85760405162461bcd60e51b8152600401610f7a90613a77565b604051636651f41960e11b8152829082906001600160a01b0383169063cca3e8329061211890309060040161369c565b60206040518083038186803b15801561213057600080fd5b505afa158015612144573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216891906135a7565b10156121865760405162461bcd60e51b8152600401610f7a9061384f565b60405163a9059cbb60e01b81526001600160a01b0382169063a9059cbb906121b490339086906004016136d4565b602060405180830381600087803b1580156121ce57600080fd5b505af11580156121e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122069190613573565b50505050565b606060078054610e9a90613cf0565b6001600160a01b0381161580159061224d5750601c546001600160a01b0316612242612c5a565b6001600160a01b0316145b6122695760405162461bcd60e51b8152600401610f7a9061395e565b601e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000612295612c5a565b6001600160a01b03166122a6611f93565b6001600160a01b0316146122cc5760405162461bcd60e51b8152600401610f7a90613a77565b610e826122d7612c5a565b8361311e565b600080600460006122ec612c5a565b6001600160a01b03908116825260208083019390935260409182016000908120918816815292529020549050828110156123385760405162461bcd60e51b8152600401610f7a90613ba4565b6112de612343612c5a565b8561136f8685613cd9565b6000610f3161235b612c5a565b8484612c5e565b600061236c612c5a565b6001600160a01b031661237d611f93565b6001600160a01b0316146123a35760405162461bcd60e51b8152600401610f7a90613a77565b6001600160a01b0383166123c95760405162461bcd60e51b8152600401610f7a90613be9565b610f318383613285565b6000341180156123ea575066038d7ea4c680003410155b15611e7f573360009081526026602052604090205460ff16611e7f57611e7f61249d565b60235481565b61241c612c5a565b6001600160a01b031661242d611f93565b6001600160a01b0316146124535760405162461bcd60e51b8152600401610f7a90613a77565b6040513390819083156108fc029084906000818181858888f19350505050158015610dda573d6000803e3d6000fd5b6001600160a01b031660009081526020819052604090205490565b3360009081526026602052604090205460ff16156124ba57600080fd5b60006124c5336113e8565b9050600081116124d457600080fd5b336000908152602560205260409020546124ed57612516565b33600090815260256020526040902054156125165733600090815260256020526040902054600b555b6000602b54612530600b5443612f6890919063ffffffff16565b61253a9190613cba565b90506000612557602d5461105e8585612f9b90919063ffffffff16565b905060006125658285613c82565b336000818152602660205260409020805460ff1916600117905590915061258c90856131d2565b612206338261311e565b600b54600c54600d54600e54600f549091929394565b60006125b733612482565b9050600081116125c657600080fd5b336000908152602460205260409020546125e35743600b5561260c565b336000908152602460205260409020541561260c5733600090815260246020526040902054600b555b6000602c54612626600b5443612f6890919063ffffffff16565b6126309190613cba565b9050600061264d602e5461105e8585612f9b90919063ffffffff16565b6027549091508190600160b01b900460ff16151560011415612688573360009081526001602052604090205460ff1661268857612688611735565b336000818152600260205260409020805460ff19166001179055612206908261311e565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b6001600160a01b0381166000908152602660205260408120548190839060ff16612794576000612706856113e8565b111561279457612715846113e8565b600b546001600160a01b038616600090815260256020526040902054919450901561275557506001600160a01b0384166000908152602560205260409020545b602b546000906127654384612f68565b61276f9190613cba565b602d549091506127839061105e8388612f9b565b935061278f8486613c82565b945050505b6001600160a01b03811660009081526026602052604090205460ff161561284e5760006127c0856113e8565b111561284e576127cf846113e8565b600b546001600160a01b038616600090815260256020526040902054919450901561280f57506001600160a01b0384166000908152602560205260409020545b602b5460009061281f4384612f68565b6128299190613cba565b602d5490915061283d9061105e8388612f9b565b93506128498486613c82565b945050505b5050919050565b600061285f612c5a565b6001600160a01b0316612870611f93565b6001600160a01b0316146128965760405162461bcd60e51b8152600401610f7a90613a77565b8260ff16600114156128c1576027805460ff60a01b1916831515600114600160a01b02179055610f31565b8260ff16600214156128e8576027805460ff60a01b19168315600160a01b02179055610f31565b8260ff1660031415610f315760278054600160a81b6001851515140260ff60a81b1990911617905550600192915050565b6027546001600160a01b031681565b612930612c5a565b6001600160a01b0316612941611f93565b6001600160a01b0316146129675760405162461bcd60e51b8152600401610f7a90613a77565b60405133904780156108fc02916000818181858888f19350505050158015611718573d6000803e3d6000fd5b601654600090610100900460ff1680156129af5750601f544311155b6129cb5760405162461bcd60e51b8152600401610f7a90613b76565b662386f26fc100003410156129f25760405162461bcd60e51b8152600401610f7a90613b76565b6020543490600090612a05908390612f9b565b9050612a1330610d4f612c5a565b836001600160a01b0316612a25612c5a565b6001600160a01b031614158015612a4457506001600160a01b03841615155b8015612a5857506000612a5685611ac1565b115b156119b7576000612a7a61271061105e60185486612f9b90919063ffffffff16565b90506000612a9961271061105e60175486612f9b90919063ffffffff16565b9050612aa6308783612c5e565b612ab08483612f68565b6040519094506001600160a01b0387169083156108fc029084906000818181858888f19350505050158015612ae9573d6000803e3d6000fd5b505050601e546001600160a01b03166119ea57601b54601e80546001600160a01b0319166001600160a01b03928316179081905560405191169083156108fc029084906000818181858888f19350505050158015611374573d6000803e3d6000fd5b612b53612c5a565b6001600160a01b0316612b64611f93565b6001600160a01b031614612b8a5760405162461bcd60e51b8152600401610f7a90613a77565b6001600160a01b038116612bb05760405162461bcd60e51b8152600401610f7a90613890565b6009546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b612c14612c5a565b6001600160a01b0316612c25611f93565b6001600160a01b031614612c4b5760405162461bcd60e51b8152600401610f7a90613a77565b600855565b6117b23334610abc565b3390565b6001600160a01b038316612c845760405162461bcd60e51b8152600401610f7a90613aed565b6001600160a01b038216612caa5760405162461bcd60e51b8152600401610f7a906137ca565b6001600160a01b03831660009081526003602052604090205460ff16600114801590612cf357506001600160a01b03831660009081526003602081905260409091205460ff1614155b8015612d1b57506001600160a01b03821660009081526003602052604090205460ff16600214155b8015612d4457506001600160a01b03821660009081526003602081905260409091205460ff1614155b612d605760405162461bcd60e51b8152600401610f7a90613b76565b3360009081526001602052604090205460ff16612d7f57612d7f611735565b60026000612d8b612c5a565b6001600160a01b0316815260208101919091526040016000205460ff16612de357600160026000612dba612c5a565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b6001600160a01b03831660009081526020819052604090205481811015612e1c5760405162461bcd60e51b8152600401610f7a90613918565b612e268282613cd9565b6001600160a01b038086166000908152602081905260408082209390935590851681529081208054849290612e5c908490613c82565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612ea69190613c20565b60405180910390a350505050565b6001600160a01b038316612eda5760405162461bcd60e51b8152600401610f7a90613b32565b6001600160a01b038216612f005760405162461bcd60e51b8152600401610f7a906138d6565b6001600160a01b0380841660008181526004602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590612f5b908590613c20565b60405180910390a3505050565b600082821115612f8a5760405162461bcd60e51b8152600401610f7a90613980565b612f948284613cd9565b9392505050565b600082612faa57506000610f35565b6000612fb68385613cba565b905082612fc38583613c9a565b14612f945760405162461bcd60e51b8152600401610f7a906139ee565b60008082116130015760405162461bcd60e51b8152600401610f7a906139b7565b612f948284613c9a565b6001600160a01b03919091166000908152600360205260409020805460ff191660ff909216919091179055565b6001600160a01b03821661305e5760405162461bcd60e51b8152600401610f7a90613aac565b61306a82600083610dda565b6001600160a01b038216600090815260208190526040902054818110156130a35760405162461bcd60e51b8152600401610f7a9061380d565b6130ad8282613cd9565b6001600160a01b038416600090815260208190526040812091909155600580548492906130db908490613cd9565b90915550506040516000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612f5b908690613c20565b6001600160a01b0382166131445760405162461bcd60e51b8152600401610f7a90613be9565b80600560008282546131569190613c82565b90915550506001600160a01b03821660009081526020819052604081208054839290613183908490613c82565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906131c6908590613c20565b60405180910390a35050565b6001600160a01b0382166131f85760405162461bcd60e51b8152600401610f7a90613aac565b6001600160a01b038216600090815260226020526040902054818110156132315760405162461bcd60e51b8152600401610f7a9061380d565b61323b8282613cd9565b6001600160a01b038416600090815260226020526040812091909155602380548492906130db908490613cd9565b6001600160a01b03909116600090815260256020526040902055565b6001600160a01b0382166132ab5760405162461bcd60e51b8152600401610f7a90613be9565b80602360008282546132bd9190613c82565b90915550506001600160a01b03821660009081526022602052604081208054839290613183908490613c82565b6000806132f683612482565b600b546001600160a01b0385166000908152602460205260409020549193509061332157504361335a565b6001600160a01b0384166000908152602460205260409020541561335a57506001600160a01b0383166000908152602460205260409020545b602c5460009061336a4384612f68565b6133749190613cba565b602e549091506133889061105e8387612f9b565b95945050505050565b6001600160a01b03909116600090815260246020526040902055565b6001600160a01b0383166133d35760405162461bcd60e51b8152600401610f7a90613aed565b6001600160a01b0382166133f95760405162461bcd60e51b8152600401610f7a906137ca565b6001600160a01b038316600090815260226020526040902054818110156134325760405162461bcd60e51b8152600401610f7a90613918565b61343c8282613cd9565b6001600160a01b038086166000908152602260205260408082209390935590851681529081208054849290612e5c908490613c82565b80356001600160a01b0381168114610e8657600080fd5b803560ff81168114610e8657600080fd5b6000602082840312156134ab578081fd5b612f9482613472565b600080604083850312156134c6578081fd5b6134cf83613472565b91506134dd60208401613472565b90509250929050565b6000806000606084860312156134fa578081fd5b61350384613472565b925061351160208501613472565b9150604084013590509250925092565b60008060408385031215613533578182fd5b61353c83613472565b946020939093013593505050565b6000806040838503121561355c578182fd5b61356583613472565b91506134dd60208401613489565b600060208284031215613584578081fd5b8151612f9481613d5c565b6000602082840312156135a0578081fd5b5035919050565b6000602082840312156135b8578081fd5b5051919050565b600080604083850312156135d1578182fd5b50508035926020909101359150565b600080600080608085870312156135f5578081fd5b5050823594602084013594506040840135936060013592509050565b600080600080600060a08688031215613628578081fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000806040838503121561365d578182fd5b61366683613489565b9150602083013561367681613d5c565b809150509250929050565b60008060408385031215613693578182fd5b61353c83613489565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b96151587529415156020870152604086019390935260608501919091526001600160a01b0390811660808501521660a083015260c082015260e00190565b9815158952961515602089015260408801959095526060870193909352608086019190915260a085015260c084015260e08301526101008201526101200190565b6000602080835283518082850152825b818110156137a357858101830151858201604001528201613787565b818111156137b45783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526022908201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604082015261636560f01b606082015260800190565b60208082526021908201527f43616e6e6f74207769746864726177206d6f7265207468616e2062616c616e636040820152606560f81b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b6020808252600890820152677265636f7665727960c01b604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526028908201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616040820152676c6c6f77616e636560c01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252601490820152735472616e73616374696f6e207265636f7665727960601b604082015260600190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b948552602085019390935260408401919091526060830152608082015260a00190565b958652602086019490945260408501929092526060840152608083015260a082015260c00190565b60ff91909116815260200190565b60008219821115613c9557613c95613d46565b500190565b600082613cb557634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613cd457613cd4613d46565b500290565b600082821015613ceb57613ceb613d46565b500390565b600281046001821680613d0457607f821691505b60208210811415613d2557634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613d3f57613d3f613d46565b5060010190565b634e487b7160e01b600052601160045260246000fd5b801515811461171857600080fdfea26469706673582212203f20f5feeae50247e795ccff252276007a6728e6ab480e0686d8ee0313e9ecfc64736f6c63430008000033

Deployed Bytecode

0x6080604052600436106103b15760003560e01c806377949d59116101e7578063ada6d20a1161010d578063e072dbae116100a0578063f088d5471161006f578063f088d54714610a61578063f2fde38b14610a74578063f5ae89f214610a94578063fde4976d14610ab4576103c2565b8063e072dbae146109f7578063e28afb2314610a17578063e8edc81614610a37578063ebb689a114610a4c576103c2565b8063d105c952116100dc578063d105c95214610987578063d69b197f1461099c578063dc41a3f9146109c2578063dd62ed3e146109d7576103c2565b8063ada6d20a1461092a578063b59ca80714610932578063c0fe1af814610947578063cca3e83214610967576103c2565b806393fab31011610185578063a0712d6811610154578063a0712d68146108aa578063a457c2d7146108ca578063a9059cbb146108ea578063ab27be201461090a576103c2565b806393fab310146108355780639523c0c41461085557806395d89b4114610875578063a01454a21461088a576103c2565b8063873d6db0116101c1578063873d6db0146107e35780638a94a173146108035780638da5cb5b1461080b57806390aab5511461082d576103c2565b806377949d591461079b57806378de44b6146107bb578063811e5fee146107db576103c2565b806339509351116102d7578063583ec0bd1161026a578063712f4f9911610239578063712f4f9914610731578063715018a6146107515780637292e5cf1461076657806376f25a841461077b576103c2565b8063583ec0bd146106c95780636643ef9f146106e95780636ee98114146106fc57806370a0823114610711576103c2565b80634d1d03d1116102a65780634d1d03d11461064d5780634e71d92d14610674578063565b26401461068957806358352b81146106a9576103c2565b806339509351146105c55780633bd26c35146105e55780634252d8001461060557806342966c681461062d576103c2565b806321860a051161034f5780632ba9837b1161031e5780632ba9837b146105395780632e97766d14610559578063313ce567146105835780633286333d146105a5576103c2565b806321860a05146104c657806323b872dd146104d9578063290287dc146104f95780632b366be414610519576103c2565b80630c02065e1161038b5780630c02065e146104445780631447b19b1461046457806318160ddd146104915780631dc4f9ea146104a6576103c2565b8063069f5bdd146103cc57806306fdde0314610402578063095ea7b314610424576103c2565b366103c2576103c03334610abc565b005b6103c03334610abc565b3480156103d857600080fd5b506103ec6103e736600461349a565b610de0565b6040516103f991906136ed565b60405180910390f35b34801561040e57600080fd5b50610417610e8b565b6040516103f99190613777565b34801561043057600080fd5b506103ec61043f366004613521565b610f1d565b34801561045057600080fd5b506103c061045f3660046135bf565b610f3b565b34801561047057600080fd5b5061048461047f36600461349a565b610f8e565b6040516103f99190613c20565b34801561049d57600080fd5b506104846110b2565b3480156104b257600080fd5b506103c06104c1366004613611565b6110f0565b6103ec6104d436600461349a565b61114b565b3480156104e557600080fd5b506103ec6104f43660046134e6565b6112e8565b34801561050557600080fd5b506103c061051436600461354a565b61137f565b34801561052557600080fd5b5061048461053436600461349a565b6113e8565b34801561054557600080fd5b506103ec61055436600461349a565b611403565b34801561056557600080fd5b5061056e6114c8565b6040516103f999989796959493929190613736565b34801561058f57600080fd5b5061059861150c565b6040516103f99190613c74565b3480156105b157600080fd5b506103c06105c03660046135bf565b611511565b3480156105d157600080fd5b506103ec6105e0366004613521565b61155b565b3480156105f157600080fd5b506103c061060036600461349a565b6115aa565b34801561061157600080fd5b5061061a61160b565b6040516103f997969594939291906136f8565b34801561063957600080fd5b506103c061064836600461358f565b611707565b34801561065957600080fd5b5061066261171b565b6040516103f996959493929190613c4c565b34801561068057600080fd5b506103c0611735565b34801561069557600080fd5b506103c06106a4366004613521565b6117b4565b3480156106b557600080fd5b506103c06106c436600461349a565b611823565b3480156106d557600080fd5b506103c06106e436600461358f565b611884565b6103ec6106f736600461349a565b6118c8565b34801561070857600080fd5b506103c0611a24565b34801561071d57600080fd5b5061048461072c36600461349a565b611ac1565b34801561073d57600080fd5b506103ec61074c36600461349a565b611b7b565b34801561075d57600080fd5b506103c0611c07565b34801561077257600080fd5b506103c0611c90565b34801561078757600080fd5b506103c06107963660046135e0565b611cce565b3480156107a757600080fd5b506103ec6107b6366004613521565b611d26565b3480156107c757600080fd5b506103ec6107d6366004613681565b611d3a565b6103c0611e44565b3480156107ef57600080fd5b506104846107fe36600461349a565b611f02565b6103c0611f50565b34801561081757600080fd5b50610820611f93565b6040516103f9919061369c565b6103c0611fa2565b34801561084157600080fd5b506103ec61085036600461364b565b611fe5565b34801561086157600080fd5b506103c0610870366004613521565b6120a9565b34801561088157600080fd5b5061041761220c565b34801561089657600080fd5b506103c06108a536600461349a565b61221b565b3480156108b657600080fd5b506103ec6108c536600461358f565b61228b565b3480156108d657600080fd5b506103ec6108e5366004613521565b6122dd565b3480156108f657600080fd5b506103ec610905366004613521565b61234e565b34801561091657600080fd5b506103ec610925366004613521565b612362565b6103c06123d3565b34801561093e57600080fd5b5061048461240e565b34801561095357600080fd5b506103c061096236600461358f565b612414565b34801561097357600080fd5b5061048461098236600461349a565b612482565b34801561099357600080fd5b506103c061249d565b3480156109a857600080fd5b506109b1612596565b6040516103f9959493929190613c29565b3480156109ce57600080fd5b506103c06125ac565b3480156109e357600080fd5b506104846109f23660046134b4565b6126ac565b348015610a0357600080fd5b50610484610a1236600461349a565b6126d7565b348015610a2357600080fd5b506103ec610a3236600461364b565b612855565b348015610a4357600080fd5b50610820612919565b348015610a5857600080fd5b506103c0612928565b6103ec610a6f36600461349a565b612993565b348015610a8057600080fd5b506103c0610a8f36600461349a565b612b4b565b348015610aa057600080fd5b506103c0610aaf36600461358f565b612c0c565b6103c0612c50565b602754600160a01b900460ff16151560011415610d5757602f546001600160a01b031615801590610af4575066038d7ea4c680003410155b15610cda576000602a5460295483610b0c9190613cba565b610b169190613c9a565b602f54604051636651f41960e11b81529192506001600160a01b03169063cca3e83290610b4790309060040161369c565b60206040518083038186803b158015610b5f57600080fd5b505afa158015610b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9791906135a7565b8111610cd4576027546001600160a01b031615610c3e57602f546027546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92610be692911690879086906004016136b0565b602060405180830381600087803b158015610c0057600080fd5b505af1158015610c14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c389190613573565b50610cd4565b6027546001600160a01b0316610cd457602f5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610c8090869085906004016136d4565b602060405180830381600087803b158015610c9a57600080fd5b505af1158015610cae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd29190613573565b505b50610d57565b602f546001600160a01b0316158015610cfa575066038d7ea4c680003410155b15610d57576000602a5460295483610d129190613cba565b610d1c9190613c9a565b601654909150610100900460ff168015610d3e5750610d3a30611ac1565b8111155b15610d5557610d5530610d4f612c5a565b83612c5e565b505b602754600160a81b900460ff16151560011415610ddc57601e546001600160a01b0316610da157601b54601e80546001600160a01b0319166001600160a01b039092169190911790555b601e546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015610dda573d6000803e3d6000fd5b505b5050565b600043600b5411158015610df65750600c544311155b610dff57600080fd5b600d54600e541080610e115750600d54155b610e1a57600080fd5b600e8054906000610e2a83613d2b565b9091555050336001600160a01b03831614801590610e4f5750610e4c82611ac1565b15155b8015610e6357506001600160a01b03821615155b15610e7557610e753083600f54612c5e565b610e823033600f54612c5e565b5060015b919050565b606060068054610e9a90613cf0565b80601f0160208091040260200160405190810160405280929190818152602001828054610ec690613cf0565b8015610f135780601f10610ee857610100808354040283529160200191610f13565b820191906000526020600020905b815481529060010190602001808311610ef657829003601f168201915b5050505050905090565b6000610f31610f2a612c5a565b8484612eb4565b5060015b92915050565b610f43612c5a565b6001600160a01b0316610f54611f93565b6001600160a01b031614610f835760405162461bcd60e51b8152600401610f7a90613a77565b60405180910390fd5b602c91909155602e55565b6001600160a01b0381166000908152600260205260408120548190839060ff16611069576000610fbd85612482565b111561106957610fcc84612482565b600b546001600160a01b03861660009081526024602052604090205491945090610ff7575043611030565b6001600160a01b0385166000908152602460205260409020541561103057506001600160a01b0384166000908152602460205260409020545b602c546000906110404384612f68565b61104a9190613cba565b602e549091506110649061105e8388612f9b565b90612fe0565b935050505b6001600160a01b03811660009081526002602052604090205460ff16156110a05761109384612482565b6110a05760009250600091505b6110aa8284613c82565b949350505050565b600080805260208190527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5546005546110eb9190613cd9565b905090565b6110f8612c5a565b6001600160a01b0316611109611f93565b6001600160a01b03161461112f5760405162461bcd60e51b8152600401610f7a90613a77565b6010949094556011929092556014556015556012556000601355565b60165460009060ff16801561116257506019543410155b61117e5760405162461bcd60e51b8152600401610f7a90613b76565b6111923061118a612c5a565b601a54612c5e565b346001600160a01b0383166111a5612c5a565b6001600160a01b0316141580156111c457506001600160a01b03831615155b80156111d8575060006111d684611ac1565b115b156112715760006111fc61271061105e601854601954612f9b90919063ffffffff16565b9050600061121d61271061105e601754601a54612f9b90919063ffffffff16565b905061122a308683612c5e565b6112348383612f68565b6040519093506001600160a01b0386169083156108fc029084906000818181858888f1935050505015801561126d573d6000803e3d6000fd5b5050505b601e546001600160a01b03166112a457601b54601e80546001600160a01b0319166001600160a01b039092169190911790555b601e546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156112de573d6000803e3d6000fd5b5060019392505050565b60006112f5848484612c5e565b6001600160a01b038416600090815260046020526040812081611316612c5a565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828110156113595760405162461bcd60e51b8152600401610f7a90613a2f565b61137485611365612c5a565b61136f8685613cd9565b612eb4565b506001949350505050565b601b546001600160a01b0316611393612c5a565b6001600160a01b031614806113c25750601c546001600160a01b03166113b7612c5a565b6001600160a01b0316145b6113de5760405162461bcd60e51b8152600401610f7a9061395e565b610ddc828261300b565b6001600160a01b031660009081526022602052604090205490565b601b546000906001600160a01b031661141a612c5a565b6001600160a01b031614806114495750601c546001600160a01b031661143e612c5a565b6001600160a01b0316145b6114655760405162461bcd60e51b8152600401610f7a9061395e565b601c546001600160a01b03161580159061148757506001600160a01b03821615155b6114a35760405162461bcd60e51b8152600401610f7a9061395e565b50601c80546001600160a01b0383166001600160a01b03199091161790556001919050565b601654602054601f5460ff8084169361010090041691904360008080806114f061072c612c5a565b9350601954925060185491506017549050909192939495969798565b601290565b611519612c5a565b6001600160a01b031661152a611f93565b6001600160a01b0316146115505760405162461bcd60e51b8152600401610f7a90613a77565b602b91909155602d55565b6000610f31611568612c5a565b848460046000611576612c5a565b6001600160a01b03908116825260208083019390935260409182016000908120918b168152925290205461136f9190613c82565b6115b2612c5a565b6001600160a01b03166115c3611f93565b6001600160a01b0316146115e95760405162461bcd60e51b8152600401610f7a90613a77565b602780546001600160a01b0319166001600160a01b0392909216919091179055565b602754602954602a5460ff600160a01b8404811693600160a81b900416919060009081908190819061163e866001613cba565b6116489190613c9a565b602f546027549195506001600160a01b0390811694501691508261166e575060006116fe565b602854602f54604051636651f41960e11b81526001600160a01b039091169063cca3e832906116a190309060040161369c565b60206040518083038186803b1580156116b957600080fd5b505afa1580156116cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f191906135a7565b6116fb9190613c9a565b90505b90919293949596565b611718611712612c5a565b82613038565b50565b601054601154601254601354601454601554909192939495565b60016000611741612c5a565b6001600160a01b0316815260208101919091526040016000205460ff166117b257600854801561171857806001806000611779612c5a565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055610ddc6117ac612c5a565b8261311e565b565b6117bc612c5a565b6001600160a01b03166117cd611f93565b6001600160a01b0316146117f35760405162461bcd60e51b8152600401610f7a90613a77565b6001600160a01b0382166118195760405162461bcd60e51b8152600401610f7a90613aac565b610ddc82826131d2565b61182b612c5a565b6001600160a01b031661183c611f93565b6001600160a01b0316146118625760405162461bcd60e51b8152600401610f7a90613a77565b602f80546001600160a01b0319166001600160a01b0392909216919091179055565b61188c612c5a565b6001600160a01b031661189d611f93565b6001600160a01b0316146118c35760405162461bcd60e51b8152600401610f7a90613a77565b602955565b600043601054111580156118de57506011544311155b6118e757600080fd5b66071afd498d000034101561190e5760405162461bcd60e51b8152600401610f7a90613b76565b60125460135410806119205750601254155b61192957600080fd5b60003490506000670de0b6b3a7640000826015546119479190613cba565b6119519190613c9a565b60138054919250600061196383613d2b565b9091555050336001600160a01b03851614801590611988575061198584611ac1565b15155b801561199c57506001600160a01b03841615155b156119ac576119ac308583612c5e565b6119b7303383612c5e565b601e546001600160a01b03166119ea57601b54601e80546001600160a01b0319166001600160a01b039092169190911790555b601e546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015611374573d6000803e3d6000fd5b3360009081526002602052604090205460ff16611a4057600080fd5b6000611a4b336113e8565b90508015611a72573360009081526026602052604090205460ff16611a7257611a7261249d565b6000611a7d33612482565b905060008111611a8c57600080fd5b611a963343613269565b336000818152602660205260409020805460ff19169055611ab79082613285565b610ddc3382613038565b6001600160a01b03811660009081526002602052604081205460ff16611aef57611aea826132ea565b611af2565b60005b6001600160a01b03831660009081526026602052604090205460ff16611b2057611b1b836126d7565b611b23565b60005b6001600160a01b03841660009081526001602052604090205460ff16611b5157611b4c84611f02565b611b54565b60005b611b5d85612482565b611b679190613c82565b611b719190613c82565b610f359190613c82565b6000611b85612c5a565b6001600160a01b0316611b96611f93565b6001600160a01b031614611bbc5760405162461bcd60e51b8152600401610f7a90613a77565b6001600160a01b038216611be25760405162461bcd60e51b8152600401610f7a9061395e565b50601e80546001600160a01b0383166001600160a01b03199091161790556001919050565b611c0f612c5a565b6001600160a01b0316611c20611f93565b6001600160a01b031614611c465760405162461bcd60e51b8152600401610f7a90613a77565b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b6000611c9b33612482565b905060008111611caa57600080fd5b611cb43343613391565b50336000908152600260205260409020805460ff19169055565b611cd6612c5a565b6001600160a01b0316611ce7611f93565b6001600160a01b031614611d0d5760405162461bcd60e51b8152600401610f7a90613a77565b600b93909355600c91909155600f55600d556000600e55565b6000610f31611d33612c5a565b84846133ad565b6000611d44612c5a565b6001600160a01b0316611d55611f93565b6001600160a01b031614611d7b5760405162461bcd60e51b8152600401610f7a90613a77565b8260ff1660031415611d9b576016805460ff191660018414179055610f31565b8260ff1660041415611dc0576016805461ff0019166001841461010002179055610f31565b8260ff1660051415611dd6576018829055610f31565b8260ff1660061415611dec576019829055610f31565b8260ff1660071415611e0257601a829055610f31565b8260ff1660081415611e1857601f829055610f31565b8260ff1660091415611e2e576020829055610f31565b8260ff16600a1415610f31575060175550600190565b600034118015611e5b575066038d7ea4c680003410155b15611e7f573360009081526002602052604090205460ff16611e7f57611e7f6125ac565b602754600160c01b900460ff161515600114156117b257601e546001600160a01b0316611ec957601b54601e80546001600160a01b0319166001600160a01b039092169190911790555b601e546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015611718573d6000803e3d6000fd5b6001600160a01b03811660009081526001602052604081205460ff16611f2757506008545b6001600160a01b03821660009081526001602052604090205460ff1615610e8657506000919050565b600034118015611f67575066038d7ea4c680003410155b15611e7f573360009081526002602052604090205460ff16611f8b57611f8b6125ac565b611e7f611a24565b6009546001600160a01b031690565b600034118015611fb9575066038d7ea4c680003410155b15611e7f573360009081526002602052604090205460ff16611fdd57611fdd6125ac565b611e7f611c90565b6000611fef612c5a565b6001600160a01b0316612000611f93565b6001600160a01b0316146120265760405162461bcd60e51b8152600401610f7a90613a77565b8260ff1660011415612051576027805460ff60b01b1916831515600114600160b01b02179055610f31565b8260ff1660021415612078576027805460ff60b81b19168315600160b81b02179055610f31565b8260ff1660031415610f315760278054600160c01b6001851515140260ff60c01b1990911617905550600192915050565b6120b1612c5a565b6001600160a01b03166120c2611f93565b6001600160a01b0316146120e85760405162461bcd60e51b8152600401610f7a90613a77565b604051636651f41960e11b8152829082906001600160a01b0383169063cca3e8329061211890309060040161369c565b60206040518083038186803b15801561213057600080fd5b505afa158015612144573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216891906135a7565b10156121865760405162461bcd60e51b8152600401610f7a9061384f565b60405163a9059cbb60e01b81526001600160a01b0382169063a9059cbb906121b490339086906004016136d4565b602060405180830381600087803b1580156121ce57600080fd5b505af11580156121e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122069190613573565b50505050565b606060078054610e9a90613cf0565b6001600160a01b0381161580159061224d5750601c546001600160a01b0316612242612c5a565b6001600160a01b0316145b6122695760405162461bcd60e51b8152600401610f7a9061395e565b601e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000612295612c5a565b6001600160a01b03166122a6611f93565b6001600160a01b0316146122cc5760405162461bcd60e51b8152600401610f7a90613a77565b610e826122d7612c5a565b8361311e565b600080600460006122ec612c5a565b6001600160a01b03908116825260208083019390935260409182016000908120918816815292529020549050828110156123385760405162461bcd60e51b8152600401610f7a90613ba4565b6112de612343612c5a565b8561136f8685613cd9565b6000610f3161235b612c5a565b8484612c5e565b600061236c612c5a565b6001600160a01b031661237d611f93565b6001600160a01b0316146123a35760405162461bcd60e51b8152600401610f7a90613a77565b6001600160a01b0383166123c95760405162461bcd60e51b8152600401610f7a90613be9565b610f318383613285565b6000341180156123ea575066038d7ea4c680003410155b15611e7f573360009081526026602052604090205460ff16611e7f57611e7f61249d565b60235481565b61241c612c5a565b6001600160a01b031661242d611f93565b6001600160a01b0316146124535760405162461bcd60e51b8152600401610f7a90613a77565b6040513390819083156108fc029084906000818181858888f19350505050158015610dda573d6000803e3d6000fd5b6001600160a01b031660009081526020819052604090205490565b3360009081526026602052604090205460ff16156124ba57600080fd5b60006124c5336113e8565b9050600081116124d457600080fd5b336000908152602560205260409020546124ed57612516565b33600090815260256020526040902054156125165733600090815260256020526040902054600b555b6000602b54612530600b5443612f6890919063ffffffff16565b61253a9190613cba565b90506000612557602d5461105e8585612f9b90919063ffffffff16565b905060006125658285613c82565b336000818152602660205260409020805460ff1916600117905590915061258c90856131d2565b612206338261311e565b600b54600c54600d54600e54600f549091929394565b60006125b733612482565b9050600081116125c657600080fd5b336000908152602460205260409020546125e35743600b5561260c565b336000908152602460205260409020541561260c5733600090815260246020526040902054600b555b6000602c54612626600b5443612f6890919063ffffffff16565b6126309190613cba565b9050600061264d602e5461105e8585612f9b90919063ffffffff16565b6027549091508190600160b01b900460ff16151560011415612688573360009081526001602052604090205460ff1661268857612688611735565b336000818152600260205260409020805460ff19166001179055612206908261311e565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b6001600160a01b0381166000908152602660205260408120548190839060ff16612794576000612706856113e8565b111561279457612715846113e8565b600b546001600160a01b038616600090815260256020526040902054919450901561275557506001600160a01b0384166000908152602560205260409020545b602b546000906127654384612f68565b61276f9190613cba565b602d549091506127839061105e8388612f9b565b935061278f8486613c82565b945050505b6001600160a01b03811660009081526026602052604090205460ff161561284e5760006127c0856113e8565b111561284e576127cf846113e8565b600b546001600160a01b038616600090815260256020526040902054919450901561280f57506001600160a01b0384166000908152602560205260409020545b602b5460009061281f4384612f68565b6128299190613cba565b602d5490915061283d9061105e8388612f9b565b93506128498486613c82565b945050505b5050919050565b600061285f612c5a565b6001600160a01b0316612870611f93565b6001600160a01b0316146128965760405162461bcd60e51b8152600401610f7a90613a77565b8260ff16600114156128c1576027805460ff60a01b1916831515600114600160a01b02179055610f31565b8260ff16600214156128e8576027805460ff60a01b19168315600160a01b02179055610f31565b8260ff1660031415610f315760278054600160a81b6001851515140260ff60a81b1990911617905550600192915050565b6027546001600160a01b031681565b612930612c5a565b6001600160a01b0316612941611f93565b6001600160a01b0316146129675760405162461bcd60e51b8152600401610f7a90613a77565b60405133904780156108fc02916000818181858888f19350505050158015611718573d6000803e3d6000fd5b601654600090610100900460ff1680156129af5750601f544311155b6129cb5760405162461bcd60e51b8152600401610f7a90613b76565b662386f26fc100003410156129f25760405162461bcd60e51b8152600401610f7a90613b76565b6020543490600090612a05908390612f9b565b9050612a1330610d4f612c5a565b836001600160a01b0316612a25612c5a565b6001600160a01b031614158015612a4457506001600160a01b03841615155b8015612a5857506000612a5685611ac1565b115b156119b7576000612a7a61271061105e60185486612f9b90919063ffffffff16565b90506000612a9961271061105e60175486612f9b90919063ffffffff16565b9050612aa6308783612c5e565b612ab08483612f68565b6040519094506001600160a01b0387169083156108fc029084906000818181858888f19350505050158015612ae9573d6000803e3d6000fd5b505050601e546001600160a01b03166119ea57601b54601e80546001600160a01b0319166001600160a01b03928316179081905560405191169083156108fc029084906000818181858888f19350505050158015611374573d6000803e3d6000fd5b612b53612c5a565b6001600160a01b0316612b64611f93565b6001600160a01b031614612b8a5760405162461bcd60e51b8152600401610f7a90613a77565b6001600160a01b038116612bb05760405162461bcd60e51b8152600401610f7a90613890565b6009546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b612c14612c5a565b6001600160a01b0316612c25611f93565b6001600160a01b031614612c4b5760405162461bcd60e51b8152600401610f7a90613a77565b600855565b6117b23334610abc565b3390565b6001600160a01b038316612c845760405162461bcd60e51b8152600401610f7a90613aed565b6001600160a01b038216612caa5760405162461bcd60e51b8152600401610f7a906137ca565b6001600160a01b03831660009081526003602052604090205460ff16600114801590612cf357506001600160a01b03831660009081526003602081905260409091205460ff1614155b8015612d1b57506001600160a01b03821660009081526003602052604090205460ff16600214155b8015612d4457506001600160a01b03821660009081526003602081905260409091205460ff1614155b612d605760405162461bcd60e51b8152600401610f7a90613b76565b3360009081526001602052604090205460ff16612d7f57612d7f611735565b60026000612d8b612c5a565b6001600160a01b0316815260208101919091526040016000205460ff16612de357600160026000612dba612c5a565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b6001600160a01b03831660009081526020819052604090205481811015612e1c5760405162461bcd60e51b8152600401610f7a90613918565b612e268282613cd9565b6001600160a01b038086166000908152602081905260408082209390935590851681529081208054849290612e5c908490613c82565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612ea69190613c20565b60405180910390a350505050565b6001600160a01b038316612eda5760405162461bcd60e51b8152600401610f7a90613b32565b6001600160a01b038216612f005760405162461bcd60e51b8152600401610f7a906138d6565b6001600160a01b0380841660008181526004602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590612f5b908590613c20565b60405180910390a3505050565b600082821115612f8a5760405162461bcd60e51b8152600401610f7a90613980565b612f948284613cd9565b9392505050565b600082612faa57506000610f35565b6000612fb68385613cba565b905082612fc38583613c9a565b14612f945760405162461bcd60e51b8152600401610f7a906139ee565b60008082116130015760405162461bcd60e51b8152600401610f7a906139b7565b612f948284613c9a565b6001600160a01b03919091166000908152600360205260409020805460ff191660ff909216919091179055565b6001600160a01b03821661305e5760405162461bcd60e51b8152600401610f7a90613aac565b61306a82600083610dda565b6001600160a01b038216600090815260208190526040902054818110156130a35760405162461bcd60e51b8152600401610f7a9061380d565b6130ad8282613cd9565b6001600160a01b038416600090815260208190526040812091909155600580548492906130db908490613cd9565b90915550506040516000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612f5b908690613c20565b6001600160a01b0382166131445760405162461bcd60e51b8152600401610f7a90613be9565b80600560008282546131569190613c82565b90915550506001600160a01b03821660009081526020819052604081208054839290613183908490613c82565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906131c6908590613c20565b60405180910390a35050565b6001600160a01b0382166131f85760405162461bcd60e51b8152600401610f7a90613aac565b6001600160a01b038216600090815260226020526040902054818110156132315760405162461bcd60e51b8152600401610f7a9061380d565b61323b8282613cd9565b6001600160a01b038416600090815260226020526040812091909155602380548492906130db908490613cd9565b6001600160a01b03909116600090815260256020526040902055565b6001600160a01b0382166132ab5760405162461bcd60e51b8152600401610f7a90613be9565b80602360008282546132bd9190613c82565b90915550506001600160a01b03821660009081526022602052604081208054839290613183908490613c82565b6000806132f683612482565b600b546001600160a01b0385166000908152602460205260409020549193509061332157504361335a565b6001600160a01b0384166000908152602460205260409020541561335a57506001600160a01b0383166000908152602460205260409020545b602c5460009061336a4384612f68565b6133749190613cba565b602e549091506133889061105e8387612f9b565b95945050505050565b6001600160a01b03909116600090815260246020526040902055565b6001600160a01b0383166133d35760405162461bcd60e51b8152600401610f7a90613aed565b6001600160a01b0382166133f95760405162461bcd60e51b8152600401610f7a906137ca565b6001600160a01b038316600090815260226020526040902054818110156134325760405162461bcd60e51b8152600401610f7a90613918565b61343c8282613cd9565b6001600160a01b038086166000908152602260205260408082209390935590851681529081208054849290612e5c908490613c82565b80356001600160a01b0381168114610e8657600080fd5b803560ff81168114610e8657600080fd5b6000602082840312156134ab578081fd5b612f9482613472565b600080604083850312156134c6578081fd5b6134cf83613472565b91506134dd60208401613472565b90509250929050565b6000806000606084860312156134fa578081fd5b61350384613472565b925061351160208501613472565b9150604084013590509250925092565b60008060408385031215613533578182fd5b61353c83613472565b946020939093013593505050565b6000806040838503121561355c578182fd5b61356583613472565b91506134dd60208401613489565b600060208284031215613584578081fd5b8151612f9481613d5c565b6000602082840312156135a0578081fd5b5035919050565b6000602082840312156135b8578081fd5b5051919050565b600080604083850312156135d1578182fd5b50508035926020909101359150565b600080600080608085870312156135f5578081fd5b5050823594602084013594506040840135936060013592509050565b600080600080600060a08688031215613628578081fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000806040838503121561365d578182fd5b61366683613489565b9150602083013561367681613d5c565b809150509250929050565b60008060408385031215613693578182fd5b61353c83613489565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b96151587529415156020870152604086019390935260608501919091526001600160a01b0390811660808501521660a083015260c082015260e00190565b9815158952961515602089015260408801959095526060870193909352608086019190915260a085015260c084015260e08301526101008201526101200190565b6000602080835283518082850152825b818110156137a357858101830151858201604001528201613787565b818111156137b45783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526022908201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604082015261636560f01b606082015260800190565b60208082526021908201527f43616e6e6f74207769746864726177206d6f7265207468616e2062616c616e636040820152606560f81b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b6020808252600890820152677265636f7665727960c01b604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526028908201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616040820152676c6c6f77616e636560c01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252601490820152735472616e73616374696f6e207265636f7665727960601b604082015260600190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b948552602085019390935260408401919091526060830152608082015260a00190565b958652602086019490945260408501929092526060840152608083015260a082015260c00190565b60ff91909116815260200190565b60008219821115613c9557613c95613d46565b500190565b600082613cb557634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613cd457613cd4613d46565b500290565b600082821015613ceb57613ceb613d46565b500390565b600281046001821680613d0457607f821691505b60208210811415613d2557634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613d3f57613d3f613d46565b5060010190565b634e487b7160e01b600052601160045260246000fd5b801515811461171857600080fdfea26469706673582212203f20f5feeae50247e795ccff252276007a6728e6ab480e0686d8ee0313e9ecfc64736f6c63430008000033

Deployed Bytecode Sourcemap

36045:27178:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45510:29;45517:10;45529:9;45510:6;:29::i;:::-;36045:27178;;45423:29;45430:10;45442:9;45423:6;:29::i;38105:429::-;;;;;;;;;;-1:-1:-1;38105:429:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23314:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26687:169::-;;;;;;;;;;-1:-1:-1;26687:169:0;;;;;:::i;:::-;;:::i;61580:173::-;;;;;;;;;;-1:-1:-1;61580:173:0;;;;;:::i;:::-;;:::i;59255:1346::-;;;;;;;;;;-1:-1:-1;59255:1346:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24434:132::-;;;;;;;;;;;;;:::i;40145:255::-;;;;;;;;;;-1:-1:-1;40145:255:0;;;;;:::i;:::-;;:::i;42228:903::-;;;;;;:::i;:::-;;:::i;27338:422::-;;;;;;;;;;-1:-1:-1;27338:422:0;;;;;:::i;:::-;;:::i;62750:172::-;;;;;;;;;;-1:-1:-1;62750:172:0;;;;;:::i;:::-;;:::i;57668:161::-;;;;;;;;;;-1:-1:-1;57668:161:0;;;;;:::i;:::-;;:::i;62310:245::-;;;;;;;;;;-1:-1:-1;62310:245:0;;;;;:::i;:::-;;:::i;41690:526::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;24276:93::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;61403:170::-;;;;;;;;;;-1:-1:-1;61403:170:0;;;;;:::i;:::-;;:::i;28169:215::-;;;;;;;;;;-1:-1:-1;28169:215:0;;;;;:::i;:::-;;:::i;48113:103::-;;;;;;;;;;-1:-1:-1;48113:103:0;;;;;:::i;:::-;;:::i;48697:553::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;40854:91::-;;;;;;;;;;-1:-1:-1;40854:91:0;;;;;:::i;:::-;;:::i;39428:216::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;24899:468::-;;;;;;;;;;;;;:::i;50007:191::-;;;;;;;;;;-1:-1:-1;50007:191:0;;;;;:::i;:::-;;:::i;47939:166::-;;;;;;;;;;-1:-1:-1;47939:166:0;;;;;:::i;:::-;;:::i;47774:157::-;;;;;;;;;;-1:-1:-1;47774:157:0;;;;;:::i;:::-;;:::i;38540:687::-;;;;;;:::i;:::-;;:::i;55296:581::-;;;;;;;;;;;;;:::i;57401:259::-;;;;;;;;;;-1:-1:-1;57401:259:0;;;;;:::i;:::-;;:::i;62567:171::-;;;;;;;;;;-1:-1:-1;62567:171:0;;;;;:::i;:::-;;:::i;35424:148::-;;;;;;;;;;;;;:::i;56725:396::-;;;;;;;;;;;;;:::i;39927:214::-;;;;;;;;;;-1:-1:-1;39927:214:0;;;;;:::i;:::-;;:::i;51140:174::-;;;;;;;;;;-1:-1:-1;51140:174:0;;;;;:::i;:::-;;:::i;40997:681::-;;;;;;;;;;-1:-1:-1;40997:681:0;;;;;:::i;:::-;;:::i;53656:423::-;;;:::i;25379:262::-;;;;;;;;;;-1:-1:-1;25379:262:0;;;;;:::i;:::-;;:::i;52351:408::-;;;:::i;34775:87::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;53231:421::-;;;:::i;52031:311::-;;;;;;;;;;-1:-1:-1;52031:311:0;;;;;:::i;:::-;;:::i;62934:284::-;;;;;;;;;;-1:-1:-1;62934:284:0;;;;;:::i;:::-;;:::i;23533:104::-;;;;;;;;;;;;;:::i;62151:151::-;;;;;;;;;;-1:-1:-1;62151:151:0;;;;;:::i;:::-;;:::i;40612:130::-;;;;;;;;;;-1:-1:-1;40612:130:0;;;;;:::i;:::-;;:::i;28887:377::-;;;;;;;;;;-1:-1:-1;28887:377:0;;;;;:::i;:::-;;:::i;25852:278::-;;;;;;;;;;-1:-1:-1;25852:278:0;;;;;:::i;:::-;;:::i;49771:228::-;;;;;;;;;;-1:-1:-1;49771:228:0;;;;;:::i;:::-;;:::i;52763:462::-;;;:::i;44254:25::-;;;;;;;;;;;;;:::i;61821:144::-;;;;;;;;;;-1:-1:-1;61821:144:0;;;;;:::i;:::-;;:::i;24629:178::-;;;;;;;;;;-1:-1:-1;24629:178:0;;;;;:::i;:::-;;:::i;54507:781::-;;;;;;;;;;;;;:::i;39233:191::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;55883:834::-;;;;;;;;;;;;;:::i;26389:151::-;;;;;;;;;;-1:-1:-1;26389:151:0;;;;;:::i;:::-;;:::i;57835:1413::-;;;;;;;;;;-1:-1:-1;57835:1413:0;;;;;:::i;:::-;;:::i;47450:316::-;;;;;;;;;;-1:-1:-1;47450:316:0;;;;;:::i;:::-;;:::i;44544:22::-;;;;;;;;;;;;;:::i;61977:166::-;;;;;;;;;;;;;:::i;43139:950::-;;;;;;:::i;:::-;;:::i;35725:244::-;;;;;;;;;;-1:-1:-1;35725:244:0;;;;;:::i;:::-;;:::i;61239:151::-;;;;;;;;;;-1:-1:-1;61239:151:0;;;;;:::i;:::-;;:::i;45560:83::-;;;:::i;45655:1207::-;45729:9;;-1:-1:-1;;;45729:9:0;;;;:17;;45742:4;45729:17;45725:933;;;45770:5;;-1:-1:-1;;;;;45770:5:0;45762:28;;;;:58;;;45808:11;45795:9;:24;;45762:58;45759:889;;;45837:14;45876:8;;45866:7;;45854:9;:19;;;;:::i;:::-;:30;;;;:::i;:::-;45912:5;;:31;;-1:-1:-1;;;45912:31:0;;45837:47;;-1:-1:-1;;;;;;45912:5:0;;:16;;:31;;45937:4;;45912:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45902:6;:41;45899:318;;45974:7;;-1:-1:-1;;;;;45974:7:0;45966:30;45963:239;;46017:5;;46036:7;;46017:47;;-1:-1:-1;;;46017:47:0;;-1:-1:-1;;;;;46017:5:0;;;;:18;;:47;;46036:7;;;46045:10;;46057:6;;46017:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45963:239;;;46104:7;;-1:-1:-1;;;;;46104:7:0;46093:109;;46147:5;;:34;;-1:-1:-1;;;46147:34:0;;-1:-1:-1;;;;;46147:5:0;;;;:14;;:34;;46162:10;;46174:6;;46147:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;46093:109;45759:889;;;;46250:5;;-1:-1:-1;;;;;46250:5:0;46242:28;:58;;;;;46288:11;46275:9;:24;;46242:58;46238:410;;;46442:14;46481:8;;46471:7;;46459:9;:19;;;;:::i;:::-;:30;;;;:::i;:::-;46507:7;;46442:47;;-1:-1:-1;46507:7:0;;;;;:45;;;;;46528:24;46546:4;46528:9;:24::i;:::-;46518:6;:34;;46507:45;46504:125;;;46568:44;46586:4;46592:12;:10;:12::i;:::-;46605:6;46568:9;:44::i;:::-;46238:410;;46670:9;;-1:-1:-1;;;46670:9:0;;;;:17;;46683:4;46670:17;46666:178;;;46706:10;;-1:-1:-1;;;;;46706:10:0;46703:79;;46759:6;;46746:10;:19;;-1:-1:-1;;;;;;46746:19:0;-1:-1:-1;;;;;46759:6:0;;;46746:19;;;;;;46703:79;46802:10;;46794:39;;-1:-1:-1;;;;;46802:10:0;;;;46823:9;46794:39;;;;;46802:10;46794:39;46802:10;46794:39;46823:9;46802:10;46794:39;;;;;;;;;;;;;;;;;;;;;46666:178;45655:1207;;:::o;38105:429::-;38157:12;38200;38189:7;;:23;;:50;;;;;38232:7;;38216:12;:23;;38189:50;38181:59;;;;;;38266:4;;38259;;:11;:24;;;-1:-1:-1;38274:4:0;;:9;38259:24;38251:33;;;;;;38295:4;:7;;;:4;:7;;;:::i;:::-;;;;-1:-1:-1;;38316:10:0;-1:-1:-1;;;;;38316:20:0;;;;;;:46;;;38340:17;38350:6;38340:9;:17::i;:::-;:22;;38316:46;:70;;;;-1:-1:-1;;;;;;38366:20:0;;;;38316:70;38313:137;;;38400:38;38418:4;38425:6;38433:4;;38400:9;:38::i;:::-;38460:42;38478:4;38485:10;38497:4;;38460:9;:42::i;:::-;-1:-1:-1;38520:4:0;38105:429;;;;:::o;23314:100::-;23368:13;23401:5;23394:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23314:100;:::o;26687:169::-;26770:4;26787:39;26796:12;:10;:12::i;:::-;26810:7;26819:6;26787:8;:39::i;:::-;-1:-1:-1;26844:4:0;26687:169;;;;;:::o;61580:173::-;35006:12;:10;:12::i;:::-;-1:-1:-1;;;;;34995:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34995:23:0;;34987:68;;;;-1:-1:-1;;;34987:68:0;;;;;;;:::i;:::-;;;;;;;;;61713:8:::1;:15:::0;;;;61730:8:::1;:15:::0;61580:173::o;59255:1346::-;-1:-1:-1;;;;;59480:19:0;;59315:14;59480:19;;;:11;:19;;;;;;59315:14;;59460:7;;59480:19;;59475:749;;59701:1;59679:19;59690:7;59679:10;:19::i;:::-;:23;59676:540;;;59730:19;59741:7;59730:10;:19::i;:::-;59788:7;;-1:-1:-1;;;;;59809:16:0;;59761;59809;;;:7;:16;;;;;;59713:37;;-1:-1:-1;59788:7:0;59806:208;;-1:-1:-1;59902:12:0;59806:208;;;-1:-1:-1;;;;;59935:16:0;;59954:1;59935:16;;;:7;:16;;;;;;:20;59932:82;;-1:-1:-1;;;;;;59986:16:0;;;;;;:7;:16;;;;;;59932:82;60077:8;;60023:14;;60049:26;:12;60066:8;60049:16;:26::i;:::-;60048:37;;;;:::i;:::-;60137:8;;60023:63;;-1:-1:-1;60105:41:0;;:27;60023:63;60124:6;60105:10;:27::i;:::-;:31;;:41::i;:::-;60095:51;;59676:540;;;-1:-1:-1;;;;;60234:19:0;;;;;;:11;:19;;;;;;;;60231:120;;;60265:19;60276:7;60265:10;:19::i;:::-;60262:81;;60310:1;60301:10;;60332:1;60322:11;;60262:81;60512:18;60523:7;60513:6;60512:18;:::i;:::-;60495:36;59255:1346;-1:-1:-1;;;;59255:1346:0:o;24434:132::-;24495:7;24537:21;;;;;;;;;24522:12;;:36;;24537:21;24522:36;:::i;:::-;24515:43;;24434:132;:::o;40145:255::-;35006:12;:10;:12::i;:::-;-1:-1:-1;;;;;34995:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34995:23:0;;34987:68;;;;-1:-1:-1;;;34987:68:0;;;;;;;:::i;:::-;40272:7:::1;:18:::0;;;;40297:7:::1;:18:::0;;;;40322:6:::1;:16:::0;40345:6:::1;:15:::0;40367:4:::1;:12:::0;-1:-1:-1;40386:4:0::1;:8:::0;40145:255::o;42228:903::-;42353:10;;42283:4;;42353:10;;:38;;;;;42380:11;;42367:9;:24;;42353:38;42345:70;;;;-1:-1:-1;;;42345:70:0;;;;;;;:::i;:::-;42426:51;42444:4;42450:12;:10;:12::i;:::-;42463:13;;42426:9;:51::i;:::-;42546:9;-1:-1:-1;;;;;42569:20:0;;:12;:10;:12::i;:::-;-1:-1:-1;;;;;42569:20:0;;;:40;;;;-1:-1:-1;;;;;;42591:18:0;;;;42569:40;:61;;;;;42629:1;42611:17;42621:6;42611:9;:17::i;:::-;:19;42569:61;42566:401;;;42646:13;42662:37;42693:5;42662:26;42678:9;;42662:11;;:15;;:26;;;;:::i;:37::-;42646:53;;42714:14;42731:39;42764:5;42731:28;42749:9;;42731:13;;:17;;:28;;;;:::i;:39::-;42714:56;;42785:41;42803:4;42809:6;42816:9;42785;:41::i;:::-;42883:23;:9;42897:8;42883:13;:23::i;:::-;42921:34;;42873:33;;-1:-1:-1;;;;;;42921:24:0;;;:34;;;;;42946:8;;42921:34;;;;42946:8;42921:24;:34;;;;;;;;;;;;;;;;;;;;;42566:401;;;42980:10;;-1:-1:-1;;;;;42980:10:0;42977:75;;43033:6;;43020:10;:19;;-1:-1:-1;;;;;;43020:19:0;-1:-1:-1;;;;;43033:6:0;;;43020:19;;;;;;42977:75;43070:10;;43062:39;;-1:-1:-1;;;;;43070:10:0;;;;43062:39;;;;;43091:9;;43070:10;43062:39;43070:10;43062:39;43091:9;43070:10;43062:39;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43119:4:0;;42228:903;-1:-1:-1;;;42228:903:0:o;27338:422::-;27444:4;27461:36;27471:6;27479:9;27490:6;27461:9;:36::i;:::-;-1:-1:-1;;;;;27537:19:0;;27510:24;27537:19;;;:11;:19;;;;;27510:24;27557:12;:10;:12::i;:::-;-1:-1:-1;;;;;27537:33:0;-1:-1:-1;;;;;27537:33:0;;;;;;;;;;;;;27510:60;;27609:6;27589:16;:26;;27581:79;;;;-1:-1:-1;;;27581:79:0;;;;;;;:::i;:::-;27671:57;27680:6;27688:12;:10;:12::i;:::-;27702:25;27721:6;27702:16;:25;:::i;:::-;27671:8;:57::i;:::-;-1:-1:-1;27748:4:0;;27338:422;-1:-1:-1;;;;27338:422:0:o;62750:172::-;62840:6;;-1:-1:-1;;;;;62840:6:0;62824:12;:10;:12::i;:::-;-1:-1:-1;;;;;62824:22:0;;:45;;;-1:-1:-1;62864:5:0;;-1:-1:-1;;;;;62864:5:0;62848:12;:10;:12::i;:::-;-1:-1:-1;;;;;62848:21:0;;62824:45;62816:66;;;;-1:-1:-1;;;62816:66:0;;;;;;;:::i;:::-;62893:21;62899:6;62907;62893:5;:21::i;57668:161::-;-1:-1:-1;;;;;57753:17:0;57726:7;57753:17;;;:8;:17;;;;;;;57668:161::o;62310:245::-;62395:6;;62355:4;;-1:-1:-1;;;;;62395:6:0;62379:12;:10;:12::i;:::-;-1:-1:-1;;;;;62379:22:0;;:45;;;-1:-1:-1;62419:5:0;;-1:-1:-1;;;;;62419:5:0;62403:12;:10;:12::i;:::-;-1:-1:-1;;;;;62403:21:0;;62379:45;62371:66;;;;-1:-1:-1;;;62371:66:0;;;;;;;:::i;:::-;62470:5;;-1:-1:-1;;;;;62470:5:0;62456:19;;;;:35;;-1:-1:-1;;;;;;62477:14:0;;;;62456:35;62448:56;;;;-1:-1:-1;;;62448:56:0;;;;;;;:::i;:::-;-1:-1:-1;62515:5:0;:10;;-1:-1:-1;;;;;62515:10:0;;-1:-1:-1;;;;;;62515:10:0;;;;;;;62310:245;;;:::o;41690:526::-;41911:10;;41969:9;;42001:12;;41911:10;;;;;;41941:7;;;;41969:9;42035:12;41730:14;;;;42068:23;42078:12;:10;:12::i;42068:23::-;42058:33;;42135:11;;42122:24;;42168:9;;42157:20;;42199:9;;42188:20;;41690:526;;;;;;;;;:::o;24276:93::-;24359:2;24276:93;:::o;61403:170::-;35006:12;:10;:12::i;:::-;-1:-1:-1;;;;;34995:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34995:23:0;;34987:68;;;;-1:-1:-1;;;34987:68:0;;;;;;;:::i;:::-;61535:7:::1;:14:::0;;;;61551:7:::1;:14:::0;61403:170::o;28169:215::-;28257:4;28274:80;28283:12;:10;:12::i;:::-;28297:7;28343:10;28306:11;:25;28318:12;:10;:12::i;:::-;-1:-1:-1;;;;;28306:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;28306:25:0;;;:34;;;;;;;;;;:47;;;;:::i;48113:103::-;35006:12;:10;:12::i;:::-;-1:-1:-1;;;;;34995:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34995:23:0;;34987:68;;;;-1:-1:-1;;;34987:68:0;;;;;;;:::i;:::-;48186:7:::1;:22:::0;;-1:-1:-1;;;;;;48186:22:0::1;-1:-1:-1::0;;;;;48186:22:0;;;::::1;::::0;;;::::1;::::0;;48113:103::o;48697:553::-;48887:9;;48950:7;;48995:8;;48887:9;-1:-1:-1;;;48887:9:0;;;;;-1:-1:-1;;;48918:9:0;;;;48950:7;48740:13;;;;;;;;48981:11;48950:7;48981:1;:11;:::i;:::-;:22;;;;:::i;:::-;49034:5;;49062:7;;48969:35;;-1:-1:-1;;;;;;49034:5:0;;;;-1:-1:-1;49062:7:0;;-1:-1:-1;49084:28:0;49080:157;;-1:-1:-1;49138:1:0;49080:157;;;49218:3;;49184:5;;:31;;-1:-1:-1;;;49184:31:0;;-1:-1:-1;;;;;49184:5:0;;;;:16;;:31;;49209:4;;49184:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;;;;:::i;:::-;49170:52;;49080:157;48697:553;;;;;;;:::o;40854:91::-;40910:27;40916:12;:10;:12::i;:::-;40930:6;40910:5;:27::i;:::-;40854:91;:::o;39428:216::-;39593:7;;39602;;39611:4;;39617;;39623:6;;39631;;39428:216;;;;;;:::o;24899:468::-;24988:7;:21;24996:12;:10;:12::i;:::-;-1:-1:-1;;;;;24988:21:0;;;;;;;;;;;;-1:-1:-1;24988:21:0;;;;24984:376;;25042:7;;25061:10;;25058:294;;25107:6;25151:4;;25079:17;25135:12;:10;:12::i;:::-;-1:-1:-1;;;;;25127:21:0;;;;;;;;;;;;-1:-1:-1;25127:21:0;:28;;-1:-1:-1;;25127:28:0;;;;;;;;;;25313:29;25319:12;:10;:12::i;:::-;25332:9;25313:5;:29::i;24984:376::-;24899:468::o;50007:191::-;35006:12;:10;:12::i;:::-;-1:-1:-1;;;;;34995:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34995:23:0;;34987:68;;;;-1:-1:-1;;;34987:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50094:21:0;::::1;50086:67;;;;-1:-1:-1::0;;;50086:67:0::1;;;;;;;:::i;:::-;50164:26;50174:7;50183:6;50164:9;:26::i;47939:166::-:0;35006:12;:10;:12::i;:::-;-1:-1:-1;;;;;34995:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34995:23:0;;34987:68;;;;-1:-1:-1;;;34987:68:0;;;;;;;:::i;:::-;48072:5:::1;:25:::0;;-1:-1:-1;;;;;;48072:25:0::1;-1:-1:-1::0;;;;;48072:25:0;;;::::1;::::0;;;::::1;::::0;;47939:166::o;47774:157::-;35006:12;:10;:12::i;:::-;-1:-1:-1;;;;;34995:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34995:23:0;;34987:68;;;;-1:-1:-1;;;34987:68:0;;;;;;;:::i;:::-;47903:7:::1;:20:::0;47774:157::o;38540:687::-;38599:12;38638;38627:7;;:23;;:50;;;;;38670:7;;38654:12;:23;;38627:50;38619:59;;;;;;38706:11;38693:9;:24;;38685:56;;;;-1:-1:-1;;;38685:56:0;;;;;;;:::i;:::-;38763:4;;38756;;:11;:24;;;-1:-1:-1;38771:4:0;;:9;38756:24;38748:33;;;;;;38788:12;38803:9;38788:24;;38819:13;38863:7;38855:4;38848:6;;:11;;;;:::i;:::-;38847:23;;;;:::i;:::-;38877:4;:7;;38839:31;;-1:-1:-1;38877:4:0;:7;;;:::i;:::-;;;;-1:-1:-1;;38894:10:0;-1:-1:-1;;;;;38894:20:0;;;;;;:46;;;38918:17;38928:6;38918:9;:17::i;:::-;:22;;38894:46;:70;;;;-1:-1:-1;;;;;;38944:20:0;;;;38894:70;38891:138;;;38982:39;39000:4;39007:6;39015:5;38982:9;:39::i;:::-;39041:43;39059:4;39066:10;39078:5;39041:9;:43::i;:::-;39096:10;;-1:-1:-1;;;;;39096:10:0;39093:64;;39142:6;;39129:10;:19;;-1:-1:-1;;;;;;39129:19:0;-1:-1:-1;;;;;39142:6:0;;;39129:19;;;;;;39093:64;39171:10;;39163:34;;-1:-1:-1;;;;;39171:10:0;;;;39163:34;;;;;39192:4;;39171:10;39163:34;39171:10;39163:34;39192:4;39171:10;39163:34;;;;;;;;;;;;;;;;;;;55296:581;55418:10;55406:23;;;;:11;:23;;;;;;;;55398:32;;;;;;55523:15;55541:22;55552:10;55541;:22::i;:::-;55523:40;-1:-1:-1;55573:11:0;;55570:71;;55607:10;55597:21;;;;:9;:21;;;;;;;;55593:37;;55620:10;:8;:10::i;:::-;55653:14;55670:22;55681:10;55670;:22::i;:::-;55653:39;;55716:1;55707:6;:10;55699:19;;;;;;55728:35;55739:10;55750:12;55728:10;:35::i;:::-;55782:10;55796:5;55772:21;;;:9;:21;;;;;:29;;-1:-1:-1;;55772:29:0;;;55811:24;;55828:6;55811:5;:24::i;:::-;55842:25;55848:10;55860:6;55842:5;:25::i;57401:259::-;-1:-1:-1;;;;;57604:20:0;;57458:7;57604:20;;;:11;:20;;;;;;;;:47;;57631:20;57643:7;57631:11;:20::i;:::-;57604:47;;;57627:1;57604:47;-1:-1:-1;;;;;57554:18:0;;;;;;:9;:18;;;;;;;;:45;;57579:20;57591:7;57579:11;:20::i;:::-;57554:45;;;57575:1;57554:45;-1:-1:-1;;;;;57508:16:0;;;;;;:7;:16;;;;;;;;:41;;57531:18;57541:7;57531:9;:18::i;:::-;57508:41;;;57527:1;57508:41;57485:19;57496:7;57485:10;:19::i;:::-;:65;;;;:::i;:::-;:115;;;;:::i;:::-;:167;;;;:::i;62567:171::-;62625:4;35006:12;:10;:12::i;:::-;-1:-1:-1;;;;;34995:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34995:23:0;;34987:68;;;;-1:-1:-1;;;34987:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;62649:18:0;::::1;62641:39;;;;-1:-1:-1::0;;;62641:39:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;62691:10:0::1;:17:::0;;-1:-1:-1;;;;;62691:17:0;::::1;-1:-1:-1::0;;;;;;62691:17:0;;::::1;;::::0;;;62567:171;;;:::o;35424:148::-;35006:12;:10;:12::i;:::-;-1:-1:-1;;;;;34995:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34995:23:0;;34987:68;;;;-1:-1:-1;;;34987:68:0;;;;;;;:::i;:::-;35515:6:::1;::::0;35494:40:::1;::::0;35531:1:::1;::::0;-1:-1:-1;;;;;35515:6:0::1;::::0;35494:40:::1;::::0;35531:1;;35494:40:::1;35545:6;:19:::0;;-1:-1:-1;;;;;;35545:19:0::1;::::0;;35424:148::o;56725:396::-;56905:14;56922:22;56933:10;56922;:22::i;:::-;56905:39;;56968:1;56959:6;:10;56951:19;;;;;;56984:35;56995:10;57006:12;56984:10;:35::i;:::-;-1:-1:-1;57043:10:0;57057:5;57031:23;;;:11;:23;;;;;:31;;-1:-1:-1;;57031:31:0;;;56725:396::o;39927:214::-;35006:12;:10;:12::i;:::-;-1:-1:-1;;;;;34995:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34995:23:0;;34987:68;;;;-1:-1:-1;;;34987:68:0;;;;;;;:::i;:::-;40039:7:::1;:18:::0;;;;40064:7:::1;:18:::0;;;;40089:4:::1;:12:::0;40108:4:::1;:12:::0;-1:-1:-1;40127:4:0::1;:8:::0;39927:214::o;51140:174::-;51221:4;51238:46;51252:12;:10;:12::i;:::-;51266:9;51277:6;51238:13;:46::i;40997:681::-;41062:4;35006:12;:10;:12::i;:::-;-1:-1:-1;;;;;34995:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34995:23:0;;34987:68;;;;-1:-1:-1;;;34987:68:0;;;;;;;:::i;:::-;41145:3:::1;:6;;41150:1;41145:6;41142:482;;;41167:10;:21:::0;;-1:-1:-1;;41167:21:0::1;41187:1;41180:8:::0;::::1;41167:21;::::0;;41142:482:::1;;;41208:3;:6;;41213:1;41208:6;41205:419;;;41230:7;:18:::0;;-1:-1:-1;;41230:18:0::1;41247:1;41240:8:::0;::::1;41230:18;;;::::0;;41205:419:::1;;;41268:3;:6;;41273:1;41268:6;41265:359;;;41290:9;:17:::0;;;41265:359:::1;;;41327:3;:6;;41332:1;41327:6;41324:300;;;41349:11;:19:::0;;;41324:300:::1;;;41388:3;:6;;41393:1;41388:6;41385:239;;;41410:13;:21:::0;;;41385:239:::1;;;41451:3;:6;;41456:1;41451:6;41448:176;;;41473:12;:20:::0;;;41448:176:::1;;;41513:3;:6;;41518:1;41513:6;41510:114;;;41535:9;:17:::0;;;41510:114:::1;;;41572:3;:7;;41577:2;41572:7;41569:55;;;-1:-1:-1::0;41595:9:0::1;:17:::0;-1:-1:-1;41666:4:0::1;::::0;40997:681::o;53656:423::-;53716:1;53705:9;:12;:42;;;;;53735:11;53722:9;:24;;53705:42;53701:171;;;53814:10;53802:23;;;;:11;:23;;;;;;;;53798:41;;53827:12;:10;:12::i;:::-;53888:8;;-1:-1:-1;;;53888:8:0;;;;:16;;53900:4;53888:16;53884:179;;;53925:10;;-1:-1:-1;;;;;53925:10:0;53922:79;;53978:6;;53965:10;:19;;-1:-1:-1;;;;;;53965:19:0;-1:-1:-1;;;;;53978:6:0;;;53965:19;;;;;;53922:79;54021:10;;54013:39;;-1:-1:-1;;;;;54021:10:0;;;;54042:9;54013:39;;;;;54021:10;54013:39;54021:10;54013:39;54042:9;54021:10;54013:39;;;;;;;;;;;;;;;;;;;25379:262;-1:-1:-1;;;;;25479:16:0;;25444:14;25479:16;;;:7;:16;;;;;;;;25474:67;;-1:-1:-1;25524:7:0;;25474:67;-1:-1:-1;;;;;25551:16:0;;;;;;:7;:16;;;;;;;;25548:47;;;-1:-1:-1;25585:1:0;25379:262;;;:::o;52351:408::-;52411:1;52400:9;:12;:42;;;;;52430:11;52417:9;:24;;52400:42;52396:166;;;52507:10;52495:23;;;;:11;:23;;;;;;;;52491:41;;52520:12;:10;:12::i;:::-;52545:9;:7;:9::i;34775:87::-;34848:6;;-1:-1:-1;;;;;34848:6:0;34775:87;:::o;53231:421::-;53292:1;53281:9;:12;:42;;;;;53311:11;53298:9;:24;;53281:42;53277:168;;;53389:10;53377:23;;;;:11;:23;;;;;;;;53373:41;;53402:12;:10;:12::i;:::-;53427:10;:8;:10::i;52031:311::-;52095:4;35006:12;:10;:12::i;:::-;-1:-1:-1;;;;;34995:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34995:23:0;;34987:68;;;;-1:-1:-1;;;34987:68:0;;;;;;;:::i;:::-;52114:3:::1;:6;;52119:1;52114:6;52111:202;;;52136:7;:21:::0;;-1:-1:-1;;;;52136:21:0::1;52146:11:::0;::::1;;52153:4;52146:11;-1:-1:-1::0;;;52136:21:0::1;;::::0;;52111:202:::1;;;52185:3;:6;;52190:1;52185:6;52182:131;;;52207:7;:22:::0;;-1:-1:-1;;;;52207:22:0::1;52217:12:::0;::::1;-1:-1:-1::0;;;52207:22:0::1;;::::0;;52182:131:::1;;;52249:3;:6;;52254:1;52249:6;52246:67;;;52271:8;:22:::0;;-1:-1:-1;;;52289:4:0::1;52282:11:::0;::::1;;;52271:22;-1:-1:-1::0;;;;52271:22:0;;::::1;;::::0;;-1:-1:-1;52330:4:0::1;52031:311:::0;;;;:::o;62934:284::-;35006:12;:10;:12::i;:::-;-1:-1:-1;;;;;34995:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34995:23:0;;34987:68;;;;-1:-1:-1;;;34987:68:0;;;;;;;:::i;:::-;63082:32:::1;::::0;-1:-1:-1;;;63082:32:0;;63048:14;;63118:7;;-1:-1:-1;;;;;63082:17:0;::::1;::::0;::::1;::::0;:32:::1;::::0;63108:4:::1;::::0;63082:32:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;;63074:89;;;;-1:-1:-1::0;;;63074:89:0::1;;;;;;;:::i;:::-;63174:36;::::0;-1:-1:-1;;;63174:36:0;;-1:-1:-1;;;;;63174:15:0;::::1;::::0;::::1;::::0;:36:::1;::::0;63190:10:::1;::::0;63202:7;;63174:36:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35066:1;62934:284:::0;;:::o;23533:104::-;23589:13;23622:7;23615:14;;;;;:::i;62151:151::-;-1:-1:-1;;;;;62210:18:0;;;;;;:43;;-1:-1:-1;62248:5:0;;-1:-1:-1;;;;;62248:5:0;62232:12;:10;:12::i;:::-;-1:-1:-1;;;;;62232:21:0;;62210:43;62202:64;;;;-1:-1:-1;;;62202:64:0;;;;;;;:::i;:::-;62277:10;:17;;-1:-1:-1;;;;;;62277:17:0;-1:-1:-1;;;;;62277:17:0;;;;;;;;;;62151:151::o;40612:130::-;40668:4;35006:12;:10;:12::i;:::-;-1:-1:-1;;;;;34995:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34995:23:0;;34987:68;;;;-1:-1:-1;;;34987:68:0;;;;;;;:::i;:::-;40685:27:::1;40691:12;:10;:12::i;:::-;40705:6;40685:5;:27::i;28887:377::-:0;28980:4;28997:24;29024:11;:25;29036:12;:10;:12::i;:::-;-1:-1:-1;;;;;29024:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;29024:25:0;;;:34;;;;;;;;;;;-1:-1:-1;29077:35:0;;;;29069:85;;;;-1:-1:-1;;;29069:85:0;;;;;;;:::i;:::-;29165:67;29174:12;:10;:12::i;:::-;29188:7;29197:34;29216:15;29197:16;:34;:::i;25852:278::-;25938:4;26058:42;26068:12;:10;:12::i;:::-;26082:9;26093:6;26058:9;:42::i;49771:228::-;49844:4;35006:12;:10;:12::i;:::-;-1:-1:-1;;;;;34995:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34995:23:0;;34987:68;;;;-1:-1:-1;;;34987:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49869:21:0;::::1;49861:65;;;;-1:-1:-1::0;;;49861:65:0::1;;;;;;;:::i;:::-;49947:22;49953:7;49962:6;49947:5;:22::i;52763:462::-:0;52822:1;52811:9;:12;:42;;;;;52841:11;52828:9;:24;;52811:42;52807:211;;;52967:10;52957:21;;;;:9;:21;;;;;;;;52953:37;;52980:10;:8;:10::i;44254:25::-;;;;:::o;61821:144::-;35006:12;:10;:12::i;:::-;-1:-1:-1;;;;;34995:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34995:23:0;;34987:68;;;;-1:-1:-1;;;34987:68:0;;;;;;;:::i;:::-;61933:24:::1;::::0;61911:10:::1;::::0;;;61933:24;::::1;;;::::0;61950:6;;61877:23:::1;61933:24:::0;61877:23;61933:24;61950:6;61911:10;61933:24;::::1;;;;;;;;;;;;;::::0;::::1;;;;24629:178:::0;-1:-1:-1;;;;;24731:18:0;24704:7;24731:18;;;;;;;;;;;;24629:178::o;54507:781::-;54629:10;54619:21;;;;:9;:21;;;;;;;;54618:22;54610:31;;;;;;54650:14;54667:22;54678:10;54667;:22::i;:::-;54650:39;;54713:1;54704:6;:10;54696:19;;;;;;54735:10;54727:19;;;;:7;:19;;;;;;54724:170;;;;;54817:10;54831:1;54809:19;;;:7;:19;;;;;;:23;54806:88;;54871:10;54863:19;;;;:7;:19;;;;;;54845:7;:38;54806:88;54900:14;54953:7;;54926:25;54943:7;;54926:12;:16;;:25;;;;:::i;:::-;54925:35;;;;:::i;:::-;54900:61;;54968:15;54986:40;55018:7;;54986:27;55005:6;54986;:10;;:27;;;;:::i;:40::-;54968:58;-1:-1:-1;55033:17:0;55061:18;54968:58;55062:6;55061:18;:::i;:::-;55190:10;55180:21;;;;:9;:21;;;;;:28;;-1:-1:-1;;55180:28:0;55204:4;55180:28;;;55033:47;;-1:-1:-1;55218:29:0;;55240:6;55218:9;:29::i;:::-;55255:27;55261:10;55272:9;55255:5;:27::i;39233:191::-;39383:7;;39392;;39401:4;;39407;;39413;;39233:191;;;;;:::o;55883:834::-;56080:14;56097:22;56108:10;56097;:22::i;:::-;56080:39;;56143:1;56134:6;:10;56126:19;;;;;;56165:10;56157:19;;;;:7;:19;;;;;;56154:216;;56252:12;56234:7;:31;56154:216;;;56292:10;56306:1;56284:19;;;:7;:19;;;;;;:23;56281:89;;56347:10;56339:19;;;;:7;:19;;;;;;56321:7;:38;56281:89;56376:14;56429:8;;56402:25;56419:7;;56402:12;:16;;:25;;;;:::i;:::-;56401:36;;;;:::i;:::-;56376:62;;56445:15;56463:41;56495:8;;56463:27;56482:6;56463;:10;;:27;;;;:::i;:41::-;56563:7;;56445:59;;-1:-1:-1;56445:59:0;;-1:-1:-1;;;56563:7:0;;;;:15;;56574:4;56563:15;56560:73;;;56604:10;56596:19;;;;:7;:19;;;;;;;;56592:32;;56617:7;:5;:7::i;:::-;56651:10;56639:23;;;;:11;:23;;;;;:30;;-1:-1:-1;;56639:30:0;56665:4;56639:30;;;56679:27;;56696:9;56679:5;:27::i;26389:151::-;-1:-1:-1;;;;;26505:18:0;;;26478:7;26505:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;26389:151::o;57835:1413::-;-1:-1:-1;;;;;58089:17:0;;57894:14;58089:17;;;:9;:17;;;;;;57894:14;;58069:7;;58089:17;;58084:481;;58182:1;58160:19;58171:7;58160:10;:19::i;:::-;:23;58157:400;;;58211:19;58222:7;58211:10;:19::i;:::-;58269:7;;-1:-1:-1;;;;;58290:16:0;;58242;58290;;;:7;:16;;;;;;58194:37;;-1:-1:-1;58269:7:0;58290:20;58287:82;;-1:-1:-1;;;;;;58341:16:0;;;;;;:7;:16;;;;;;58287:82;58433:7;;58379:14;;58405:26;:12;58422:8;58405:16;:26::i;:::-;58404:36;;;;:::i;:::-;58493:7;;58379:62;;-1:-1:-1;58461:40:0;;:27;58379:62;58480:6;58461:10;:27::i;:40::-;58451:50;-1:-1:-1;58528:18:0;58451:50;58529:6;58528:18;:::i;:::-;58511:36;;58157:400;;;-1:-1:-1;;;;;58575:17:0;;;;;;:9;:17;;;;;;;;58572:452;;;58629:1;58607:19;58618:7;58607:10;:19::i;:::-;:23;58604:412;;;58658:19;58669:7;58658:10;:19::i;:::-;58716:7;;-1:-1:-1;;;;;58738:16:0;;58689;58738;;;:7;:16;;;;;;58641:37;;-1:-1:-1;58716:7:0;58738:20;58735:95;;-1:-1:-1;;;;;;58791:16:0;;;;;;:7;:16;;;;;;58735:95;58891:7;;58837:14;;58863:26;:12;58880:8;58863:16;:26::i;:::-;58862:36;;;;:::i;:::-;58950:7;;58837:62;;-1:-1:-1;58918:40:0;;:27;58837:62;58937:6;58918:10;:27::i;:40::-;58908:50;-1:-1:-1;58985:18:0;58908:50;58986:6;58985:18;:::i;:::-;58968:36;;58604:412;;;59220:22;;57835:1413;;;:::o;47450:316::-;47514:4;35006:12;:10;:12::i;:::-;-1:-1:-1;;;;;34995:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34995:23:0;;34987:68;;;;-1:-1:-1;;;34987:68:0;;;;;;;:::i;:::-;47533:3:::1;:6;;47538:1;47533:6;47530:207;;;47555:9;:23:::0;;-1:-1:-1;;;;47555:23:0::1;47567:11:::0;::::1;;47574:4;47567:11;-1:-1:-1::0;;;47555:23:0::1;;::::0;;47530:207:::1;;;47606:3;:6;;47611:1;47606:6;47603:134;;;47628:9;:24:::0;;-1:-1:-1;;;;47628:24:0::1;47640:12:::0;::::1;-1:-1:-1::0;;;47628:24:0::1;;::::0;;47603:134:::1;;;47672:3;:6;;47677:1;47672:6;47669:68;;;47694:9;:23:::0;;-1:-1:-1;;;47713:4:0::1;47706:11:::0;::::1;;;47694:23;-1:-1:-1::0;;;;47694:23:0;;::::1;;::::0;;-1:-1:-1;47754:4:0::1;47450:316:::0;;;;:::o;44544:22::-;;;-1:-1:-1;;;;;44544:22:0;;:::o;61977:166::-;35006:12;:10;:12::i;:::-;-1:-1:-1;;;;;34995:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34995:23:0;;34987:68;;;;-1:-1:-1;;;34987:68:0;;;;;;;:::i;:::-;62084:51:::1;::::0;62092:10:::1;::::0;62113:21:::1;62084:51:::0;::::1;;;::::0;::::1;::::0;;;62113:21;62092:10;62084:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;43139:950:::0;43215:7;;43191:4;;43215:7;;;;;:39;;;;;43242:12;;43226;:28;;43215:39;43207:71;;;;-1:-1:-1;;;43207:71:0;;;;;;;:::i;:::-;43310:10;43297:9;:23;;43289:55;;;;-1:-1:-1;;;43289:55:0;;;;;;;:::i;:::-;43426:9;;43375;;43355:17;;43412:24;;43375:9;;43412:13;:24::i;:::-;43395:41;;43447:44;43465:4;43471:12;:10;:12::i;43447:44::-;43557:6;-1:-1:-1;;;;;43543:20:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;43543:20:0;;;:40;;;;-1:-1:-1;;;;;;43565:18:0;;;;43543:40;:61;;;;;43603:1;43585:17;43595:6;43585:9;:17::i;:::-;:19;43543:61;43540:385;;;43620:13;43636:35;43665:5;43636:24;43650:9;;43636;:13;;:24;;;;:::i;:35::-;43620:51;;43686:14;43703:32;43729:5;43703:21;43714:9;;43703:6;:10;;:21;;;;:::i;:32::-;43686:49;;43750:41;43768:4;43774:6;43781:9;43750;:41::i;:::-;43841:23;:9;43855:8;43841:13;:23::i;:::-;43879:34;;43831:33;;-1:-1:-1;;;;;;43879:24:0;;;:34;;;;;43904:8;;43879:34;;;;43904:8;43879:24;:34;;;;;;;;;;;;;;;;;;;;;43540:385;;43938:10;;-1:-1:-1;;;;;43938:10:0;43935:75;;43991:6;;43978:10;:19;;-1:-1:-1;;;;;;43978:19:0;-1:-1:-1;;;;;43991:6:0;;;43978:19;;;;;44020:39;;44028:10;;;44020:39;;;;;;;-1:-1:-1;44020:39:0;-1:-1:-1;44020:39:0;;44028:10;44020:39;;;;;;;;;;;;;;;;;;;35725:244;35006:12;:10;:12::i;:::-;-1:-1:-1;;;;;34995:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34995:23:0;;34987:68;;;;-1:-1:-1;;;34987:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35814:22:0;::::1;35806:73;;;;-1:-1:-1::0;;;35806:73:0::1;;;;;;;:::i;:::-;35916:6;::::0;35895:38:::1;::::0;-1:-1:-1;;;;;35895:38:0;;::::1;::::0;35916:6:::1;::::0;35895:38:::1;::::0;35916:6:::1;::::0;35895:38:::1;35944:6;:17:::0;;-1:-1:-1;;;;;;35944:17:0::1;-1:-1:-1::0;;;;;35944:17:0;;;::::1;::::0;;;::::1;::::0;;35725:244::o;61239:151::-;35006:12;:10;:12::i;:::-;-1:-1:-1;;;;;34995:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34995:23:0;;34987:68;;;;-1:-1:-1;;;34987:68:0;;;;;;;:::i;:::-;61366:7:::1;:16:::0;61239:151::o;45560:83::-;45606:29;45613:10;45625:9;45606:6;:29::i;20718:98::-;20798:10;20718:98;:::o;29754:851::-;-1:-1:-1;;;;;29860:20:0;;29852:70;;;;-1:-1:-1;;;29852:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29941:23:0;;29933:71;;;;-1:-1:-1;;;29933:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30023:14:0;;;;;;:6;:14;;;;;;;;;:17;;;;:36;;-1:-1:-1;;;;;;30042:14:0;;;;;;:6;:14;;;;;;;;;;;:17;;30023:36;:58;;;;-1:-1:-1;;;;;;30061:17:0;;;;;;:6;:17;;;;;;;;30080:1;30061:20;;30023:58;:80;;;;-1:-1:-1;;;;;;30083:17:0;;;;;;:6;:17;;;;;;;;;;;:20;;30023:80;30015:113;;;;-1:-1:-1;;;30015:113:0;;;;;;;:::i;:::-;30153:10;30145:19;;;;:7;:19;;;;;;;;30141:32;;30166:7;:5;:7::i;:::-;30189:11;:25;30201:12;:10;:12::i;:::-;-1:-1:-1;;;;;30189:25:0;;;;;;;;;;;;-1:-1:-1;30189:25:0;;;;30185:67;;30245:4;30217:11;:25;30229:12;:10;:12::i;:::-;-1:-1:-1;;;;;30217:25:0;;;;;;;;;;;;-1:-1:-1;30217:25:0;:32;;-1:-1:-1;;30217:32:0;;;;;;;;;;30185:67;-1:-1:-1;;;;;30348:17:0;;30324:21;30348:17;;;;;;;;;;;30384:23;;;;30376:74;;;;-1:-1:-1;;;30376:74:0;;;;;;;:::i;:::-;30481:22;30497:6;30481:13;:22;:::i;:::-;-1:-1:-1;;;;;30461:17:0;;;:9;:17;;;;;;;;;;;:42;;;;30514:20;;;;;;;;:30;;30538:6;;30461:9;30514:30;;30538:6;;30514:30;:::i;:::-;;;;;;;;30579:9;-1:-1:-1;;;;;30562:35:0;30571:6;-1:-1:-1;;;;;30562:35:0;;30590:6;30562:35;;;;;;:::i;:::-;;;;;;;;29754:851;;;;:::o;32599:346::-;-1:-1:-1;;;;;32701:19:0;;32693:68;;;;-1:-1:-1;;;32693:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32780:21:0;;32772:68;;;;-1:-1:-1;;;32772:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32853:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;32905:32;;;;;32883:6;;32905:32;:::i;:::-;;;;;;;;32599:346;;;:::o;13788:158::-;13846:7;13879:1;13874;:6;;13866:49;;;;-1:-1:-1;;;13866:49:0;;;;;;;:::i;:::-;13933:5;13937:1;13933;:5;:::i;:::-;13926:12;13788:158;-1:-1:-1;;;13788:158:0:o;14205:220::-;14263:7;14287:6;14283:20;;-1:-1:-1;14302:1:0;14295:8;;14283:20;14314:9;14326:5;14330:1;14326;:5;:::i;:::-;14314:17;-1:-1:-1;14359:1:0;14350:5;14354:1;14314:17;14350:5;:::i;:::-;:10;14342:56;;;;-1:-1:-1;;;14342:56:0;;;;;;;:::i;14903:153::-;14961:7;14993:1;14989;:5;14981:44;;;;-1:-1:-1;;;14981:44:0;;;;;;;:::i;:::-;15043:5;15047:1;15043;:5;:::i;30611:103::-;-1:-1:-1;;;;;30683:14:0;;;;;;;;:6;:14;;;;;:23;;-1:-1:-1;;30683:23:0;;;;;;;;;;;30611:103::o;31667:494::-;-1:-1:-1;;;;;31751:21:0;;31743:67;;;;-1:-1:-1;;;31743:67:0;;;;;;;:::i;:::-;31823:49;31844:7;31861:1;31865:6;31823:20;:49::i;:::-;-1:-1:-1;;;;;31910:18:0;;31885:22;31910:18;;;;;;;;;;;31947:24;;;;31939:71;;;;-1:-1:-1;;;31939:71:0;;;;;;;:::i;:::-;32042:23;32059:6;32042:14;:23;:::i;:::-;-1:-1:-1;;;;;32021:18:0;;:9;:18;;;;;;;;;;:44;;;;32076:12;:22;;32092:6;;32021:9;32076:22;;32092:6;;32076:22;:::i;:::-;;;;-1:-1:-1;;32116:37:0;;32142:1;;-1:-1:-1;;;;;32116:37:0;;;;;;;32146:6;;32116:37;:::i;30994:340::-;-1:-1:-1;;;;;31078:21:0;;31070:65;;;;-1:-1:-1;;;31070:65:0;;;;;;;:::i;:::-;31228:6;31212:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;31245:18:0;;:9;:18;;;;;;;;;;:28;;31267:6;;31245:9;:28;;31267:6;;31245:28;:::i;:::-;;;;-1:-1:-1;;31289:37:0;;-1:-1:-1;;;;;31289:37:0;;;31306:1;;31289:37;;;;31319:6;;31289:37;:::i;:::-;;;;;;;;30994:340;;:::o;50489:432::-;-1:-1:-1;;;;;50577:21:0;;50569:67;;;;-1:-1:-1;;;50569:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50674:17:0;;50649:22;50674:17;;;:8;:17;;;;;;50710:24;;;;50702:71;;;;-1:-1:-1;;;50702:71:0;;;;;;;:::i;:::-;50804:23;50821:6;50804:14;:23;:::i;:::-;-1:-1:-1;;;;;50784:17:0;;;;;;:8;:17;;;;;:43;;;;50838:10;:20;;50852:6;;50784:17;50838:20;;50852:6;;50838:20;:::i;57264:127::-;-1:-1:-1;;;;;57335:15:0;;;;;;;:7;:15;;;;;:24;57264:127::o;50206:273::-;-1:-1:-1;;;;;50290:21:0;;50282:65;;;;-1:-1:-1;;;50282:65:0;;;;;;;:::i;:::-;50374:6;50360:10;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;50391:17:0;;;;;;:8;:17;;;;;:27;;50412:6;;50391:17;:27;;50412:6;;50391:27;:::i;60609:617::-;60670:14;;60740:19;60751:7;60740:10;:19::i;:::-;60797:7;;-1:-1:-1;;;;;60819:16:0;;60770;60819;;;:7;:16;;;;;;60723:37;;-1:-1:-1;60797:7:0;60816:210;;-1:-1:-1;60912:12:0;60816:210;;;-1:-1:-1;;;;;60945:16:0;;60964:1;60945:16;;;:7;:16;;;;;;:20;60942:84;;-1:-1:-1;;;;;;60996:16:0;;;;;;:7;:16;;;;;;60942:84;61086:8;;61032:14;;61058:26;:12;61075:8;61058:16;:26::i;:::-;61057:37;;;;:::i;:::-;61145:8;;61032:63;;-1:-1:-1;61113:41:0;;:27;61032:63;61132:6;61113:10;:27::i;:41::-;61103:51;60609:617;-1:-1:-1;;;;;60609:617:0:o;57131:127::-;-1:-1:-1;;;;;57202:15:0;;;;;;;:7;:15;;;;;:24;57131:127::o;51322:652::-;-1:-1:-1;;;;;51432:20:0;;51424:70;;;;-1:-1:-1;;;51424:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51513:23:0;;51505:71;;;;-1:-1:-1;;;51505:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51720:16:0;;51696:21;51720:16;;;:8;:16;;;;;;51755:23;;;;51747:74;;;;-1:-1:-1;;;51747:74:0;;;;;;;:::i;:::-;51851:22;51867:6;51851:13;:22;:::i;:::-;-1:-1:-1;;;;;51832:16:0;;;;;;;:8;:16;;;;;;:41;;;;51884:19;;;;;;;;:29;;51907:6;;51832:16;51884:29;;51907:6;;51884:29;:::i;14:175:1:-;84:20;;-1:-1:-1;;;;;133:31:1;;123:42;;113:2;;179:1;176;169:12;194:158;262:20;;322:4;311:16;;301:27;;291:2;;342:1;339;332:12;357:198;;469:2;457:9;448:7;444:23;440:32;437:2;;;490:6;482;475:22;437:2;518:31;539:9;518:31;:::i;560:274::-;;;689:2;677:9;668:7;664:23;660:32;657:2;;;710:6;702;695:22;657:2;738:31;759:9;738:31;:::i;:::-;728:41;;788:40;824:2;813:9;809:18;788:40;:::i;:::-;778:50;;647:187;;;;;:::o;839:342::-;;;;985:2;973:9;964:7;960:23;956:32;953:2;;;1006:6;998;991:22;953:2;1034:31;1055:9;1034:31;:::i;:::-;1024:41;;1084:40;1120:2;1109:9;1105:18;1084:40;:::i;:::-;1074:50;;1171:2;1160:9;1156:18;1143:32;1133:42;;943:238;;;;;:::o;1186:266::-;;;1315:2;1303:9;1294:7;1290:23;1286:32;1283:2;;;1336:6;1328;1321:22;1283:2;1364:31;1385:9;1364:31;:::i;:::-;1354:41;1442:2;1427:18;;;;1414:32;;-1:-1:-1;;;1273:179:1:o;1457:270::-;;;1584:2;1572:9;1563:7;1559:23;1555:32;1552:2;;;1605:6;1597;1590:22;1552:2;1633:31;1654:9;1633:31;:::i;:::-;1623:41;;1683:38;1717:2;1706:9;1702:18;1683:38;:::i;1732:257::-;;1852:2;1840:9;1831:7;1827:23;1823:32;1820:2;;;1873:6;1865;1858:22;1820:2;1910:9;1904:16;1929:30;1953:5;1929:30;:::i;1994:190::-;;2106:2;2094:9;2085:7;2081:23;2077:32;2074:2;;;2127:6;2119;2112:22;2074:2;-1:-1:-1;2155:23:1;;2064:120;-1:-1:-1;2064:120:1:o;2189:194::-;;2312:2;2300:9;2291:7;2287:23;2283:32;2280:2;;;2333:6;2325;2318:22;2280:2;-1:-1:-1;2361:16:1;;2270:113;-1:-1:-1;2270:113:1:o;2388:258::-;;;2517:2;2505:9;2496:7;2492:23;2488:32;2485:2;;;2538:6;2530;2523:22;2485:2;-1:-1:-1;;2566:23:1;;;2636:2;2621:18;;;2608:32;;-1:-1:-1;2475:171:1:o;2651:395::-;;;;;2814:3;2802:9;2793:7;2789:23;2785:33;2782:2;;;2836:6;2828;2821:22;2782:2;-1:-1:-1;;2864:23:1;;;2934:2;2919:18;;2906:32;;-1:-1:-1;2985:2:1;2970:18;;2957:32;;3036:2;3021:18;3008:32;;-1:-1:-1;2772:274:1;-1:-1:-1;2772:274:1:o;3051:464::-;;;;;;3231:3;3219:9;3210:7;3206:23;3202:33;3199:2;;;3253:6;3245;3238:22;3199:2;-1:-1:-1;;3281:23:1;;;3351:2;3336:18;;3323:32;;-1:-1:-1;3402:2:1;3387:18;;3374:32;;3453:2;3438:18;;3425:32;;-1:-1:-1;3504:3:1;3489:19;3476:33;;-1:-1:-1;3189:326:1;-1:-1:-1;3189:326:1:o;3520:325::-;;;3644:2;3632:9;3623:7;3619:23;3615:32;3612:2;;;3665:6;3657;3650:22;3612:2;3693:29;3712:9;3693:29;:::i;:::-;3683:39;;3772:2;3761:9;3757:18;3744:32;3785:30;3809:5;3785:30;:::i;:::-;3834:5;3824:15;;;3602:243;;;;;:::o;3850:262::-;;;3977:2;3965:9;3956:7;3952:23;3948:32;3945:2;;;3998:6;3990;3983:22;3945:2;4026:29;4045:9;4026:29;:::i;4117:203::-;-1:-1:-1;;;;;4281:32:1;;;;4263:51;;4251:2;4236:18;;4218:102::o;4325:375::-;-1:-1:-1;;;;;4583:15:1;;;4565:34;;4635:15;;;;4630:2;4615:18;;4608:43;4682:2;4667:18;;4660:34;;;;4515:2;4500:18;;4482:218::o;4705:274::-;-1:-1:-1;;;;;4897:32:1;;;;4879:51;;4961:2;4946:18;;4939:34;4867:2;4852:18;;4834:145::o;4984:187::-;5149:14;;5142:22;5124:41;;5112:2;5097:18;;5079:92::o;5176:683::-;5504:14;;5497:22;5479:41;;5563:14;;5556:22;5551:2;5536:18;;5529:50;5610:2;5595:18;;5588:34;;;;5653:2;5638:18;;5631:34;;;;-1:-1:-1;;;;;5740:15:1;;;5734:3;5719:19;;5712:44;5793:15;5692:3;5772:19;;5765:44;5840:3;5825:19;;5818:35;5466:3;5451:19;;5433:426::o;5864:771::-;6248:14;;6241:22;6223:41;;6307:14;;6300:22;6295:2;6280:18;;6273:50;6354:2;6339:18;;6332:34;;;;6397:2;6382:18;;6375:34;;;;6440:3;6425:19;;6418:35;;;;6484:3;6469:19;;6462:35;6528:3;6513:19;;6506:35;6572:3;6557:19;;6550:35;6616:3;6601:19;;6594:35;6210:3;6195:19;;6177:458::o;6640:603::-;;6781:2;6810;6799:9;6792:21;6842:6;6836:13;6885:6;6880:2;6869:9;6865:18;6858:34;6910:4;6923:140;6937:6;6934:1;6931:13;6923:140;;;7032:14;;;7028:23;;7022:30;6998:17;;;7017:2;6994:26;6987:66;6952:10;;6923:140;;;7081:6;7078:1;7075:13;7072:2;;;7151:4;7146:2;7137:6;7126:9;7122:22;7118:31;7111:45;7072:2;-1:-1:-1;7227:2:1;7206:15;-1:-1:-1;;7202:29:1;7187:45;;;;7234:2;7183:54;;6761:482;-1:-1:-1;;;6761:482:1:o;7248:399::-;7450:2;7432:21;;;7489:2;7469:18;;;7462:30;7528:34;7523:2;7508:18;;7501:62;-1:-1:-1;;;7594:2:1;7579:18;;7572:33;7637:3;7622:19;;7422:225::o;7652:398::-;7854:2;7836:21;;;7893:2;7873:18;;;7866:30;7932:34;7927:2;7912:18;;7905:62;-1:-1:-1;;;7998:2:1;7983:18;;7976:32;8040:3;8025:19;;7826:224::o;8055:397::-;8257:2;8239:21;;;8296:2;8276:18;;;8269:30;8335:34;8330:2;8315:18;;8308:62;-1:-1:-1;;;8401:2:1;8386:18;;8379:31;8442:3;8427:19;;8229:223::o;8457:402::-;8659:2;8641:21;;;8698:2;8678:18;;;8671:30;8737:34;8732:2;8717:18;;8710:62;-1:-1:-1;;;8803:2:1;8788:18;;8781:36;8849:3;8834:19;;8631:228::o;8864:398::-;9066:2;9048:21;;;9105:2;9085:18;;;9078:30;9144:34;9139:2;9124:18;;9117:62;-1:-1:-1;;;9210:2:1;9195:18;;9188:32;9252:3;9237:19;;9038:224::o;9267:402::-;9469:2;9451:21;;;9508:2;9488:18;;;9481:30;9547:34;9542:2;9527:18;;9520:62;-1:-1:-1;;;9613:2:1;9598:18;;9591:36;9659:3;9644:19;;9441:228::o;9674:331::-;9876:2;9858:21;;;9915:1;9895:18;;;9888:29;-1:-1:-1;;;9948:2:1;9933:18;;9926:38;9996:2;9981:18;;9848:157::o;10010:354::-;10212:2;10194:21;;;10251:2;10231:18;;;10224:30;10290:32;10285:2;10270:18;;10263:60;10355:2;10340:18;;10184:180::o;10369:350::-;10571:2;10553:21;;;10610:2;10590:18;;;10583:30;10649:28;10644:2;10629:18;;10622:56;10710:2;10695:18;;10543:176::o;10724:397::-;10926:2;10908:21;;;10965:2;10945:18;;;10938:30;11004:34;10999:2;10984:18;;10977:62;-1:-1:-1;;;11070:2:1;11055:18;;11048:31;11111:3;11096:19;;10898:223::o;11126:404::-;11328:2;11310:21;;;11367:2;11347:18;;;11340:30;11406:34;11401:2;11386:18;;11379:62;-1:-1:-1;;;11472:2:1;11457:18;;11450:38;11520:3;11505:19;;11300:230::o;11535:356::-;11737:2;11719:21;;;11756:18;;;11749:30;11815:34;11810:2;11795:18;;11788:62;11882:2;11867:18;;11709:182::o;11896:397::-;12098:2;12080:21;;;12137:2;12117:18;;;12110:30;12176:34;12171:2;12156:18;;12149:62;-1:-1:-1;;;12242:2:1;12227:18;;12220:31;12283:3;12268:19;;12070:223::o;12298:401::-;12500:2;12482:21;;;12539:2;12519:18;;;12512:30;12578:34;12573:2;12558:18;;12551:62;-1:-1:-1;;;12644:2:1;12629:18;;12622:35;12689:3;12674:19;;12472:227::o;12704:400::-;12906:2;12888:21;;;12945:2;12925:18;;;12918:30;12984:34;12979:2;12964:18;;12957:62;-1:-1:-1;;;13050:2:1;13035:18;;13028:34;13094:3;13079:19;;12878:226::o;13109:344::-;13311:2;13293:21;;;13350:2;13330:18;;;13323:30;-1:-1:-1;;;13384:2:1;13369:18;;13362:50;13444:2;13429:18;;13283:170::o;13458:401::-;13660:2;13642:21;;;13699:2;13679:18;;;13672:30;13738:34;13733:2;13718:18;;13711:62;-1:-1:-1;;;13804:2:1;13789:18;;13782:35;13849:3;13834:19;;13632:227::o;13864:355::-;14066:2;14048:21;;;14105:2;14085:18;;;14078:30;14144:33;14139:2;14124:18;;14117:61;14210:2;14195:18;;14038:181::o;14224:177::-;14370:25;;;14358:2;14343:18;;14325:76::o;14406:463::-;14665:25;;;14721:2;14706:18;;14699:34;;;;14764:2;14749:18;;14742:34;;;;14807:2;14792:18;;14785:34;14850:3;14835:19;;14828:35;14652:3;14637:19;;14619:250::o;14874:535::-;15161:25;;;15217:2;15202:18;;15195:34;;;;15260:2;15245:18;;15238:34;;;;15303:2;15288:18;;15281:34;15346:3;15331:19;;15324:35;15390:3;15375:19;;15368:35;15148:3;15133:19;;15115:294::o;15414:184::-;15586:4;15574:17;;;;15556:36;;15544:2;15529:18;;15511:87::o;15603:128::-;;15674:1;15670:6;15667:1;15664:13;15661:2;;;15680:18;;:::i;:::-;-1:-1:-1;15716:9:1;;15651:80::o;15736:217::-;;15802:1;15792:2;;-1:-1:-1;;;15827:31:1;;15881:4;15878:1;15871:15;15909:4;15834:1;15899:15;15792:2;-1:-1:-1;15938:9:1;;15782:171::o;15958:168::-;;16064:1;16060;16056:6;16052:14;16049:1;16046:21;16041:1;16034:9;16027:17;16023:45;16020:2;;;16071:18;;:::i;:::-;-1:-1:-1;16111:9:1;;16010:116::o;16131:125::-;;16199:1;16196;16193:8;16190:2;;;16204:18;;:::i;:::-;-1:-1:-1;16241:9:1;;16180:76::o;16261:380::-;16346:1;16336:12;;16393:1;16383:12;;;16404:2;;16458:4;16450:6;16446:17;16436:27;;16404:2;16511;16503:6;16500:14;16480:18;16477:38;16474:2;;;16557:10;16552:3;16548:20;16545:1;16538:31;16592:4;16589:1;16582:15;16620:4;16617:1;16610:15;16474:2;;16316:325;;;:::o;16646:135::-;;-1:-1:-1;;16706:17:1;;16703:2;;;16726:18;;:::i;:::-;-1:-1:-1;16773:1:1;16762:13;;16693:88::o;16786:127::-;16847:10;16842:3;16838:20;16835:1;16828:31;16878:4;16875:1;16868:15;16902:4;16899:1;16892:15;16918:120;17006:5;16999:13;16992:21;16985:5;16982:32;16972:2;;17028:1;17025;17018:12

Swarm Source

ipfs://3f20f5feeae50247e795ccff252276007a6728e6ab480e0686d8ee0313e9ecfc
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.