ETH Price: $3,655.83 (+1.18%)
 

Overview

Max Total Supply

10,000,000,000 TOGE

Holders

38

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
Null: 0x000...000
Balance
0 TOGE

Value
$0.00
0x0000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
INUMAKITOGE

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-29
*/

/**
                                                                                                                             
                                                                                                                             
     Y5.  .557  .5J   ?P:   YY   ^PPY   JPP~    :?5P55?   ?P:  :55   J5.        YPP55PPY   ~YPPPJ^    .75PP57.   Y55555P:    
    .@@^  7@@@B ^@@   @@7  .@@:  P@@@P P@@@P   !@@!:P@&   &@5.7@@!   @@~        ^~?@@?~^  B@B^:~&@5  ~@@7~~J&G  .@@GJYY?.    
    .@@^  !@&?@@5@&   &@7  .@@.  5@PP@G@G5@P   @@&JJ#@&   &@&B@@5    @@~          .@@.   .@@~   J@&  P@#  ?B&&. .@@BPPG7     
    .@@^  !@& :&@@&   ?@&PP#@P   5@P &@& P@P  Y@&!!!G@&   &@7 .B@B   @@^          :@@.    7@&P5G@&~  .#@BPG&@P  .@@BPPPP:    
     ::    ^.   :^.     :^^:.    .^. .^. .^.  .^     ^.   .^    :^   ::            ::       :~~^.      .^^^:     :^^^^^^     
                                                                                                                             
                                                                                                                             
                                                                                                                             
                                                          .:::^^::..:::::...                                                 
                                                  .~??!^^~!!~~?Y5P5Y?!~~~~~~^..                                              
                                                :P@@@@@@#P55PP55YYB#BGY~^^^^^^^^:..                                          
                                           .~7?P@@@@@@@@@@@@@@@@&&@@@@&BJ7!~~~~~~^::..                                       
                                      ^7P&&@@@@@@@&B&@@&&&@@@@@@&&&###B####B5Y!~~^^:...:.                                    
                                      ^G&&GP@@@@BY?G@@@@@@@@@@@@@@@@@@&BYY5PGBY7!~~~^^^~~:.                                  
                                     5@&GG#@@@&##&@&#&@@@@@&@@&#&&@@&Y7~~~^^~?B@@J^^^:^~~^:.                                 
                                    P@&&@@@@@@@&BPPGG&@@@@@@@@&B?!7JJ^!GP~~^^::~Y5^^~~~~~~^^^:                               
                                  .#@@@@@@@@@&&#&@@@@@&@&&#GGB&#7:^::^!@#^~^^^::::^^^^^~~~!!~~~:.                            
                                !B&&@@@@@@@&&@@@@@@@@&@@@@@&P^^~~^:^^^^#B^^^:~7^^^^^^^^^^^^^^^^~~^.                          
                             .!##5?Y@@@@@@@@@@&&@@@@@@@@@@@5!~^~!^:^^^:BP^^^:^B@5^^^:^^^^^^:^^^~~~!~.                        
                              YGB&@@@&&@@@@@&&@@@@@@@@@@@&?^^^^^7^^^^^:P7^^^^:~&@Y^~^^^^^^^^~!^^~~^..                        
                             P@@@@@@&&@@@@#B@@@@@@@@@#&&GJ~~^^^^!^^^^^^Y^^^^^^:J@&~~!^^^^^^:^JY!^^~!.                        
                            ?@@@@@@@@&@@@YG@@@@@@@#P7~B777~^^^^^^^^^^^~!:!~:^^:~@&!^~^^^^^^^^:7&P~^~!^                       
                           :@@@@@@@@@@@@JG@@@@@@@&~^:!&!?7^^^^^^~^^^^^^^:JP~^^^^@G~~^:^^^^^^^^:!&?!^~^^.                     
                           B@@@&@@@@&@@B5@@@@@5!@@!!^7&!?7^^^^~^~^^^^^^^:7@7:^:J&7!~^^^^^^^^^^^:JJ^!:^~~                     
                          .@@&&#@@@@&@@P@@@@@@!:G@5!~7#!7~^^^~^~^~^^^^^^:7#~::~5!!~^^^^^:^^^^^^^^^:~~^!7:                    
                          7@@&&?B@@@@@@@@@@@@@#5?&&7~!#!~^^^^~^~^~^^^^^^~!~:^^^^^^:^^^^^~^^^^^^^^:^:^^~?~                    
                          P@@&@??@@@@@@@@@@@@@G&&P@&7~B!^~^^~7~~~^:^^^:~~^:^^^^^^^^^::^:~~^:^^^^:~!:::~!:                    
                          !B&#&P#@@#@@@@@@@@@B!?@#&@@JPY:7G~!5~^~^^^^^^~~~^^^^^~~^^^7~:^^~~^:^^^^~!^^~^!.                    
                          :.YBG&@@@B@@@@@@@@&PY~YJY#@@#&^~&#!#?^~^^^^^^!^!^^^^^!~~^:YG:^^~~~^^^^^~!^~~^7                     
                             #GG@@@B@@@@@&@@YP@B!^PPY&&#J~Y&^BB~~^^^^^!~:7~:^:~!!~^^:Y^^^~77^^^^^!~J7:^~                     
                             PBJ&@@##@@&B&@B!.^G&57&Y7?!BYG7~J&7~^^^^^^^:BJ::~JP!!^^:!^^^^!B^^^^~!~5G:^:                     
                             57?P&@@&P&@YG?7!:..!PGGG57!?G&?^!GB?^^^^~~!~BP^^!7B!7~:^?~:^^?@7~^^^7^B&:~.                     
                             ~ ^Y?YB&5G@?7!~~::...:~^~!7~75G!!#Y5!^^^~!!5~!!!7:J7?~:~#~~^!G@77!^!~!&J^~                      
                                ~!???G5@?!:^~?7?7!:..  .::^?J!B&?!~^~~!?7:!~^..7?:~:?&!~~777!?GY7~7: !~                      
                                  ~!Y#7BB:...:...7G55J!^.....^7P&P?!~!^.......^7~~??JG!^~77~!!&@?~   .7.                     
                                   :.BB!P......:. ^7JY!?~~:....:^5#B!!.:^?5P#B5P7!~?5Y~JG77~!~B@#.                           
                                    :G&::..........:::.  .:...... .!~..:::77?!^: .:^?7G@BGB!J!.~P!                           
                                     ~Y7:..................................::::::.:!:5@BY@&^!!                               
                                      Y#!:...........................................&&5@@~ ^                                
                                       :^!:::!!~~...................................B&!^7                                    
                                    :!J?^....^!!!..................:.......::..... 7J.    .....                              
                                 ^?5PB&?......^!^.:^:....................^!~~7... J@&&@@@@@@@@@@@&P?^                        
                              :?5GGP#@@G^:::::?G^:!!7^ ..................^J!^7.  Y@@@@@@@@@@@@&&#GGGG:                       
                             ^?JJ5G&@@@&J^::::^BB7!!!?!^................:Y!::...P@@@@@@@@&##BGPPGPPPP.                       
                           .......~PB##&GP?~^~?:B@B!..^?!:..............!^. .^^&@@@@&#BGGPPPPPGPPPPPY                        
                           ^.......!!JGGBJ@@@@&.7@@@G^........:.........  :7?^:#&B5Y5PPPGGGGPPPPPPPG7                        
                           .~.......!?7G&!#@@@#..G&&@@G~. ....::::...  :7P577JPPY55PGGPPPPPPPPPPPP5Y:                        
                             ^:..... ~!^&Y^@@@7 .^PPPG#&BY~..      .:7G&GJYPPPP5##PPGPPPPPPPPP55J??Y.                        
                              ?7......:.~~.^?!....~?PPPPGB##B57!~!Y#@@GY5PPPP5B@@PPGPPPP55YYJ??777J7                         
                               ##~::..:^^....::.....:YPPPPPPB&@@@@@@P75PPPP5P&@@BGGPP5YJ????J7??77Y:                         
                               .@@5~::^^^^....::......JGPPPPPPPB@&5~7PP5PGB#@@@&PJY5J???7777J?77?YY                          
                           .^:..Y@@@Y~::~&~.:::::::....7PPPPPPPPPGBBPPG&@@@@@@@B~::PP7777?J??JJY5G^                          
                          ~&J.....7&Y!#&@@?.:::::::..:::~J55G#&@@&#GY#@@@@@@@@@P^^:~&5?PG55G#&GPGP.                          
                  .!77JJ5#&@5.....?BJ.~G&B!^^:::::.........:^?PB####BYB@@@@@@@B~:^:.!&&#PGG@&BPG&@&5J7!^^7~^.   

                  
                  
Toge , is an ERC token, the descendant of the Inumaki family born with a powerful cursed technique: 
Cursed Speech. The Cursed Speech allows him to infuse his words verbally with his powerful amount of cursed energy to send commands to his opponents.

💵 TOKENS WILL BE PAIRED WITH USDC IN LP POOL

TOKENOMICS
1, 000, 000, 000
Total Supply

2%
Max Wallet

1%
Max TX

Our huge plans call for massive Marketing, so we have a 5% marketing fee.

To keep the token value and liquidity strong we add 2% back to the liquidity pool.
BUY/ SELL TAX - 7%
SLIPPAGE - 7%
TELEGRAM : https://t.me/inumakitogeETH
Web : https://inumakitogeerc.live/
medium : https://medium.com/@inumakitogeeth/toge-inumaki-anime-meme-coin-on-erc-2e2bca174baf
Twitter : https://twitter.com/togeERC
*/
// File: @openzeppelin/contracts/utils/Context.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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) {
        return msg.data;
    }
}

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

// 
// OpenZeppelin Contracts v4.4.1 (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;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/security/Pausable.sol

// 
// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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

// 
// OpenZeppelin Contracts v4.4.1 (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);

    /**
     * @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

// 
// OpenZeppelin Contracts v4.4.1 (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/token/ERC20/ERC20.sol

// 
// OpenZeppelin Contracts v4.4.1 (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 Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

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

        _afterTokenTransfer(account, address(0), amount);
    }

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

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

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

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

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

// 
// OpenZeppelin Contracts v4.4.1 (utils/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;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol

// 
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}



// 
pragma solidity ^0.8.5;







interface IPancakeFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}


// pragma solidity >=0.5.0;

interface IPancakePair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

// pragma solidity >=0.6.2;

interface IPancakeRouter01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}



// pragma solidity >=0.6.2;

interface IPancakeRouter02 is IPancakeRouter01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

contract INUMAKITOGE is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;

    mapping (address => bool) public _isExcludedFromAntiWhale;
    
    mapping (address => bool) private _isExcludedFromFee;
    mapping (address => bool) private _isExcluded;
    mapping (address => bool) private _isBlacklisted;
    mapping (address => bool) private _isExcludedFromMaxTxAmount;

    mapping (address => mapping (address => uint256)) private _allowances;

    address[] private _excluded;
   
    address payable public _externalAddress  = payable(0x1598f474B3b25c48e8D29798fCb6fd5Be303eDa4);
    address payable public _burnAddress      = payable(0x000000000000000000000000000000000000dEaD);
    address payable public autoLiquidityReceiver; 

    string private _name    = "INUMAKITOGE";
    string private _symbol  = "TOGE";
    uint8 private _decimals = 18;
    
    uint256 private constant MAX    = ~uint256(0);
    uint256 private _tTotal         = 10 * 10**9 * 10**_decimals;
    uint256 private _rTotal         = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;
    
    uint256 public _burnFee                 = 0;
    uint256 private _previousBurnFee        = _burnFee;

    uint256 public _reflectionFee           = 0;
    uint256 private _previousReflectionFee  = _reflectionFee;

    uint256 public _externalFee             = 50;
    uint256 private _previousExternalFee    = _externalFee;
    
    uint256 public _liquidityFee            = 20;
    uint256 private _previousLiquidityFee   = _liquidityFee;

    uint256 private _totalLiquidityFee      = _externalFee.add(_liquidityFee);
    uint256 private _previousTLiquidityFee  = _totalLiquidityFee;

    IPancakeRouter02 public pancakeRouter;
    address public pancakePair;
    
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled       = true;
    
    uint256 public _maxTxAmountBuy                  = 1000000000 * 10**6 * 10**_decimals;
    uint256 public _maxTxAmountSell                 = 1000000000 * 10**6 * 10**_decimals;
    uint256 public _numTokensSellToAndTransfer      = 10 * 10**6 * 10**_decimals;
    uint256 public _maxTokensPerAddress             = 100 * 10**6 * 10**_decimals;

    address public constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; //USDC ADDRESS

    
    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqiudity
    );
    
    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }
    
    constructor () {
        _rOwned[_msgSender()] = _rTotal; 
        
        IPancakeRouter02 _pancakeRouter = IPancakeRouter02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); //UNISWAP ROUTER ADDRESS
        // IPancakeRouter02 _pancakeRouter = IPancakeRouter02(0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3);
         // Create a pancakeswap pair for this new token
        // pancakePair = IPancakeFactory(_pancakeRouter.factory())
        //     .createPair(address(this), _pancakeRouter.WETH());    
        pancakePair = IPancakeFactory(_pancakeRouter.factory())
            .createPair(address(this), USDC); 
            
        pancakeRouter = _pancakeRouter;
        
        _isExcludedFromFee[owner()]             = true;
        _isExcludedFromFee[address(this)]       = true;
        _isExcludedFromFee[_externalAddress]    = true;
        
        _isExcludedFromMaxTxAmount[owner()]                 = true;
        _isExcludedFromMaxTxAmount[address(this)]           = true;
        _isExcludedFromMaxTxAmount[pancakePair]             = true;
        _isExcludedFromMaxTxAmount[address(_pancakeRouter)] = true;
        _isExcludedFromMaxTxAmount[_burnAddress]            = true;
        
        _isExcludedFromAntiWhale[owner()]                   = true;
        _isExcludedFromAntiWhale[address(this)]             = true;
        _isExcludedFromAntiWhale[pancakePair]               = true;
        _isExcludedFromAntiWhale[address(_pancakeRouter)]   = true;
        _isExcludedFromAntiWhale[_burnAddress]              = true;
        
        _isExcluded[address(0)]     = true;
        _isExcluded[_burnAddress]   = true;

        autoLiquidityReceiver = payable(0xF9d46d6F0A0a662dE6A1C5d417f245da00fb4475);
        
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }
    
    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }
    
    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
         return true;
    }
    
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }
    
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }
    
    function isExcludedFromReward(address account) public view returns (bool) {
        return _isExcluded[account];
    }
    
    function totalFeesCollected() public view returns (uint256) {
        return _tFeeTotal;
    }
    
    function deliver(uint256 tAmount) public {
        address sender = _msgSender();
        require(!_isExcluded[sender], "Excluded addresses cannot call this function");
        (uint256 rAmount,,,,,,) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }
    
    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,,,) = _getValues(tAmount);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,,,) = _getValues(tAmount);
            return rTransferAmount;
        }
    }
    
    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  _getRate();
        return rAmount.div(currentRate);
    }
    
    function excludeFromReward(address account) public onlyOwner() {
        require(account != 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 'We can not exclude pancakeswap router.');
        require(!_isExcluded[account], "Account is already excluded");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }
    
    function includeInReward(address account) external onlyOwner() {
        require(_isExcluded[account], "Account is already excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }
    
    function _burn(address account, uint256 amount) internal {
        if(amount > 0)// No need to burn if collected burn fee is zero
        {
            require(account != address(0), "ERC20: burn from the zero address");

            //add the reflections of the token to the address(0) balance.
            //This reduces the supply of reflectedTokens
            //without double altering the reflection/token ratio.
            
            _tTotal = _tTotal.sub(amount);
            _rTotal = _rTotal.sub(amount.mul(_getRate()));
            
            emit Transfer(msg.sender, address(this), amount);
        }
    }
    
    function excludeFromFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = true;
    }
    
    function includeInFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = false;
    }
    
    function excludedFromMaxTxAmount(address account) public onlyOwner {
        _isExcludedFromMaxTxAmount[account] = true;
    }
    
    function includeInMaxTxAmount(address account) public onlyOwner {
        _isExcludedFromMaxTxAmount[account] = false;
    }
    
    function excludedFromAntiWhale(address account) public onlyOwner {
        _isExcludedFromAntiWhale[account] = true;
    }
    
    function includeInAntiWhale(address account) public onlyOwner {
        _isExcludedFromAntiWhale[account] = false;
    }
    
    function setBurnFeePercent(uint256 Fee) external onlyOwner() {
        _burnFee = Fee;
    }
    
    function setExternalFeePercent(uint256 Fee) external onlyOwner() {
        _externalFee = Fee;
        _totalLiquidityFee = _liquidityFee.add(_externalFee);
    }
    
    function setReflectFeePercent(uint256 Fee) external onlyOwner() {
        _reflectionFee = Fee;
    }
    
    function setLiquidityFeePercent(uint256 Fee) external onlyOwner() {
        _liquidityFee = Fee;
        _totalLiquidityFee = _liquidityFee.add(_externalFee);
    }
    
    function setMaxTxTokensSell(uint256 maxTxTokens) external onlyOwner() {
        _maxTxAmountSell = maxTxTokens.mul( 10**_decimals );
    }
    
    function setMaxTxTokensBuy(uint256 maxTxTokens) external onlyOwner() {
        _maxTxAmountBuy = maxTxTokens.mul( 10**_decimals );
    }
    
    function setMaxTokenPerAddress(uint256 maxTokens) external onlyOwner() {
        _maxTokensPerAddress = maxTokens.mul( 10**_decimals );
    }
    
    function setExternalAddress(address payable externalAddress) external onlyOwner() {
        _externalAddress = externalAddress;
    }
    
    function setLiquidityAddress(address payable liquidityAddress) external onlyOwner() {
        autoLiquidityReceiver = liquidityAddress;
    }
	
    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }
	
    receive() external payable {}
    
    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }
    
    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 bFee, uint256 tLiquidity) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, bFee, _getRate());
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, bFee, tLiquidity);
    }
    
    function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256) {
        uint256 tFee = calculateReflectionFee(tAmount);
        uint256 bFee = calculateBurnFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity).sub(bFee);
        return (tTransferAmount, tFee, bFee, tLiquidity);
    }
    
    function _getRValues(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 bFee, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rbFee = bFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity).sub(rbFee);
        return (rAmount, rTransferAmount, rFee);
    }
    
    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }
    
    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;      
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }
    
    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate =  _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        if(_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
    }
    
    function calculateBurnFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_burnFee).div(
            10**3
        );
    }
    
    function calculateReflectionFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_reflectionFee).div(
            10**3
        );
    }
    
    function calculateLiquidityFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_totalLiquidityFee).div(
            10**3
        );
    }
    
    function removeAllFee() private {
        if(_totalLiquidityFee == 0 && _burnFee == 0 && _liquidityFee == 0
           && _externalFee == 0 && _reflectionFee == 0 ) return;
        
        _previousLiquidityFee   = _liquidityFee; 
        _previousBurnFee        = _burnFee;
        _previousExternalFee    = _externalFee;
        _previousReflectionFee  = _reflectionFee;
        _previousTLiquidityFee  = _totalLiquidityFee;
        
        _burnFee        = 0;
        _externalFee    = 0;
        _reflectionFee  = 0;
        _liquidityFee   = 0;
        _totalLiquidityFee = 0;
    }
    
    function restoreAllFee() private {
        _liquidityFee       = _previousLiquidityFee;
        _burnFee            = _previousBurnFee;
        _externalFee        = _previousExternalFee;
        _reflectionFee      = _previousReflectionFee;
        _totalLiquidityFee  = _previousTLiquidityFee;
    }
    
    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }
    
    function setMinTokensSellToAndTransfer(uint256 minTokensValue) public onlyOwner()
    {
        _numTokensSellToAndTransfer = minTokensValue.mul( 10**_decimals );
    }
    
    function _approve(address owner, address spender, uint256 amount) private {
        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);
    }
    
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(_isExcludedFromAntiWhale[to] || balanceOf(to) + amount <= _maxTokensPerAddress,
        "Max tokens limit for this account reached. Or try lower amount");
        require(!_isBlacklisted[from], "You are banned");
        require(!_isBlacklisted[to], "The recipient is banned");
        if(from == pancakePair)
        {
            if(!_isExcludedFromMaxTxAmount[to])
                require(amount <= _maxTxAmountBuy, "Buy amount exceeds the maxTxAmount.");		    
        }
        else if(!_isExcludedFromMaxTxAmount[from] && to == pancakePair)
        {
            require(amount <= _maxTxAmountSell, "Sell amount exceeds the maxTxAmount.");
        }

        // is the token balance of this contract address over the min number of
        // tokens that we need to initiate a swap + liquidity lock?
        // also, don't get caught in a circular liquidity event.
        // also, don't swap & liquify if sender is pancakeswap pair.
        uint256 contractTokenBalance = balanceOf(address(this));
        
        bool overMinTokenBalance = contractTokenBalance >= _numTokensSellToAndTransfer;
        if (
            overMinTokenBalance &&
            !inSwapAndLiquify &&
            from != pancakePair &&
            swapAndLiquifyEnabled
        ) {
            contractTokenBalance = _numTokensSellToAndTransfer;
            //add liquidity
            swapAndLiquify(contractTokenBalance);
        }
        
        //indicates if fee should be deducted from transfer
        bool takeFee = true;
        
        //if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
            takeFee = false;
        }
        
        //transfer amount, it will take tax, burn, liquidity fee
        _tokenTransfer(from,to,amount,takeFee);
    }
    
    function swapAndLiquify(uint256 tokenBalance) private lockTheSwap {
        // first split contract into  fee and liquidity fee
        uint256 liquidityAmount = tokenBalance;
        // uint256 initialBalance = address(this).balance;
        IERC20 usdcContract = IERC20(USDC);
        uint256 initialBalance = usdcContract.balanceOf(address(this));


        if(_externalFee > 0)
        {
            uint256 externalAmount = tokenBalance.mul(_externalFee);
            externalAmount = externalAmount.div(_totalLiquidityFee);
            liquidityAmount = tokenBalance.sub(externalAmount);

            // send tokens to external
            // swapTokensForEth(_externalAddress, externalAmount);
            swapTokensForusdc(_externalAddress, externalAmount);
            initialBalance = usdcContract.balanceOf(address(this));
        }
        
        if(_liquidityFee > 0)
        {
            // split the liquidity token balance into halves
            uint256 half = liquidityAmount.div(2);
            uint256 otherHalf = liquidityAmount.sub(half);

            // capture the contract's current ETH balance.
            // this is so that we can capture exactly the amount of ETH that the
            // swap creates, and not make the liquidity event include any ETH that
            // has been manually sent to the contract

            // swap half liquidity tokens for ETH
            // swapTokensForEth(address(this), half);
            swapTokensForusdc(address(this), half);
            
            // how much ETH did we just swap into?
            uint256 newBalance = usdcContract.balanceOf(address(this)).sub(initialBalance);

            // add liquidity to pancakeswap
            addLiquidity(autoLiquidityReceiver, otherHalf, newBalance);
            
            emit SwapAndLiquify(half, newBalance, otherHalf);
        }
    }

    function swapTokensForusdc(address recipient, uint256 tokenAmount) private {
        // generate the pancakeswap pair path of token -> usdc
        address[] memory path = new address[](3);
        path[0] = address(this);
        path[1] = pancakeRouter.WETH();
        path[2] = USDC;

        _approve(address(this), address(pancakeRouter), tokenAmount);

        // make the swap
        pancakeRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of USDC
            path,
            recipient,
            block.timestamp
        );
    }
    
    function addLiquidity(address recipient, uint256 tokenAmount, uint256 usdcAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(pancakeRouter), tokenAmount);
        IERC20(USDC).approve(address(pancakeRouter), usdcAmount);

        // add the liquidity
        pancakeRouter.addLiquidity(
            address(this),
            USDC,
            tokenAmount,
            usdcAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            recipient,
            block.timestamp
        );
    }
    
    function _tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee) private {
        if(!takeFee)
            removeAllFee();
        
        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferStandard(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }
        
        if(!takeFee)
            restoreAllFee();
    }
    
    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 bFee, uint256 tLiquidity) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);

        _burn(sender, bFee);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }
    
    function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 bFee, uint256 tLiquidity) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);

        _burn(sender, bFee);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }
    
    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 bFee, uint256 tLiquidity) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);

        _burn(sender, bFee);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }
    
    function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 bFee, uint256 tLiquidity) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);

        _burn(sender, bFee);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }
    
    function blacklistSingleWallet(address addresses) public onlyOwner(){
        if(_isBlacklisted[addresses] == true) return;
        _isBlacklisted[addresses] = true;
    }
    
    function blacklistMultipleWallets(address[] calldata addresses) public onlyOwner(){
        require(addresses.length <= 800, "Can only blacklist 800 addresses per transaction");
        for (uint256 i; i < addresses.length; ++i) {
            _isBlacklisted[addresses[i]] = true;
        }
    }
    
    function isBlacklisted(address addresses) public view returns (bool){
        return _isBlacklisted[addresses];
    }
    
    function unBlacklistSingleWallet(address addresses) external onlyOwner(){
         if(_isBlacklisted[addresses] == false) return;
        _isBlacklisted[addresses] = false;
    }
    
    function unBlacklistMultipleWallets(address[] calldata addresses) public onlyOwner(){
        require(addresses.length <= 800, "Can only unblacklist 800 addresses per transaction");
        for (uint256 i; i < addresses.length; ++i) {
            _isBlacklisted[addresses[i]] = false;
        }
    }

    function burnTokens(uint256 tokens) external {
        tokens = tokens.mul( 10**_decimals );
        require(msg.sender != address(0), "ERC20: burn from the zero address");
        require(tokens > 0, "Tokens value should be greater then Zero");
        require(tokens <= balanceOf(msg.sender), "Tokens value should be less then equal to your balance");
        
        uint256 rTokens = tokens.mul(_getRate());
        if(_isExcluded[msg.sender])
            _tOwned[msg.sender] = _tOwned[msg.sender].sub(tokens);
        _rOwned[msg.sender] = _rOwned[msg.sender].sub(rTokens);
        _tTotal = _tTotal.sub(tokens);
        _rTotal = _rTotal.sub(rTokens);

        emit Transfer(msg.sender, address(this), tokens);
    }
    
    function recoverBNB() public onlyOwner()
    {
        address payable recipient = payable(_msgSender());
        if(address(this).balance > 0)
            recipient.transfer(address(this).balance);
    }
    
    //New Pancakeswap router version?
    //No problem, just change it!
    function setRouterAddress(address newRouter) public onlyOwner() {
        IPancakeRouter02 _newPancakeRouter = IPancakeRouter02(newRouter);
        // pancakePair = IPancakeFactory(_newPancakeRouter.factory()).createPair(address(this), _newPancakeRouter.WETH());
        address getPair = IPancakeFactory(_newPancakeRouter.factory()).getPair(address(this), USDC);
        if (getPair == address(0)) {
            pancakePair = IPancakeFactory(_newPancakeRouter.factory()).createPair(address(this), USDC);
        } else {
            pancakePair = getPair;
        }
        pancakeRouter = _newPancakeRouter;
    }

    function withdraw(IERC20 token, address recipient, uint256 amount) public onlyOwner {
        require(token.balanceOf(address(this)) >= amount, "Withdraw: Insufficient balance");
        token.transfer(recipient, 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":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqiudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"USDC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_burnAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_burnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_externalAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_externalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedFromAntiWhale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTokensPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmountBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmountSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_numTokensSellToAndTransfer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_reflectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoLiquidityReceiver","outputs":[{"internalType":"address payable","name":"","type":"address"}],"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":"addresses","type":"address[]"}],"name":"blacklistMultipleWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addresses","type":"address"}],"name":"blacklistSingleWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"burnTokens","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":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludedFromAntiWhale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludedFromMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInAntiWhale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addresses","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pancakePair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pancakeRouter","outputs":[{"internalType":"contract IPancakeRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoverBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"Fee","type":"uint256"}],"name":"setBurnFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"externalAddress","type":"address"}],"name":"setExternalAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"Fee","type":"uint256"}],"name":"setExternalFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"liquidityAddress","type":"address"}],"name":"setLiquidityAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"Fee","type":"uint256"}],"name":"setLiquidityFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTokens","type":"uint256"}],"name":"setMaxTokenPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxTokens","type":"uint256"}],"name":"setMaxTxTokensBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxTokens","type":"uint256"}],"name":"setMaxTxTokensSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minTokensValue","type":"uint256"}],"name":"setMinTokensSellToAndTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"Fee","type":"uint256"}],"name":"setReflectFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeesCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"unBlacklistMultipleWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addresses","type":"address"}],"name":"unBlacklistSingleWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

600a80546001600160a01b0319908116731598f474b3b25c48e8d29798fcb6fd5be303eda417909155600b805490911661dead17815560c060405260808190526a494e554d414b49544f474560a81b60a09081526200006291600d919062000621565b5060408051808201909152600480825263544f474560e01b60209092019182526200009091600e9162000621565b50600f805460ff19166012908117909155620000ae90600a6200075d565b620000bf906402540be4006200081c565b6010819055620000d29060001962000895565b620000e0906000196200083e565b6011556000601355601354601455600060155560155460165560326017556017546018556014601955601954601a556200012d601954601754620005ba60201b620022d61790919060201c565b601b819055601c55601e805460ff60a81b1916600160a81b179055600f546200015b9060ff16600a6200075d565b6200016e9066038d7ea4c680006200081c565b601f55600f54620001849060ff16600a6200075d565b620001979066038d7ea4c680006200081c565b602055600f54620001ad9060ff16600a6200075d565b620001bc90629896806200081c565b602155600f54620001d29060ff16600a6200075d565b620001e2906305f5e1006200081c565b602255348015620001f257600080fd5b50620001fe33620005d1565b6011543360009081526001602090815260409182902092909255805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d92839263c45a01559260048083019392829003018186803b1580156200026057600080fd5b505afa15801562000275573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029b9190620006c7565b6040516364e329cb60e11b815230600482015273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4860248201526001600160a01b03919091169063c9c6539690604401602060405180830381600087803b158015620002f957600080fd5b505af11580156200030e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003349190620006c7565b601e80546001600160a01b03199081166001600160a01b0393841617909155601d80549091169183169190911790556001600460006200037c6000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff199687161790553081526004909352818320805485166001908117909155600a54909116835290822080549093168117909255600790620003ec6000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff199687161790553081526007909352818320805485166001908117909155601e5482168452828420805486168217905585821684528284208054861682179055600b549091168352908220805490931681179092556003906200047e6000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905530815260038452828120805486166001908117909155601e5483168252838220805487168217905586831682528382208054871682179055600b805484168352848320805488168317905560059095527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc805487168217905593549091168152208054909216179055600c80546001600160a01b03191673f9d46d6f0a0a662de6a1c5d417f245da00fb4475179055620005633390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef601054604051620005ab91815260200190565b60405180910390a350620008ce565b6000620005c88284620006f9565b90505b92915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200062f9062000858565b90600052602060002090601f0160209004810192826200065357600085556200069e565b82601f106200066e57805160ff19168380011785556200069e565b828001600101855582156200069e579182015b828111156200069e57825182559160200191906001019062000681565b50620006ac929150620006b0565b5090565b5b80821115620006ac5760008155600101620006b1565b600060208284031215620006da57600080fd5b81516001600160a01b0381168114620006f257600080fd5b9392505050565b600082198211156200070f576200070f620008b8565b500190565b600181815b8085111562000755578160001904821115620007395762000739620008b8565b808516156200074757918102915b93841c939080029062000719565b509250929050565b6000620005c860ff8416836000826200077957506001620005cb565b816200078857506000620005cb565b8160018114620007a15760028114620007ac57620007cc565b6001915050620005cb565b60ff841115620007c057620007c0620008b8565b50506001821b620005cb565b5060208310610133831016604e8410600b8410161715620007f1575081810a620005cb565b620007fd838362000714565b8060001904821115620008145762000814620008b8565b029392505050565b6000816000190483118215151615620008395762000839620008b8565b500290565b600082821015620008535762000853620008b8565b500390565b600181811c908216806200086d57607f821691505b602082108114156200088f57634e487b7160e01b600052602260045260246000fd5b50919050565b600082620008b357634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052601160045260246000fd5b613e1580620008de6000396000f3fe6080604052600436106103c75760003560e01c806370a08231116101f2578063c0b0fda21161010d578063dd62ed3e116100a0578063f2fde38b1161006f578063f2fde38b14610b86578063f560b92e14610ba6578063f59d047c14610bc6578063fe575a8714610bdc57600080fd5b8063dd62ed3e14610aea578063ea2f0b3714610b30578063f011de1c14610b50578063f157ce4014610b6657600080fd5b8063cad6ebf9116100dc578063cad6ebf914610a6a578063cea2695814610a8a578063d9caed1214610aaa578063dc56f2b614610aca57600080fd5b8063c0b0fda2146109f4578063c21ebd0714610a0a578063c49b9a8014610a2a578063ca33e64c14610a4a57600080fd5b8063a1bdc39911610185578063b8c9d25c11610154578063b8c9d25c14610974578063bd3900c014610994578063bf323719146109b4578063bfd5bf1c146109d457600080fd5b8063a1bdc399146108f4578063a457c2d714610914578063a9059cbb14610934578063ade1ba0e1461095457600080fd5b806389a30271116101c157806389a30271146108615780638da5cb5b146108a15780638ee88c53146108bf57806395d89b41146108df57600080fd5b806370a08231146107d3578063715018a6146107f3578063772558ce1461080857806388f820201461082857600080fd5b806343743e42116102e257806354c694aa116102755780636bfdf8a0116102445780636bfdf8a01461075e5780636d1b229d146107735780636de20a09146107935780636fd36cd6146107b357600080fd5b806354c694aa146106fd57806360c6d8ae1461071d5780636125a72c146107325780636bc87c3a1461074857600080fd5b80634a74bb02116102b15780634a74bb021461066357806352390c0214610684578063525fa81f146106a45780635342acb4146106c457600080fd5b806343743e42146105f7578063437823ec1461060d5780634549b0391461062d57806346469ae71461064d57600080fd5b80632f1191431161035a578063395093511161032957806339509351146105775780633bb48ff7146105975780633bd5d173146105b757806341cb87fc146105d757600080fd5b80632f119143146104ff578063313ce5671461051f5780633206b4aa146105415780633685d4191461055757600080fd5b806323b872dd1161039657806323b872dd1461046f57806325a6cc061461048f5780632c505e90146104af5780632d838119146104df57600080fd5b806306fdde03146103d3578063095ea7b3146103fe578063180ea6051461042e57806318160ddd1461045057600080fd5b366103ce57005b600080fd5b3480156103df57600080fd5b506103e8610c15565b6040516103f59190613a3d565b60405180910390f35b34801561040a57600080fd5b5061041e6104193660046138dd565b610ca7565b60405190151581526020016103f5565b34801561043a57600080fd5b5061044e6104493660046139b8565b610cbe565b005b34801561045c57600080fd5b506010545b6040519081526020016103f5565b34801561047b57600080fd5b5061041e61048a36600461389c565b610d13565b34801561049b57600080fd5b5061044e6104aa3660046139b8565b610d7c565b3480156104bb57600080fd5b5061041e6104ca366004613829565b60036020526000908152604090205460ff1681565b3480156104eb57600080fd5b506104616104fa3660046139b8565b610dc1565b34801561050b57600080fd5b5061044e61051a366004613829565b610e45565b34801561052b57600080fd5b50600f5460405160ff90911681526020016103f5565b34801561054d57600080fd5b5061046160155481565b34801561056357600080fd5b5061044e610572366004613829565b610e90565b34801561058357600080fd5b5061041e6105923660046138dd565b611047565b3480156105a357600080fd5b5061044e6105b23660046139b8565b61107d565b3480156105c357600080fd5b5061044e6105d23660046139b8565b6110ac565b3480156105e357600080fd5b5061044e6105f2366004613829565b611198565b34801561060357600080fd5b5061046160175481565b34801561061957600080fd5b5061044e610628366004613829565b611448565b34801561063957600080fd5b506104616106483660046139ea565b611496565b34801561065957600080fd5b50610461601f5481565b34801561066f57600080fd5b50601e5461041e90600160a81b900460ff1681565b34801561069057600080fd5b5061044e61069f366004613829565b611525565b3480156106b057600080fd5b5061044e6106bf366004613829565b6116f4565b3480156106d057600080fd5b5061041e6106df366004613829565b6001600160a01b031660009081526004602052604090205460ff1690565b34801561070957600080fd5b5061044e6107183660046139b8565b611740565b34801561072957600080fd5b50601254610461565b34801561073e57600080fd5b5061046160215481565b34801561075457600080fd5b5061046160195481565b34801561076a57600080fd5b5061044e611785565b34801561077f57600080fd5b5061044e61078e3660046139b8565b6117ee565b34801561079f57600080fd5b5061044e6107ae366004613829565b6119da565b3480156107bf57600080fd5b5061044e6107ce366004613829565b611a28565b3480156107df57600080fd5b506104616107ee366004613829565b611a74565b3480156107ff57600080fd5b5061044e611ad3565b34801561081457600080fd5b5061044e610823366004613909565b611b09565b34801561083457600080fd5b5061041e610843366004613829565b6001600160a01b031660009081526005602052604090205460ff1690565b34801561086d57600080fd5b5061088973a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b6040516001600160a01b0390911681526020016103f5565b3480156108ad57600080fd5b506000546001600160a01b0316610889565b3480156108cb57600080fd5b5061044e6108da3660046139b8565b611c13565b3480156108eb57600080fd5b506103e8611c56565b34801561090057600080fd5b5061044e61090f366004613909565b611c65565b34801561092057600080fd5b5061041e61092f3660046138dd565b611d6c565b34801561094057600080fd5b5061041e61094f3660046138dd565b611dbb565b34801561096057600080fd5b5061044e61096f3660046139b8565b611dc8565b34801561098057600080fd5b50601e54610889906001600160a01b031681565b3480156109a057600080fd5b50600b54610889906001600160a01b031681565b3480156109c057600080fd5b5061044e6109cf366004613829565b611e0d565b3480156109e057600080fd5b50600a54610889906001600160a01b031681565b348015610a0057600080fd5b5061046160135481565b348015610a1657600080fd5b50601d54610889906001600160a01b031681565b348015610a3657600080fd5b5061044e610a4536600461397e565b611e58565b348015610a5657600080fd5b50600c54610889906001600160a01b031681565b348015610a7657600080fd5b5061044e610a85366004613829565b611eda565b348015610a9657600080fd5b5061044e610aa53660046139b8565b611f53565b348015610ab657600080fd5b5061044e610ac536600461389c565b611f82565b348015610ad657600080fd5b5061044e610ae53660046139b8565b6120fb565b348015610af657600080fd5b50610461610b05366004613863565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b348015610b3c57600080fd5b5061044e610b4b366004613829565b612137565b348015610b5c57600080fd5b5061046160225481565b348015610b7257600080fd5b5061044e610b81366004613829565b612182565b348015610b9257600080fd5b5061044e610ba1366004613829565b6121f0565b348015610bb257600080fd5b5061044e610bc1366004613829565b612288565b348015610bd257600080fd5b5061046160205481565b348015610be857600080fd5b5061041e610bf7366004613829565b6001600160a01b031660009081526006602052604090205460ff1690565b6060600d8054610c2490613cd7565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5090613cd7565b8015610c9d5780601f10610c7257610100808354040283529160200191610c9d565b820191906000526020600020905b815481529060010190602001808311610c8057829003601f168201915b5050505050905090565b6000610cb43384846122e2565b5060015b92915050565b6000546001600160a01b03163314610cf15760405162461bcd60e51b8152600401610ce890613a92565b60405180910390fd5b600f54610d0d90610d069060ff16600a613bf6565b8290612406565b60205550565b6000610d20848484612412565b610d728433610d6d85604051806060016040528060288152602001613d93602891396001600160a01b038a16600090815260086020908152604080832033845290915290205491906128aa565b6122e2565b5060019392505050565b6000546001600160a01b03163314610da65760405162461bcd60e51b8152600401610ce890613a92565b600f54610dbb90610d069060ff16600a613bf6565b60225550565b6000601154821115610e285760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610ce8565b6000610e326128d6565b9050610e3e83826128f9565b9392505050565b6000546001600160a01b03163314610e6f5760405162461bcd60e51b8152600401610ce890613a92565b6001600160a01b03166000908152600760205260409020805460ff19169055565b6000546001600160a01b03163314610eba5760405162461bcd60e51b8152600401610ce890613a92565b6001600160a01b03811660009081526005602052604090205460ff16610f225760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610ce8565b60005b60095481101561104357816001600160a01b031660098281548110610f4c57610f4c613d59565b6000918252602090912001546001600160a01b031614156110315760098054610f7790600190613cc0565b81548110610f8757610f87613d59565b600091825260209091200154600980546001600160a01b039092169183908110610fb357610fb3613d59565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600590925220805460ff19169055600980548061100b5761100b613d43565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b8061103b81613d12565b915050610f25565b5050565b3360008181526008602090815260408083206001600160a01b03871684529091528120549091610cb4918590610d6d90866122d6565b6000546001600160a01b031633146110a75760405162461bcd60e51b8152600401610ce890613a92565b601555565b3360008181526005602052604090205460ff16156111215760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610ce8565b600061112c83612905565b5050506001600160a01b03861660009081526001602052604090205493945061115a93925084915050612960565b6001600160a01b0383166000908152600160205260409020556011546111809082612960565b60115560125461119090846122d6565b601255505050565b6000546001600160a01b031633146111c25760405162461bcd60e51b8152600401610ce890613a92565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561120257600080fd5b505afa158015611216573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123a9190613846565b60405163e6a4390560e01b815230600482015273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4860248201526001600160a01b03919091169063e6a439059060440160206040518083038186803b15801561129557600080fd5b505afa1580156112a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cd9190613846565b90506001600160a01b03811661140857816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561131657600080fd5b505afa15801561132a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134e9190613846565b6040516364e329cb60e11b815230600482015273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4860248201526001600160a01b03919091169063c9c6539690604401602060405180830381600087803b1580156113ab57600080fd5b505af11580156113bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e39190613846565b601e80546001600160a01b0319166001600160a01b0392909216919091179055611424565b601e80546001600160a01b0319166001600160a01b0383161790555b50601d80546001600160a01b0319166001600160a01b039290921691909117905550565b6000546001600160a01b031633146114725760405162461bcd60e51b8152600401610ce890613a92565b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b60006010548311156114ea5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610ce8565b8161150a5760006114fa84612905565b50949650610cb895505050505050565b600061151584612905565b50939650610cb895505050505050565b6000546001600160a01b0316331461154f5760405162461bcd60e51b8152600401610ce890613a92565b737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03821614156115cb5760405162461bcd60e51b815260206004820152602660248201527f57652063616e206e6f74206578636c7564652070616e63616b6573776170207260448201526537baba32b91760d11b6064820152608401610ce8565b6001600160a01b03811660009081526005602052604090205460ff16156116345760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610ce8565b6001600160a01b0381166000908152600160205260409020541561168e576001600160a01b03811660009081526001602052604090205461167490610dc1565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152600560205260408120805460ff191660019081179091556009805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0319169091179055565b6000546001600160a01b0316331461171e5760405162461bcd60e51b8152600401610ce890613a92565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461176a5760405162461bcd60e51b8152600401610ce890613a92565b600f5461177f90610d069060ff16600a613bf6565b601f5550565b6000546001600160a01b031633146117af5760405162461bcd60e51b8152600401610ce890613a92565b3347156117eb576040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015611043573d6000803e3d6000fd5b50565b600f5461180390610d069060ff16600a613bf6565b9050336118225760405162461bcd60e51b8152600401610ce890613ac7565b600081116118835760405162461bcd60e51b815260206004820152602860248201527f546f6b656e732076616c75652073686f756c642062652067726561746572207460448201526768656e205a65726f60c01b6064820152608401610ce8565b61188c33611a74565b8111156118fa5760405162461bcd60e51b815260206004820152603660248201527f546f6b656e732076616c75652073686f756c64206265206c657373207468656e60448201527520657175616c20746f20796f75722062616c616e636560501b6064820152608401610ce8565b600061190e6119076128d6565b8390612406565b3360009081526005602052604090205490915060ff161561195457336000908152600260205260409020546119439083612960565b336000908152600260205260409020555b3360009081526001602052604090205461196e9082612960565b3360009081526001602052604090205560105461198b9083612960565b60105560115461199b9082612960565b601155604051828152309033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6000546001600160a01b03163314611a045760405162461bcd60e51b8152600401610ce890613a92565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6000546001600160a01b03163314611a525760405162461bcd60e51b8152600401610ce890613a92565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526005602052604081205460ff1615611ab157506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610cb890610dc1565b6000546001600160a01b03163314611afd5760405162461bcd60e51b8152600401610ce890613a92565b611b07600061296c565b565b6000546001600160a01b03163314611b335760405162461bcd60e51b8152600401610ce890613a92565b610320811115611b9e5760405162461bcd60e51b815260206004820152603060248201527f43616e206f6e6c7920626c61636b6c697374203830302061646472657373657360448201526f103832b9103a3930b739b0b1ba34b7b760811b6064820152608401610ce8565b60005b81811015611c0e57600160066000858585818110611bc157611bc1613d59565b9050602002016020810190611bd69190613829565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055611c0781613d12565b9050611ba1565b505050565b6000546001600160a01b03163314611c3d5760405162461bcd60e51b8152600401610ce890613a92565b6019819055601754611c509082906122d6565b601b5550565b6060600e8054610c2490613cd7565b6000546001600160a01b03163314611c8f5760405162461bcd60e51b8152600401610ce890613a92565b610320811115611cfc5760405162461bcd60e51b815260206004820152603260248201527f43616e206f6e6c7920756e626c61636b6c69737420383030206164647265737360448201527132b9903832b9103a3930b739b0b1ba34b7b760711b6064820152608401610ce8565b60005b81811015611c0e57600060066000858585818110611d1f57611d1f613d59565b9050602002016020810190611d349190613829565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055611d6581613d12565b9050611cff565b6000610cb43384610d6d85604051806060016040528060258152602001613dbb602591393360009081526008602090815260408083206001600160a01b038d16845290915290205491906128aa565b6000610cb4338484612412565b6000546001600160a01b03163314611df25760405162461bcd60e51b8152600401610ce890613a92565b600f54611e0790610d069060ff16600a613bf6565b60215550565b6000546001600160a01b03163314611e375760405162461bcd60e51b8152600401610ce890613a92565b6001600160a01b03166000908152600360205260409020805460ff19169055565b6000546001600160a01b03163314611e825760405162461bcd60e51b8152600401610ce890613a92565b601e8054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990611ecf90831515815260200190565b60405180910390a150565b6000546001600160a01b03163314611f045760405162461bcd60e51b8152600401610ce890613a92565b6001600160a01b03811660009081526006602052604090205460ff16151560011415611f2d5750565b6001600160a01b0381166000908152600660205260409020805460ff1916600117905550565b6000546001600160a01b03163314611f7d5760405162461bcd60e51b8152600401610ce890613a92565b601355565b6000546001600160a01b03163314611fac5760405162461bcd60e51b8152600401610ce890613a92565b6040516370a0823160e01b815230600482015281906001600160a01b038516906370a082319060240160206040518083038186803b158015611fed57600080fd5b505afa158015612001573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202591906139d1565b10156120735760405162461bcd60e51b815260206004820152601e60248201527f57697468647261773a20496e73756666696369656e742062616c616e636500006044820152606401610ce8565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401602060405180830381600087803b1580156120bd57600080fd5b505af11580156120d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f5919061399b565b50505050565b6000546001600160a01b031633146121255760405162461bcd60e51b8152600401610ce890613a92565b6017819055601954611c5090826122d6565b6000546001600160a01b031633146121615760405162461bcd60e51b8152600401610ce890613a92565b6001600160a01b03166000908152600460205260409020805460ff19169055565b6000546001600160a01b031633146121ac5760405162461bcd60e51b8152600401610ce890613a92565b6001600160a01b03811660009081526006602052604090205460ff166121cf5750565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b0316331461221a5760405162461bcd60e51b8152600401610ce890613a92565b6001600160a01b03811661227f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ce8565b6117eb8161296c565b6000546001600160a01b031633146122b25760405162461bcd60e51b8152600401610ce890613a92565b6001600160a01b03166000908152600360205260409020805460ff19166001179055565b6000610e3e8284613b79565b6001600160a01b0383166123445760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ce8565b6001600160a01b0382166123a55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ce8565b6001600160a01b0383811660008181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610e3e8284613ca1565b6001600160a01b0383166124765760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ce8565b6001600160a01b0382166124d85760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610ce8565b6000811161253a5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610ce8565b6001600160a01b03821660009081526003602052604090205460ff168061257657506022548161256984611a74565b6125739190613b79565b11155b6125e85760405162461bcd60e51b815260206004820152603e60248201527f4d617820746f6b656e73206c696d697420666f722074686973206163636f756e60448201527f7420726561636865642e204f7220747279206c6f77657220616d6f756e7400006064820152608401610ce8565b6001600160a01b03831660009081526006602052604090205460ff16156126425760405162461bcd60e51b815260206004820152600e60248201526d165bdd48185c994818985b9b995960921b6044820152606401610ce8565b6001600160a01b03821660009081526006602052604090205460ff16156126ab5760405162461bcd60e51b815260206004820152601760248201527f54686520726563697069656e742069732062616e6e65640000000000000000006044820152606401610ce8565b601e546001600160a01b0384811691161415612744576001600160a01b03821660009081526007602052604090205460ff1661273f57601f5481111561273f5760405162461bcd60e51b815260206004820152602360248201527f42757920616d6f756e74206578636565647320746865206d61785478416d6f75604482015262373a1760e91b6064820152608401610ce8565b6127dd565b6001600160a01b03831660009081526007602052604090205460ff1615801561277a5750601e546001600160a01b038381169116145b156127dd576020548111156127dd5760405162461bcd60e51b8152602060048201526024808201527f53656c6c20616d6f756e74206578636565647320746865206d61785478416d6f6044820152633ab73a1760e11b6064820152608401610ce8565b60006127e830611a74565b602154909150811080159081906128095750601e54600160a01b900460ff16155b80156128235750601e546001600160a01b03868116911614155b80156128385750601e54600160a81b900460ff165b1561284b57602154915061284b826129bc565b6001600160a01b03851660009081526004602052604090205460019060ff168061288d57506001600160a01b03851660009081526004602052604090205460ff165b15612896575060005b6128a286868684612c58565b505050505050565b600081848411156128ce5760405162461bcd60e51b8152600401610ce89190613a3d565b505050900390565b60008060006128e3612de1565b90925090506128f282826128f9565b9250505090565b6000610e3e8284613b91565b600080600080600080600080600080600061291f8c612f63565b935093509350935060008060006129408f87868861293b6128d6565b612fb2565b919f509d509b509599509397509195509350505050919395979092949650565b6000610e3e8284613cc0565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b601e805460ff60a01b1916600160a01b1790556040516370a0823160e01b8152306004820152819073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489060009082906370a082319060240160206040518083038186803b158015612a2057600080fd5b505afa158015612a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a5891906139d1565b60175490915015612b31576000612a7a6017548661240690919063ffffffff16565b9050612a91601b54826128f990919063ffffffff16565b9050612a9d8582612960565b600a54909450612ab6906001600160a01b031682613014565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a082319060240160206040518083038186803b158015612af557600080fd5b505afa158015612b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2d91906139d1565b9150505b60195415612c45576000612b468460026128f9565b90506000612b548583612960565b9050612b603083613014565b6040516370a0823160e01b8152306004820152600090612be69085906001600160a01b038816906370a082319060240160206040518083038186803b158015612ba857600080fd5b505afa158015612bbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612be091906139d1565b90612960565b600c54909150612c00906001600160a01b031683836131c8565b60408051848152602081018390529081018390527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505b5050601e805460ff60a01b191690555050565b80612c6557612c6561333a565b6001600160a01b03841660009081526005602052604090205460ff168015612ca657506001600160a01b03831660009081526005602052604090205460ff16155b15612cbb57612cb68484846133ad565b612db9565b6001600160a01b03841660009081526005602052604090205460ff16158015612cfc57506001600160a01b03831660009081526005602052604090205460ff165b15612d0c57612cb68484846134f4565b6001600160a01b03841660009081526005602052604090205460ff16158015612d4e57506001600160a01b03831660009081526005602052604090205460ff16155b15612d5e57612cb68484846135b3565b6001600160a01b03841660009081526005602052604090205460ff168015612d9e57506001600160a01b03831660009081526005602052604090205460ff165b15612dae57612cb684848461360d565b612db98484846135b3565b806120f5576120f5601a54601955601454601355601854601755601654601555601c54601b55565b6011546010546000918291825b600954811015612f3357826001600060098481548110612e1057612e10613d59565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612e7b5750816002600060098481548110612e5457612e54613d59565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612e9157601154601054945094505050509091565b612ed76001600060098481548110612eab57612eab613d59565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612960565b9250612f1f6002600060098481548110612ef357612ef3613d59565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612960565b915080612f2b81613d12565b915050612dee565b50601054601154612f43916128f9565b821015612f5a576011546010549350935050509091565b90939092509050565b6000806000806000612f7486613696565b90506000612f81876136b9565b90506000612f8e886136d6565b90506000612fa283612be084818d89612960565b9993985091965094509092505050565b6000808080612fc18986612406565b90506000612fcf8987612406565b90506000612fdd8888612406565b90506000612feb8a89612406565b90506000612fff83612be084818989612960565b949d949c50929a509298505050505050505050565b6040805160038082526080820190925260009160208201606080368337019050509050308160008151811061304b5761304b613d59565b6001600160a01b03928316602091820292909201810191909152601d54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561309f57600080fd5b505afa1580156130b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130d79190613846565b816001815181106130ea576130ea613d59565b60200260200101906001600160a01b031690816001600160a01b03168152505073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488160028151811061313257613132613d59565b6001600160a01b039283166020918202929092010152601d5461315891309116846122e2565b601d54604051635c11d79560e01b81526001600160a01b0390911690635c11d79590613191908590600090869089904290600401613b08565b600060405180830381600087803b1580156131ab57600080fd5b505af11580156131bf573d6000803e3d6000fd5b50505050505050565b601d546131e09030906001600160a01b0316846122e2565b601d5460405163095ea7b360e01b81526001600160a01b0390911660048201526024810182905273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489063095ea7b390604401602060405180830381600087803b15801561324057600080fd5b505af1158015613254573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613278919061399b565b50601d5460405162e8e33760e81b815230600482015273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486024820152604481018490526064810183905260006084820181905260a48201526001600160a01b0385811660c48301524260e48301529091169063e8e337009061010401606060405180830381600087803b15801561330257600080fd5b505af1158015613316573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a29190613a0f565b601b5415801561334a5750601354155b80156133565750601954155b80156133625750601754155b801561336e5750601554155b1561337557565b60198054601a55601380546014556017805460185560158054601655601b8054601c5560009384905591839055829055918190559055565b60008060008060008060006133c188612905565b965096509650965096509650965061340788600260008d6001600160a01b03166001600160a01b031681526020019081526020016000205461296090919063ffffffff16565b6001600160a01b038b166000908152600260209081526040808320939093556001905220546134369088612960565b6001600160a01b03808c1660009081526001602052604080822093909355908b168152205461346590876122d6565b6001600160a01b038a166000908152600160205260409020556134888a836136f3565b6134918161377d565b61349b8584613805565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516134e091815260200190565b60405180910390a350505050505050505050565b600080600080600080600061350888612905565b965096509650965096509650965061354e87600160008d6001600160a01b03166001600160a01b031681526020019081526020016000205461296090919063ffffffff16565b6001600160a01b03808c16600090815260016020908152604080832094909455918c1681526002909152205461358490856122d6565b6001600160a01b038a1660009081526002602090815260408083209390935560019052205461346590876122d6565b60008060008060008060006135c788612905565b965096509650965096509650965061343687600160008d6001600160a01b03166001600160a01b031681526020019081526020016000205461296090919063ffffffff16565b600080600080600080600061362188612905565b965096509650965096509650965061366788600260008d6001600160a01b03166001600160a01b031681526020019081526020016000205461296090919063ffffffff16565b6001600160a01b038b1660009081526002602090815260408083209390935560019052205461354e9088612960565b6000610cb86103e86136b36015548561240690919063ffffffff16565b906128f9565b6000610cb86103e86136b36013548561240690919063ffffffff16565b6000610cb86103e86136b3601b548561240690919063ffffffff16565b8015611043576001600160a01b03821661371f5760405162461bcd60e51b8152600401610ce890613ac7565b60105461372c9082612960565b60105561374661373d6119076128d6565b60115490612960565b601155604051818152309033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016119ce565b60006137876128d6565b905060006137958383612406565b306000908152600160205260409020549091506137b290826122d6565b3060009081526001602090815260408083209390935560059052205460ff1615611c0e57306000908152600260205260409020546137f090846122d6565b30600090815260026020526040902055505050565b6011546138129083612960565b60115560125461382290826122d6565b6012555050565b60006020828403121561383b57600080fd5b8135610e3e81613d6f565b60006020828403121561385857600080fd5b8151610e3e81613d6f565b6000806040838503121561387657600080fd5b823561388181613d6f565b9150602083013561389181613d6f565b809150509250929050565b6000806000606084860312156138b157600080fd5b83356138bc81613d6f565b925060208401356138cc81613d6f565b929592945050506040919091013590565b600080604083850312156138f057600080fd5b82356138fb81613d6f565b946020939093013593505050565b6000806020838503121561391c57600080fd5b823567ffffffffffffffff8082111561393457600080fd5b818501915085601f83011261394857600080fd5b81358181111561395757600080fd5b8660208260051b850101111561396c57600080fd5b60209290920196919550909350505050565b60006020828403121561399057600080fd5b8135610e3e81613d84565b6000602082840312156139ad57600080fd5b8151610e3e81613d84565b6000602082840312156139ca57600080fd5b5035919050565b6000602082840312156139e357600080fd5b5051919050565b600080604083850312156139fd57600080fd5b82359150602083013561389181613d84565b600080600060608486031215613a2457600080fd5b8351925060208401519150604084015190509250925092565b600060208083528351808285015260005b81811015613a6a57858101830151858201604001528201613a4e565b81811115613a7c576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613b585784516001600160a01b031683529383019391830191600101613b33565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115613b8c57613b8c613d2d565b500190565b600082613bae57634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115613bee578160001904821115613bd457613bd4613d2d565b80851615613be157918102915b93841c9390800290613bb8565b509250929050565b6000610e3e60ff841683600082613c0f57506001610cb8565b81613c1c57506000610cb8565b8160018114613c325760028114613c3c57613c58565b6001915050610cb8565b60ff841115613c4d57613c4d613d2d565b50506001821b610cb8565b5060208310610133831016604e8410600b8410161715613c7b575081810a610cb8565b613c858383613bb3565b8060001904821115613c9957613c99613d2d565b029392505050565b6000816000190483118215151615613cbb57613cbb613d2d565b500290565b600082821015613cd257613cd2613d2d565b500390565b600181811c90821680613ceb57607f821691505b60208210811415613d0c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613d2657613d26613d2d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03811681146117eb57600080fd5b80151581146117eb57600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122050aacfb624c4ee676a8d53b3334f8453353c5bdc30a8f42dec1cbdb06fbd485364736f6c63430008070033

Deployed Bytecode

0x6080604052600436106103c75760003560e01c806370a08231116101f2578063c0b0fda21161010d578063dd62ed3e116100a0578063f2fde38b1161006f578063f2fde38b14610b86578063f560b92e14610ba6578063f59d047c14610bc6578063fe575a8714610bdc57600080fd5b8063dd62ed3e14610aea578063ea2f0b3714610b30578063f011de1c14610b50578063f157ce4014610b6657600080fd5b8063cad6ebf9116100dc578063cad6ebf914610a6a578063cea2695814610a8a578063d9caed1214610aaa578063dc56f2b614610aca57600080fd5b8063c0b0fda2146109f4578063c21ebd0714610a0a578063c49b9a8014610a2a578063ca33e64c14610a4a57600080fd5b8063a1bdc39911610185578063b8c9d25c11610154578063b8c9d25c14610974578063bd3900c014610994578063bf323719146109b4578063bfd5bf1c146109d457600080fd5b8063a1bdc399146108f4578063a457c2d714610914578063a9059cbb14610934578063ade1ba0e1461095457600080fd5b806389a30271116101c157806389a30271146108615780638da5cb5b146108a15780638ee88c53146108bf57806395d89b41146108df57600080fd5b806370a08231146107d3578063715018a6146107f3578063772558ce1461080857806388f820201461082857600080fd5b806343743e42116102e257806354c694aa116102755780636bfdf8a0116102445780636bfdf8a01461075e5780636d1b229d146107735780636de20a09146107935780636fd36cd6146107b357600080fd5b806354c694aa146106fd57806360c6d8ae1461071d5780636125a72c146107325780636bc87c3a1461074857600080fd5b80634a74bb02116102b15780634a74bb021461066357806352390c0214610684578063525fa81f146106a45780635342acb4146106c457600080fd5b806343743e42146105f7578063437823ec1461060d5780634549b0391461062d57806346469ae71461064d57600080fd5b80632f1191431161035a578063395093511161032957806339509351146105775780633bb48ff7146105975780633bd5d173146105b757806341cb87fc146105d757600080fd5b80632f119143146104ff578063313ce5671461051f5780633206b4aa146105415780633685d4191461055757600080fd5b806323b872dd1161039657806323b872dd1461046f57806325a6cc061461048f5780632c505e90146104af5780632d838119146104df57600080fd5b806306fdde03146103d3578063095ea7b3146103fe578063180ea6051461042e57806318160ddd1461045057600080fd5b366103ce57005b600080fd5b3480156103df57600080fd5b506103e8610c15565b6040516103f59190613a3d565b60405180910390f35b34801561040a57600080fd5b5061041e6104193660046138dd565b610ca7565b60405190151581526020016103f5565b34801561043a57600080fd5b5061044e6104493660046139b8565b610cbe565b005b34801561045c57600080fd5b506010545b6040519081526020016103f5565b34801561047b57600080fd5b5061041e61048a36600461389c565b610d13565b34801561049b57600080fd5b5061044e6104aa3660046139b8565b610d7c565b3480156104bb57600080fd5b5061041e6104ca366004613829565b60036020526000908152604090205460ff1681565b3480156104eb57600080fd5b506104616104fa3660046139b8565b610dc1565b34801561050b57600080fd5b5061044e61051a366004613829565b610e45565b34801561052b57600080fd5b50600f5460405160ff90911681526020016103f5565b34801561054d57600080fd5b5061046160155481565b34801561056357600080fd5b5061044e610572366004613829565b610e90565b34801561058357600080fd5b5061041e6105923660046138dd565b611047565b3480156105a357600080fd5b5061044e6105b23660046139b8565b61107d565b3480156105c357600080fd5b5061044e6105d23660046139b8565b6110ac565b3480156105e357600080fd5b5061044e6105f2366004613829565b611198565b34801561060357600080fd5b5061046160175481565b34801561061957600080fd5b5061044e610628366004613829565b611448565b34801561063957600080fd5b506104616106483660046139ea565b611496565b34801561065957600080fd5b50610461601f5481565b34801561066f57600080fd5b50601e5461041e90600160a81b900460ff1681565b34801561069057600080fd5b5061044e61069f366004613829565b611525565b3480156106b057600080fd5b5061044e6106bf366004613829565b6116f4565b3480156106d057600080fd5b5061041e6106df366004613829565b6001600160a01b031660009081526004602052604090205460ff1690565b34801561070957600080fd5b5061044e6107183660046139b8565b611740565b34801561072957600080fd5b50601254610461565b34801561073e57600080fd5b5061046160215481565b34801561075457600080fd5b5061046160195481565b34801561076a57600080fd5b5061044e611785565b34801561077f57600080fd5b5061044e61078e3660046139b8565b6117ee565b34801561079f57600080fd5b5061044e6107ae366004613829565b6119da565b3480156107bf57600080fd5b5061044e6107ce366004613829565b611a28565b3480156107df57600080fd5b506104616107ee366004613829565b611a74565b3480156107ff57600080fd5b5061044e611ad3565b34801561081457600080fd5b5061044e610823366004613909565b611b09565b34801561083457600080fd5b5061041e610843366004613829565b6001600160a01b031660009081526005602052604090205460ff1690565b34801561086d57600080fd5b5061088973a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b6040516001600160a01b0390911681526020016103f5565b3480156108ad57600080fd5b506000546001600160a01b0316610889565b3480156108cb57600080fd5b5061044e6108da3660046139b8565b611c13565b3480156108eb57600080fd5b506103e8611c56565b34801561090057600080fd5b5061044e61090f366004613909565b611c65565b34801561092057600080fd5b5061041e61092f3660046138dd565b611d6c565b34801561094057600080fd5b5061041e61094f3660046138dd565b611dbb565b34801561096057600080fd5b5061044e61096f3660046139b8565b611dc8565b34801561098057600080fd5b50601e54610889906001600160a01b031681565b3480156109a057600080fd5b50600b54610889906001600160a01b031681565b3480156109c057600080fd5b5061044e6109cf366004613829565b611e0d565b3480156109e057600080fd5b50600a54610889906001600160a01b031681565b348015610a0057600080fd5b5061046160135481565b348015610a1657600080fd5b50601d54610889906001600160a01b031681565b348015610a3657600080fd5b5061044e610a4536600461397e565b611e58565b348015610a5657600080fd5b50600c54610889906001600160a01b031681565b348015610a7657600080fd5b5061044e610a85366004613829565b611eda565b348015610a9657600080fd5b5061044e610aa53660046139b8565b611f53565b348015610ab657600080fd5b5061044e610ac536600461389c565b611f82565b348015610ad657600080fd5b5061044e610ae53660046139b8565b6120fb565b348015610af657600080fd5b50610461610b05366004613863565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b348015610b3c57600080fd5b5061044e610b4b366004613829565b612137565b348015610b5c57600080fd5b5061046160225481565b348015610b7257600080fd5b5061044e610b81366004613829565b612182565b348015610b9257600080fd5b5061044e610ba1366004613829565b6121f0565b348015610bb257600080fd5b5061044e610bc1366004613829565b612288565b348015610bd257600080fd5b5061046160205481565b348015610be857600080fd5b5061041e610bf7366004613829565b6001600160a01b031660009081526006602052604090205460ff1690565b6060600d8054610c2490613cd7565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5090613cd7565b8015610c9d5780601f10610c7257610100808354040283529160200191610c9d565b820191906000526020600020905b815481529060010190602001808311610c8057829003601f168201915b5050505050905090565b6000610cb43384846122e2565b5060015b92915050565b6000546001600160a01b03163314610cf15760405162461bcd60e51b8152600401610ce890613a92565b60405180910390fd5b600f54610d0d90610d069060ff16600a613bf6565b8290612406565b60205550565b6000610d20848484612412565b610d728433610d6d85604051806060016040528060288152602001613d93602891396001600160a01b038a16600090815260086020908152604080832033845290915290205491906128aa565b6122e2565b5060019392505050565b6000546001600160a01b03163314610da65760405162461bcd60e51b8152600401610ce890613a92565b600f54610dbb90610d069060ff16600a613bf6565b60225550565b6000601154821115610e285760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610ce8565b6000610e326128d6565b9050610e3e83826128f9565b9392505050565b6000546001600160a01b03163314610e6f5760405162461bcd60e51b8152600401610ce890613a92565b6001600160a01b03166000908152600760205260409020805460ff19169055565b6000546001600160a01b03163314610eba5760405162461bcd60e51b8152600401610ce890613a92565b6001600160a01b03811660009081526005602052604090205460ff16610f225760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610ce8565b60005b60095481101561104357816001600160a01b031660098281548110610f4c57610f4c613d59565b6000918252602090912001546001600160a01b031614156110315760098054610f7790600190613cc0565b81548110610f8757610f87613d59565b600091825260209091200154600980546001600160a01b039092169183908110610fb357610fb3613d59565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600590925220805460ff19169055600980548061100b5761100b613d43565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b8061103b81613d12565b915050610f25565b5050565b3360008181526008602090815260408083206001600160a01b03871684529091528120549091610cb4918590610d6d90866122d6565b6000546001600160a01b031633146110a75760405162461bcd60e51b8152600401610ce890613a92565b601555565b3360008181526005602052604090205460ff16156111215760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610ce8565b600061112c83612905565b5050506001600160a01b03861660009081526001602052604090205493945061115a93925084915050612960565b6001600160a01b0383166000908152600160205260409020556011546111809082612960565b60115560125461119090846122d6565b601255505050565b6000546001600160a01b031633146111c25760405162461bcd60e51b8152600401610ce890613a92565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561120257600080fd5b505afa158015611216573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123a9190613846565b60405163e6a4390560e01b815230600482015273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4860248201526001600160a01b03919091169063e6a439059060440160206040518083038186803b15801561129557600080fd5b505afa1580156112a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cd9190613846565b90506001600160a01b03811661140857816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561131657600080fd5b505afa15801561132a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134e9190613846565b6040516364e329cb60e11b815230600482015273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4860248201526001600160a01b03919091169063c9c6539690604401602060405180830381600087803b1580156113ab57600080fd5b505af11580156113bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e39190613846565b601e80546001600160a01b0319166001600160a01b0392909216919091179055611424565b601e80546001600160a01b0319166001600160a01b0383161790555b50601d80546001600160a01b0319166001600160a01b039290921691909117905550565b6000546001600160a01b031633146114725760405162461bcd60e51b8152600401610ce890613a92565b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b60006010548311156114ea5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610ce8565b8161150a5760006114fa84612905565b50949650610cb895505050505050565b600061151584612905565b50939650610cb895505050505050565b6000546001600160a01b0316331461154f5760405162461bcd60e51b8152600401610ce890613a92565b737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03821614156115cb5760405162461bcd60e51b815260206004820152602660248201527f57652063616e206e6f74206578636c7564652070616e63616b6573776170207260448201526537baba32b91760d11b6064820152608401610ce8565b6001600160a01b03811660009081526005602052604090205460ff16156116345760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610ce8565b6001600160a01b0381166000908152600160205260409020541561168e576001600160a01b03811660009081526001602052604090205461167490610dc1565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152600560205260408120805460ff191660019081179091556009805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0319169091179055565b6000546001600160a01b0316331461171e5760405162461bcd60e51b8152600401610ce890613a92565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461176a5760405162461bcd60e51b8152600401610ce890613a92565b600f5461177f90610d069060ff16600a613bf6565b601f5550565b6000546001600160a01b031633146117af5760405162461bcd60e51b8152600401610ce890613a92565b3347156117eb576040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015611043573d6000803e3d6000fd5b50565b600f5461180390610d069060ff16600a613bf6565b9050336118225760405162461bcd60e51b8152600401610ce890613ac7565b600081116118835760405162461bcd60e51b815260206004820152602860248201527f546f6b656e732076616c75652073686f756c642062652067726561746572207460448201526768656e205a65726f60c01b6064820152608401610ce8565b61188c33611a74565b8111156118fa5760405162461bcd60e51b815260206004820152603660248201527f546f6b656e732076616c75652073686f756c64206265206c657373207468656e60448201527520657175616c20746f20796f75722062616c616e636560501b6064820152608401610ce8565b600061190e6119076128d6565b8390612406565b3360009081526005602052604090205490915060ff161561195457336000908152600260205260409020546119439083612960565b336000908152600260205260409020555b3360009081526001602052604090205461196e9082612960565b3360009081526001602052604090205560105461198b9083612960565b60105560115461199b9082612960565b601155604051828152309033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6000546001600160a01b03163314611a045760405162461bcd60e51b8152600401610ce890613a92565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6000546001600160a01b03163314611a525760405162461bcd60e51b8152600401610ce890613a92565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526005602052604081205460ff1615611ab157506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610cb890610dc1565b6000546001600160a01b03163314611afd5760405162461bcd60e51b8152600401610ce890613a92565b611b07600061296c565b565b6000546001600160a01b03163314611b335760405162461bcd60e51b8152600401610ce890613a92565b610320811115611b9e5760405162461bcd60e51b815260206004820152603060248201527f43616e206f6e6c7920626c61636b6c697374203830302061646472657373657360448201526f103832b9103a3930b739b0b1ba34b7b760811b6064820152608401610ce8565b60005b81811015611c0e57600160066000858585818110611bc157611bc1613d59565b9050602002016020810190611bd69190613829565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055611c0781613d12565b9050611ba1565b505050565b6000546001600160a01b03163314611c3d5760405162461bcd60e51b8152600401610ce890613a92565b6019819055601754611c509082906122d6565b601b5550565b6060600e8054610c2490613cd7565b6000546001600160a01b03163314611c8f5760405162461bcd60e51b8152600401610ce890613a92565b610320811115611cfc5760405162461bcd60e51b815260206004820152603260248201527f43616e206f6e6c7920756e626c61636b6c69737420383030206164647265737360448201527132b9903832b9103a3930b739b0b1ba34b7b760711b6064820152608401610ce8565b60005b81811015611c0e57600060066000858585818110611d1f57611d1f613d59565b9050602002016020810190611d349190613829565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055611d6581613d12565b9050611cff565b6000610cb43384610d6d85604051806060016040528060258152602001613dbb602591393360009081526008602090815260408083206001600160a01b038d16845290915290205491906128aa565b6000610cb4338484612412565b6000546001600160a01b03163314611df25760405162461bcd60e51b8152600401610ce890613a92565b600f54611e0790610d069060ff16600a613bf6565b60215550565b6000546001600160a01b03163314611e375760405162461bcd60e51b8152600401610ce890613a92565b6001600160a01b03166000908152600360205260409020805460ff19169055565b6000546001600160a01b03163314611e825760405162461bcd60e51b8152600401610ce890613a92565b601e8054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990611ecf90831515815260200190565b60405180910390a150565b6000546001600160a01b03163314611f045760405162461bcd60e51b8152600401610ce890613a92565b6001600160a01b03811660009081526006602052604090205460ff16151560011415611f2d5750565b6001600160a01b0381166000908152600660205260409020805460ff1916600117905550565b6000546001600160a01b03163314611f7d5760405162461bcd60e51b8152600401610ce890613a92565b601355565b6000546001600160a01b03163314611fac5760405162461bcd60e51b8152600401610ce890613a92565b6040516370a0823160e01b815230600482015281906001600160a01b038516906370a082319060240160206040518083038186803b158015611fed57600080fd5b505afa158015612001573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202591906139d1565b10156120735760405162461bcd60e51b815260206004820152601e60248201527f57697468647261773a20496e73756666696369656e742062616c616e636500006044820152606401610ce8565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401602060405180830381600087803b1580156120bd57600080fd5b505af11580156120d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f5919061399b565b50505050565b6000546001600160a01b031633146121255760405162461bcd60e51b8152600401610ce890613a92565b6017819055601954611c5090826122d6565b6000546001600160a01b031633146121615760405162461bcd60e51b8152600401610ce890613a92565b6001600160a01b03166000908152600460205260409020805460ff19169055565b6000546001600160a01b031633146121ac5760405162461bcd60e51b8152600401610ce890613a92565b6001600160a01b03811660009081526006602052604090205460ff166121cf5750565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b0316331461221a5760405162461bcd60e51b8152600401610ce890613a92565b6001600160a01b03811661227f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ce8565b6117eb8161296c565b6000546001600160a01b031633146122b25760405162461bcd60e51b8152600401610ce890613a92565b6001600160a01b03166000908152600360205260409020805460ff19166001179055565b6000610e3e8284613b79565b6001600160a01b0383166123445760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ce8565b6001600160a01b0382166123a55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ce8565b6001600160a01b0383811660008181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610e3e8284613ca1565b6001600160a01b0383166124765760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ce8565b6001600160a01b0382166124d85760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610ce8565b6000811161253a5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610ce8565b6001600160a01b03821660009081526003602052604090205460ff168061257657506022548161256984611a74565b6125739190613b79565b11155b6125e85760405162461bcd60e51b815260206004820152603e60248201527f4d617820746f6b656e73206c696d697420666f722074686973206163636f756e60448201527f7420726561636865642e204f7220747279206c6f77657220616d6f756e7400006064820152608401610ce8565b6001600160a01b03831660009081526006602052604090205460ff16156126425760405162461bcd60e51b815260206004820152600e60248201526d165bdd48185c994818985b9b995960921b6044820152606401610ce8565b6001600160a01b03821660009081526006602052604090205460ff16156126ab5760405162461bcd60e51b815260206004820152601760248201527f54686520726563697069656e742069732062616e6e65640000000000000000006044820152606401610ce8565b601e546001600160a01b0384811691161415612744576001600160a01b03821660009081526007602052604090205460ff1661273f57601f5481111561273f5760405162461bcd60e51b815260206004820152602360248201527f42757920616d6f756e74206578636565647320746865206d61785478416d6f75604482015262373a1760e91b6064820152608401610ce8565b6127dd565b6001600160a01b03831660009081526007602052604090205460ff1615801561277a5750601e546001600160a01b038381169116145b156127dd576020548111156127dd5760405162461bcd60e51b8152602060048201526024808201527f53656c6c20616d6f756e74206578636565647320746865206d61785478416d6f6044820152633ab73a1760e11b6064820152608401610ce8565b60006127e830611a74565b602154909150811080159081906128095750601e54600160a01b900460ff16155b80156128235750601e546001600160a01b03868116911614155b80156128385750601e54600160a81b900460ff165b1561284b57602154915061284b826129bc565b6001600160a01b03851660009081526004602052604090205460019060ff168061288d57506001600160a01b03851660009081526004602052604090205460ff165b15612896575060005b6128a286868684612c58565b505050505050565b600081848411156128ce5760405162461bcd60e51b8152600401610ce89190613a3d565b505050900390565b60008060006128e3612de1565b90925090506128f282826128f9565b9250505090565b6000610e3e8284613b91565b600080600080600080600080600080600061291f8c612f63565b935093509350935060008060006129408f87868861293b6128d6565b612fb2565b919f509d509b509599509397509195509350505050919395979092949650565b6000610e3e8284613cc0565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b601e805460ff60a01b1916600160a01b1790556040516370a0823160e01b8152306004820152819073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489060009082906370a082319060240160206040518083038186803b158015612a2057600080fd5b505afa158015612a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a5891906139d1565b60175490915015612b31576000612a7a6017548661240690919063ffffffff16565b9050612a91601b54826128f990919063ffffffff16565b9050612a9d8582612960565b600a54909450612ab6906001600160a01b031682613014565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a082319060240160206040518083038186803b158015612af557600080fd5b505afa158015612b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2d91906139d1565b9150505b60195415612c45576000612b468460026128f9565b90506000612b548583612960565b9050612b603083613014565b6040516370a0823160e01b8152306004820152600090612be69085906001600160a01b038816906370a082319060240160206040518083038186803b158015612ba857600080fd5b505afa158015612bbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612be091906139d1565b90612960565b600c54909150612c00906001600160a01b031683836131c8565b60408051848152602081018390529081018390527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505b5050601e805460ff60a01b191690555050565b80612c6557612c6561333a565b6001600160a01b03841660009081526005602052604090205460ff168015612ca657506001600160a01b03831660009081526005602052604090205460ff16155b15612cbb57612cb68484846133ad565b612db9565b6001600160a01b03841660009081526005602052604090205460ff16158015612cfc57506001600160a01b03831660009081526005602052604090205460ff165b15612d0c57612cb68484846134f4565b6001600160a01b03841660009081526005602052604090205460ff16158015612d4e57506001600160a01b03831660009081526005602052604090205460ff16155b15612d5e57612cb68484846135b3565b6001600160a01b03841660009081526005602052604090205460ff168015612d9e57506001600160a01b03831660009081526005602052604090205460ff165b15612dae57612cb684848461360d565b612db98484846135b3565b806120f5576120f5601a54601955601454601355601854601755601654601555601c54601b55565b6011546010546000918291825b600954811015612f3357826001600060098481548110612e1057612e10613d59565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612e7b5750816002600060098481548110612e5457612e54613d59565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612e9157601154601054945094505050509091565b612ed76001600060098481548110612eab57612eab613d59565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612960565b9250612f1f6002600060098481548110612ef357612ef3613d59565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612960565b915080612f2b81613d12565b915050612dee565b50601054601154612f43916128f9565b821015612f5a576011546010549350935050509091565b90939092509050565b6000806000806000612f7486613696565b90506000612f81876136b9565b90506000612f8e886136d6565b90506000612fa283612be084818d89612960565b9993985091965094509092505050565b6000808080612fc18986612406565b90506000612fcf8987612406565b90506000612fdd8888612406565b90506000612feb8a89612406565b90506000612fff83612be084818989612960565b949d949c50929a509298505050505050505050565b6040805160038082526080820190925260009160208201606080368337019050509050308160008151811061304b5761304b613d59565b6001600160a01b03928316602091820292909201810191909152601d54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561309f57600080fd5b505afa1580156130b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130d79190613846565b816001815181106130ea576130ea613d59565b60200260200101906001600160a01b031690816001600160a01b03168152505073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488160028151811061313257613132613d59565b6001600160a01b039283166020918202929092010152601d5461315891309116846122e2565b601d54604051635c11d79560e01b81526001600160a01b0390911690635c11d79590613191908590600090869089904290600401613b08565b600060405180830381600087803b1580156131ab57600080fd5b505af11580156131bf573d6000803e3d6000fd5b50505050505050565b601d546131e09030906001600160a01b0316846122e2565b601d5460405163095ea7b360e01b81526001600160a01b0390911660048201526024810182905273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489063095ea7b390604401602060405180830381600087803b15801561324057600080fd5b505af1158015613254573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613278919061399b565b50601d5460405162e8e33760e81b815230600482015273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486024820152604481018490526064810183905260006084820181905260a48201526001600160a01b0385811660c48301524260e48301529091169063e8e337009061010401606060405180830381600087803b15801561330257600080fd5b505af1158015613316573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a29190613a0f565b601b5415801561334a5750601354155b80156133565750601954155b80156133625750601754155b801561336e5750601554155b1561337557565b60198054601a55601380546014556017805460185560158054601655601b8054601c5560009384905591839055829055918190559055565b60008060008060008060006133c188612905565b965096509650965096509650965061340788600260008d6001600160a01b03166001600160a01b031681526020019081526020016000205461296090919063ffffffff16565b6001600160a01b038b166000908152600260209081526040808320939093556001905220546134369088612960565b6001600160a01b03808c1660009081526001602052604080822093909355908b168152205461346590876122d6565b6001600160a01b038a166000908152600160205260409020556134888a836136f3565b6134918161377d565b61349b8584613805565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516134e091815260200190565b60405180910390a350505050505050505050565b600080600080600080600061350888612905565b965096509650965096509650965061354e87600160008d6001600160a01b03166001600160a01b031681526020019081526020016000205461296090919063ffffffff16565b6001600160a01b03808c16600090815260016020908152604080832094909455918c1681526002909152205461358490856122d6565b6001600160a01b038a1660009081526002602090815260408083209390935560019052205461346590876122d6565b60008060008060008060006135c788612905565b965096509650965096509650965061343687600160008d6001600160a01b03166001600160a01b031681526020019081526020016000205461296090919063ffffffff16565b600080600080600080600061362188612905565b965096509650965096509650965061366788600260008d6001600160a01b03166001600160a01b031681526020019081526020016000205461296090919063ffffffff16565b6001600160a01b038b1660009081526002602090815260408083209390935560019052205461354e9088612960565b6000610cb86103e86136b36015548561240690919063ffffffff16565b906128f9565b6000610cb86103e86136b36013548561240690919063ffffffff16565b6000610cb86103e86136b3601b548561240690919063ffffffff16565b8015611043576001600160a01b03821661371f5760405162461bcd60e51b8152600401610ce890613ac7565b60105461372c9082612960565b60105561374661373d6119076128d6565b60115490612960565b601155604051818152309033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016119ce565b60006137876128d6565b905060006137958383612406565b306000908152600160205260409020549091506137b290826122d6565b3060009081526001602090815260408083209390935560059052205460ff1615611c0e57306000908152600260205260409020546137f090846122d6565b30600090815260026020526040902055505050565b6011546138129083612960565b60115560125461382290826122d6565b6012555050565b60006020828403121561383b57600080fd5b8135610e3e81613d6f565b60006020828403121561385857600080fd5b8151610e3e81613d6f565b6000806040838503121561387657600080fd5b823561388181613d6f565b9150602083013561389181613d6f565b809150509250929050565b6000806000606084860312156138b157600080fd5b83356138bc81613d6f565b925060208401356138cc81613d6f565b929592945050506040919091013590565b600080604083850312156138f057600080fd5b82356138fb81613d6f565b946020939093013593505050565b6000806020838503121561391c57600080fd5b823567ffffffffffffffff8082111561393457600080fd5b818501915085601f83011261394857600080fd5b81358181111561395757600080fd5b8660208260051b850101111561396c57600080fd5b60209290920196919550909350505050565b60006020828403121561399057600080fd5b8135610e3e81613d84565b6000602082840312156139ad57600080fd5b8151610e3e81613d84565b6000602082840312156139ca57600080fd5b5035919050565b6000602082840312156139e357600080fd5b5051919050565b600080604083850312156139fd57600080fd5b82359150602083013561389181613d84565b600080600060608486031215613a2457600080fd5b8351925060208401519150604084015190509250925092565b600060208083528351808285015260005b81811015613a6a57858101830151858201604001528201613a4e565b81811115613a7c576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613b585784516001600160a01b031683529383019391830191600101613b33565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115613b8c57613b8c613d2d565b500190565b600082613bae57634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115613bee578160001904821115613bd457613bd4613d2d565b80851615613be157918102915b93841c9390800290613bb8565b509250929050565b6000610e3e60ff841683600082613c0f57506001610cb8565b81613c1c57506000610cb8565b8160018114613c325760028114613c3c57613c58565b6001915050610cb8565b60ff841115613c4d57613c4d613d2d565b50506001821b610cb8565b5060208310610133831016604e8410600b8410161715613c7b575081810a610cb8565b613c858383613bb3565b8060001904821115613c9957613c99613d2d565b029392505050565b6000816000190483118215151615613cbb57613cbb613d2d565b500290565b600082821015613cd257613cd2613d2d565b500390565b600181811c90821680613ceb57607f821691505b60208210811415613d0c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613d2657613d26613d2d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03811681146117eb57600080fd5b80151581146117eb57600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122050aacfb624c4ee676a8d53b3334f8453353c5bdc30a8f42dec1cbdb06fbd485364736f6c63430008070033

Deployed Bytecode Sourcemap

52725:28562:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57428:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58344:161;;;;;;;;;;-1:-1:-1;58344:161:0;;;;;:::i;:::-;;:::i;:::-;;;6496:14:1;;6489:22;6471:41;;6459:2;6444:18;58344:161:0;6331:187:1;63670:140:0;;;;;;;;;;-1:-1:-1;63670:140:0;;;;;:::i;:::-;;:::i;:::-;;57705:95;;;;;;;;;;-1:-1:-1;57785:7:0;;57705:95;;;16611:25:1;;;16599:2;16584:18;57705:95:0;16465:177:1;58517:314:0;;;;;;;;;;-1:-1:-1;58517:314:0;;;;;:::i;:::-;;:::i;63972:143::-;;;;;;;;;;-1:-1:-1;63972:143:0;;;;;:::i;:::-;;:::i;52952:57::-;;;;;;;;;;-1:-1:-1;52952:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;60434:253;;;;;;;;;;-1:-1:-1;60434:253:0;;;;;:::i;:::-;;:::i;62685:126::-;;;;;;;;;;-1:-1:-1;62685:126:0;;;;;:::i;:::-;;:::i;57614:83::-;;;;;;;;;;-1:-1:-1;57680:9:0;;57614:83;;57680:9;;;;18098:36:1;;18086:2;18071:18;57614:83:0;17956:184:1;54087:43:0;;;;;;;;;;;;;;;;61159:479;;;;;;;;;;-1:-1:-1;61159:479:0;;;;;:::i;:::-;;:::i;58843:218::-;;;;;;;;;;-1:-1:-1;58843:218:0;;;;;:::i;:::-;;:::i;63376:103::-;;;;;;;;;;-1:-1:-1;63376:103:0;;;;;:::i;:::-;;:::i;59594:378::-;;;;;;;;;;-1:-1:-1;59594:378:0;;;;;:::i;:::-;;:::i;80421:625::-;;;;;;;;;;-1:-1:-1;80421:625:0;;;;;:::i;:::-;;:::i;54202:44::-;;;;;;;;;;;;;;;;62300:111;;;;;;;;;;-1:-1:-1;62300:111:0;;;;;:::i;:::-;;:::i;59984:438::-;;;;;;;;;;-1:-1:-1;59984:438:0;;;;;:::i;:::-;;:::i;54754:84::-;;;;;;;;;;;;;;;;54695:46;;;;;;;;;;-1:-1:-1;54695:46:0;;;;-1:-1:-1;;;54695:46:0;;;;;;60699:448;;;;;;;;;;-1:-1:-1;60699:448:0;;;;;:::i;:::-;;:::i;64274:143::-;;;;;;;;;;-1:-1:-1;64274:143:0;;;;;:::i;:::-;;:::i;68793:123::-;;;;;;;;;;-1:-1:-1;68793:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;68881:27:0;68857:4;68881:27;;;:18;:27;;;;;;;;;68793:123;63822:138;;;;;;;;;;-1:-1:-1;63822:138:0;;;;;:::i;:::-;;:::i;59486:96::-;;;;;;;;;;-1:-1:-1;59564:10:0;;59486:96;;54936:76;;;;;;;;;;;;;;;;54320:44;;;;;;;;;;;;;;;;80126:209;;;;;;;;;;;;;:::i;79377:737::-;;;;;;;;;;-1:-1:-1;79377:737:0;;;;;:::i;:::-;;:::i;62545:128::-;;;;;;;;;;-1:-1:-1;62545:128:0;;;;;:::i;:::-;;:::i;64127:135::-;;;;;;;;;;-1:-1:-1;64127:135:0;;;;;:::i;:::-;;:::i;57808:198::-;;;;;;;;;;-1:-1:-1;57808:198:0;;;;;:::i;:::-;;:::i;10577:103::-;;;;;;;;;;;;;:::i;78428:300::-;;;;;;;;;;-1:-1:-1;78428:300:0;;;;;:::i;:::-;;:::i;59354:120::-;;;;;;;;;;-1:-1:-1;59354:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;59446:20:0;59422:4;59446:20;;;:11;:20;;;;;;;;;59354:120;55105:73;;;;;;;;;;;;55136:42;55105:73;;;;;-1:-1:-1;;;;;4710:32:1;;;4692:51;;4680:2;4665:18;55105:73:0;4546:203:1;9926:87:0;;;;;;;;;;-1:-1:-1;9972:7:0;9999:6;-1:-1:-1;;;;;9999:6:0;9926:87;;63491:167;;;;;;;;;;-1:-1:-1;63491:167:0;;;;;:::i;:::-;;:::i;57519:87::-;;;;;;;;;;;;;:::i;79064:305::-;;;;;;;;;;-1:-1:-1;79064:305:0;;;;;:::i;:::-;;:::i;59073:269::-;;;;;;;;;;-1:-1:-1;59073:269:0;;;;;:::i;:::-;;:::i;58014:167::-;;;;;;;;;;-1:-1:-1;58014:167:0;;;;;:::i;:::-;;:::i;68928:171::-;;;;;;;;;;-1:-1:-1;68928:171:0;;;;;:::i;:::-;;:::i;54628:26::-;;;;;;;;;;-1:-1:-1;54628:26:0;;;;-1:-1:-1;;;;;54628:26:0;;;53475:94;;;;;;;;;;-1:-1:-1;53475:94:0;;;;-1:-1:-1;;;;;53475:94:0;;;62959:122;;;;;;;;;;-1:-1:-1;62959:122:0;;;;;:::i;:::-;;:::i;53374:94::-;;;;;;;;;;-1:-1:-1;53374:94:0;;;;-1:-1:-1;;;;;53374:94:0;;;53978:43;;;;;;;;;;;;;;;;54584:37;;;;;;;;;;-1:-1:-1;54584:37:0;;;;-1:-1:-1;;;;;54584:37:0;;;64426:171;;;;;;;;;;-1:-1:-1;64426:171:0;;;;;:::i;:::-;;:::i;53576:44::-;;;;;;;;;;-1:-1:-1;53576:44:0;;;;-1:-1:-1;;;;;53576:44:0;;;78242:174;;;;;;;;;;-1:-1:-1;78242:174:0;;;;;:::i;:::-;;:::i;63093:94::-;;;;;;;;;;-1:-1:-1;63093:94:0;;;;;:::i;:::-;;:::i;81054:230::-;;;;;;;;;;-1:-1:-1;81054:230:0;;;;;:::i;:::-;;:::i;63199:165::-;;;;;;;;;;-1:-1:-1;63199:165:0;;;;;:::i;:::-;;:::i;58189:143::-;;;;;;;;;;-1:-1:-1;58189:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;58297:18:0;;;58270:7;58297:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;58189:143;62423:110;;;;;;;;;;-1:-1:-1;62423:110:0;;;;;:::i;:::-;;:::i;55019:77::-;;;;;;;;;;;;;;;;78871:181;;;;;;;;;;-1:-1:-1;78871:181:0;;;;;:::i;:::-;;:::i;10835:201::-;;;;;;;;;;-1:-1:-1;10835:201:0;;;;;:::i;:::-;;:::i;62823:124::-;;;;;;;;;;-1:-1:-1;62823:124:0;;;;;:::i;:::-;;:::i;54845:84::-;;;;;;;;;;;;;;;;78740:119;;;;;;;;;;-1:-1:-1;78740:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;78826:25:0;78803:4;78826:25;;;:14;:25;;;;;;;;;78740:119;57428:83;57465:13;57498:5;57491:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57428:83;:::o;58344:161::-;58419:4;58436:39;8729:10;58459:7;58468:6;58436:8;:39::i;:::-;-1:-1:-1;58493:4:0;58344:161;;;;;:::o;63670:140::-;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;;;;;;;;;63791:9:::1;::::0;63770:32:::1;::::0;63787:13:::1;::::0;63791:9:::1;;63787:2;:13;:::i;:::-;63770:11:::0;;:15:::1;:32::i;:::-;63751:16;:51:::0;-1:-1:-1;63670:140:0:o;58517:314::-;58615:4;58632:36;58642:6;58650:9;58661:6;58632:9;:36::i;:::-;58679:121;58688:6;8729:10;58710:89;58748:6;58710:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58710:19:0;;;;;;:11;:19;;;;;;;;8729:10;58710:33;;;;;;;;;;:37;:89::i;:::-;58679:8;:121::i;:::-;-1:-1:-1;58819:4:0;58517:314;;;;;:::o;63972:143::-;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;64096:9:::1;::::0;64077:30:::1;::::0;64092:13:::1;::::0;64096:9:::1;;64092:2;:13;:::i;64077:30::-;64054:20;:53:::0;-1:-1:-1;63972:143:0:o;60434:253::-;60500:7;60539;;60528;:18;;60520:73;;;;-1:-1:-1;;;60520:73:0;;7964:2:1;60520:73:0;;;7946:21:1;8003:2;7983:18;;;7976:30;8042:34;8022:18;;;8015:62;-1:-1:-1;;;8093:18:1;;;8086:40;8143:19;;60520:73:0;7762:406:1;60520:73:0;60604:19;60627:10;:8;:10::i;:::-;60604:33;-1:-1:-1;60655:24:0;:7;60604:33;60655:11;:24::i;:::-;60648:31;60434:253;-1:-1:-1;;;60434:253:0:o;62685:126::-;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;62760:35:0::1;62798:5;62760:35:::0;;;:26:::1;:35;::::0;;;;:43;;-1:-1:-1;;62760:43:0::1;::::0;;62685:126::o;61159:479::-;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;61241:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;61233:60;;;::::0;-1:-1:-1;;;61233:60:0;;9537:2:1;61233:60:0::1;::::0;::::1;9519:21:1::0;9576:2;9556:18;;;9549:30;9615:29;9595:18;;;9588:57;9662:18;;61233:60:0::1;9335:351:1::0;61233:60:0::1;61309:9;61304:327;61328:9;:16:::0;61324:20;::::1;61304:327;;;61386:7;-1:-1:-1::0;;;;;61370:23:0::1;:9;61380:1;61370:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;61370:12:0::1;:23;61366:254;;;61429:9;61439:16:::0;;:20:::1;::::0;61458:1:::1;::::0;61439:20:::1;:::i;:::-;61429:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;61414:9:::1;:12:::0;;-1:-1:-1;;;;;61429:31:0;;::::1;::::0;61424:1;;61414:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;61414:46:0::1;-1:-1:-1::0;;;;;61414:46:0;;::::1;;::::0;;61479:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;61518:11:::1;:20:::0;;;;:28;;-1:-1:-1;;61518:28:0::1;::::0;;61565:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;61565:15:0;;;;;-1:-1:-1;;;;;;61565:15:0::1;::::0;;;;;61304:327:::1;61159:479:::0;:::o;61366:254::-:1;61346:3:::0;::::1;::::0;::::1;:::i;:::-;;;;61304:327;;;;61159:479:::0;:::o;58843:218::-;8729:10;58931:4;58980:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;58980:34:0;;;;;;;;;;58931:4;;58948:83;;58971:7;;58980:50;;59019:10;58980:38;:50::i;63376:103::-;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;63451:14:::1;:20:::0;63376:103::o;59594:378::-;8729:10;59646:14;59695:19;;;:11;:19;;;;;;;;59694:20;59686:77;;;;-1:-1:-1;;;59686:77:0;;16254:2:1;59686:77:0;;;16236:21:1;16293:2;16273:18;;;16266:30;16332:34;16312:18;;;16305:62;-1:-1:-1;;;16383:18:1;;;16376:42;16435:19;;59686:77:0;16052:408:1;59686:77:0;59775:15;59800:19;59811:7;59800:10;:19::i;:::-;-1:-1:-1;;;;;;;;59848:15:0;;;;;;:7;:15;;;;;;59774:45;;-1:-1:-1;59848:28:0;;:15;-1:-1:-1;59774:45:0;;-1:-1:-1;;59848:19:0;:28::i;:::-;-1:-1:-1;;;;;59830:15:0;;;;;;:7;:15;;;;;:46;59897:7;;:20;;59909:7;59897:11;:20::i;:::-;59887:7;:30;59941:10;;:23;;59956:7;59941:14;:23::i;:::-;59928:10;:36;-1:-1:-1;;;59594:378:0:o;80421:625::-;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;80496:34:::1;80550:9;80496:64;;80695:15;80729:17;-1:-1:-1::0;;;;;80729:25:0::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80713:73;::::0;-1:-1:-1;;;80713:73:0;;80774:4:::1;80713:73;::::0;::::1;5190:34:1::0;55136:42:0::1;5240:18:1::0;;;5233:43;-1:-1:-1;;;;;80713:52:0;;;::::1;::::0;::::1;::::0;5125:18:1;;80713:73:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80695:91:::0;-1:-1:-1;;;;;;80801:21:0;::::1;80797:198;;80869:17;-1:-1:-1::0;;;;;80869:25:0::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80853:76;::::0;-1:-1:-1;;;80853:76:0;;80917:4:::1;80853:76;::::0;::::1;5190:34:1::0;55136:42:0::1;5240:18:1::0;;;5233:43;-1:-1:-1;;;;;80853:55:0;;;::::1;::::0;::::1;::::0;5125:18:1;;80853:76:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80839:11;:90:::0;;-1:-1:-1;;;;;;80839:90:0::1;-1:-1:-1::0;;;;;80839:90:0;;;::::1;::::0;;;::::1;::::0;;80797:198:::1;;;80962:11;:21:::0;;-1:-1:-1;;;;;;80962:21:0::1;-1:-1:-1::0;;;;;80962:21:0;::::1;;::::0;;80797:198:::1;-1:-1:-1::0;81005:13:0::1;:33:::0;;-1:-1:-1;;;;;;81005:33:0::1;-1:-1:-1::0;;;;;81005:33:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;80421:625:0:o;62300:111::-;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;62369:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;62369:34:0::1;62399:4;62369:34;::::0;;62300:111::o;59984:438::-;60074:7;60113;;60102;:18;;60094:62;;;;-1:-1:-1;;;60094:62:0;;10312:2:1;60094:62:0;;;10294:21:1;10351:2;10331:18;;;10324:30;10390:33;10370:18;;;10363:61;10441:18;;60094:62:0;10110:355:1;60094:62:0;60172:17;60167:248;;60207:15;60232:19;60243:7;60232:10;:19::i;:::-;-1:-1:-1;60206:45:0;;-1:-1:-1;60266:14:0;;-1:-1:-1;;;;;;60266:14:0;60167:248;60315:23;60347:19;60358:7;60347:10;:19::i;:::-;-1:-1:-1;60313:53:0;;-1:-1:-1;60381:22:0;;-1:-1:-1;;;;;;60381:22:0;60699:448;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;60792:42:::1;-1:-1:-1::0;;;;;60781:53:0;::::1;;;60773:104;;;::::0;-1:-1:-1;;;60773:104:0;;13856:2:1;60773:104:0::1;::::0;::::1;13838:21:1::0;13895:2;13875:18;;;13868:30;13934:34;13914:18;;;13907:62;-1:-1:-1;;;13985:18:1;;;13978:36;14031:19;;60773:104:0::1;13654:402:1::0;60773:104:0::1;-1:-1:-1::0;;;;;60897:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;60896:21;60888:61;;;::::0;-1:-1:-1;;;60888:61:0;;9537:2:1;60888:61:0::1;::::0;::::1;9519:21:1::0;9576:2;9556:18;;;9549:30;9615:29;9595:18;;;9588:57;9662:18;;60888:61:0::1;9335:351:1::0;60888:61:0::1;-1:-1:-1::0;;;;;60963:16:0;::::1;60982:1;60963:16:::0;;;:7:::1;:16;::::0;;;;;:20;60960:108:::1;;-1:-1:-1::0;;;;;61039:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;61019:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;61000:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;60960:108:::1;-1:-1:-1::0;;;;;61078:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;61078:27:0::1;61101:4;61078:27:::0;;::::1;::::0;;;61116:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;61116:23:0::1;::::0;;::::1;::::0;;60699:448::o;64274:143::-;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;64369:21:::1;:40:::0;;-1:-1:-1;;;;;;64369:40:0::1;-1:-1:-1::0;;;;;64369:40:0;;;::::1;::::0;;;::::1;::::0;;64274:143::o;63822:138::-;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;63941:9:::1;::::0;63920:32:::1;::::0;63937:13:::1;::::0;63941:9:::1;;63937:2;:13;:::i;63920:32::-;63902:15;:50:::0;-1:-1:-1;63822:138:0:o;80126:209::-;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;8729:10;80246:21:::1;:25:::0;80243:84:::1;;80286:41;::::0;-1:-1:-1;;;;;80286:18:0;::::1;::::0;80305:21:::1;80286:41:::0;::::1;;;::::0;::::1;::::0;;;80305:21;80286:18;:41;::::1;;;;;;;;;;;;;::::0;::::1;;;;80243:84;80172:163;80126:209::o:0;79377:737::-;79458:9;;79442:27;;79454:13;;79458:9;;79454:2;:13;:::i;79442:27::-;79433:36;-1:-1:-1;79488:10:0;79480:70;;;;-1:-1:-1;;;79480:70:0;;;;;;;:::i;:::-;79578:1;79569:6;:10;79561:63;;;;-1:-1:-1;;;79561:63:0;;11015:2:1;79561:63:0;;;10997:21:1;11054:2;11034:18;;;11027:30;11093:34;11073:18;;;11066:62;-1:-1:-1;;;11144:18:1;;;11137:38;11192:19;;79561:63:0;10813:404:1;79561:63:0;79653:21;79663:10;79653:9;:21::i;:::-;79643:6;:31;;79635:98;;;;-1:-1:-1;;;79635:98:0;;11424:2:1;79635:98:0;;;11406:21:1;11463:2;11443:18;;;11436:30;11502:34;11482:18;;;11475:62;-1:-1:-1;;;11553:18:1;;;11546:52;11615:19;;79635:98:0;11222:418:1;79635:98:0;79754:15;79772:22;79783:10;:8;:10::i;:::-;79772:6;;:10;:22::i;:::-;79820:10;79808:23;;;;:11;:23;;;;;;79754:40;;-1:-1:-1;79808:23:0;;79805:94;;;79876:10;79868:19;;;;:7;:19;;;;;;:31;;79892:6;79868:23;:31::i;:::-;79854:10;79846:19;;;;:7;:19;;;;;:53;79805:94;79940:10;79932:19;;;;:7;:19;;;;;;:32;;79956:7;79932:23;:32::i;:::-;79918:10;79910:19;;;;:7;:19;;;;;:54;79985:7;;:19;;79997:6;79985:11;:19::i;:::-;79975:7;:29;80025:7;;:20;;80037:7;80025:11;:20::i;:::-;80015:7;:30;80063:43;;16611:25:1;;;80092:4:0;;80072:10;;80063:43;;16599:2:1;16584:18;80063:43:0;;;;;;;;79422:692;79377:737;:::o;62545:128::-;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;62623:35:0::1;;::::0;;;:26:::1;:35;::::0;;;;:42;;-1:-1:-1;;62623:42:0::1;62661:4;62623:42;::::0;;62545:128::o;64127:135::-;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;64220:16:::1;:34:::0;;-1:-1:-1;;;;;;64220:34:0::1;-1:-1:-1::0;;;;;64220:34:0;;;::::1;::::0;;;::::1;::::0;;64127:135::o;57808:198::-;-1:-1:-1;;;;;57898:20:0;;57874:7;57898:20;;;:11;:20;;;;;;;;57894:49;;;-1:-1:-1;;;;;;57927:16:0;;;;;:7;:16;;;;;;;57808:198::o;57894:49::-;-1:-1:-1;;;;;57981:16:0;;;;;;:7;:16;;;;;;57961:37;;:19;:37::i;10577:103::-;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;10642:30:::1;10669:1;10642:18;:30::i;:::-;10577:103::o:0;78428:300::-;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;78549:3:::1;78529:23:::0;::::1;;78521:84;;;::::0;-1:-1:-1;;;78521:84:0;;15433:2:1;78521:84:0::1;::::0;::::1;15415:21:1::0;15472:2;15452:18;;;15445:30;15511:34;15491:18;;;15484:62;-1:-1:-1;;;15562:18:1;;;15555:46;15618:19;;78521:84:0::1;15231:412:1::0;78521:84:0::1;78621:9;78616:105;78632:20:::0;;::::1;78616:105;;;78705:4;78674:14;:28;78689:9;;78699:1;78689:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;78674:28:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;78674:28:0;:35;;-1:-1:-1;;78674:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;78654:3:::1;::::0;::::1;:::i;:::-;;;78616:105;;;;78428:300:::0;;:::o;63491:167::-;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;63568:13:::1;:19:::0;;;63637:12:::1;::::0;63619:31:::1;::::0;63584:3;;63619:17:::1;:31::i;:::-;63598:18;:52:::0;-1:-1:-1;63491:167:0:o;57519:87::-;57558:13;57591:7;57584:14;;;;;:::i;79064:305::-;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;79187:3:::1;79167:23:::0;::::1;;79159:86;;;::::0;-1:-1:-1;;;79159:86:0;;9893:2:1;79159:86:0::1;::::0;::::1;9875:21:1::0;9932:2;9912:18;;;9905:30;9971:34;9951:18;;;9944:62;-1:-1:-1;;;10022:18:1;;;10015:48;10080:19;;79159:86:0::1;9691:414:1::0;79159:86:0::1;79261:9;79256:106;79272:20:::0;;::::1;79256:106;;;79345:5;79314:14;:28;79329:9;;79339:1;79329:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;79314:28:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;79314:28:0;:36;;-1:-1:-1;;79314:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;79294:3:::1;::::0;::::1;:::i;:::-;;;79256:106;;59073:269:::0;59166:4;59183:129;8729:10;59206:7;59215:96;59254:15;59215:96;;;;;;;;;;;;;;;;;8729:10;59215:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;59215:34:0;;;;;;;;;;;;:38;:96::i;58014:167::-;58092:4;58109:42;8729:10;58133:9;58144:6;58109:9;:42::i;68928:171::-;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;69080:9:::1;::::0;69056:35:::1;::::0;69076:13:::1;::::0;69080:9:::1;;69076:2;:13;:::i;69056:35::-;69026:27;:65:::0;-1:-1:-1;68928:171:0:o;62959:122::-;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;63032:33:0::1;63068:5;63032:33:::0;;;:24:::1;:33;::::0;;;;:41;;-1:-1:-1;;63032:41:0::1;::::0;;62959:122::o;64426:171::-;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;64503:21:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;64503:32:0::1;-1:-1:-1::0;;;;64503:32:0;;::::1;;::::0;;64551:38:::1;::::0;::::1;::::0;::::1;::::0;64527:8;6496:14:1;6489:22;6471:41;;6459:2;6444:18;;6331:187;64551:38:0::1;;;;;;;;64426:171:::0;:::o;78242:174::-;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;78324:25:0;::::1;;::::0;;;:14:::1;:25;::::0;;;;;::::1;;:33;;:25:::0;:33:::1;78321:45;;;80172:163;80126:209::o:0;78321:45::-:1;-1:-1:-1::0;;;;;78376:25:0;::::1;;::::0;;;:14:::1;:25;::::0;;;;:32;;-1:-1:-1;;78376:32:0::1;78404:4;78376:32;::::0;;78242:174;:::o;63093:94::-;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;63165:8:::1;:14:::0;63093:94::o;81054:230::-;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;81157:30:::1;::::0;-1:-1:-1;;;81157:30:0;;81181:4:::1;81157:30;::::0;::::1;4692:51:1::0;81191:6:0;;-1:-1:-1;;;;;81157:15:0;::::1;::::0;::::1;::::0;4665:18:1;;81157:30:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;81149:83;;;::::0;-1:-1:-1;;;81149:83:0;;15074:2:1;81149:83:0::1;::::0;::::1;15056:21:1::0;15113:2;15093:18;;;15086:30;15152:32;15132:18;;;15125:60;15202:18;;81149:83:0::1;14872:354:1::0;81149:83:0::1;81243:33;::::0;-1:-1:-1;;;81243:33:0;;-1:-1:-1;;;;;6244:32:1;;;81243:33:0::1;::::0;::::1;6226:51:1::0;6293:18;;;6286:34;;;81243:14:0;::::1;::::0;::::1;::::0;6199:18:1;;81243:33:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;81054:230:::0;;;:::o;63199:165::-;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;63275:12:::1;:18:::0;;;63325:13:::1;::::0;:31:::1;::::0;63290:3;63325:17:::1;:31::i;62423:110::-:0;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;62490:27:0::1;62520:5;62490:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;62490:35:0::1;::::0;;62423:110::o;78871:181::-;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;78958:25:0;::::1;;::::0;;;:14:::1;:25;::::0;;;;;::::1;;78955:46;;80172:163;80126:209::o:0;78955:46::-:1;-1:-1:-1::0;;;;;79011:25:0::1;79039:5;79011:25:::0;;;:14:::1;:25;::::0;;;;:33;;-1:-1:-1;;79011:33:0::1;::::0;;78871:181::o;10835:201::-;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10924:22:0;::::1;10916:73;;;::::0;-1:-1:-1;;;10916:73:0;;8375:2:1;10916:73:0::1;::::0;::::1;8357:21:1::0;8414:2;8394:18;;;8387:30;8453:34;8433:18;;;8426:62;-1:-1:-1;;;8504:18:1;;;8497:36;8550:19;;10916:73:0::1;8173:402:1::0;10916:73:0::1;11000:28;11019:8;11000:18;:28::i;62823:124::-:0;9972:7;9999:6;-1:-1:-1;;;;;9999:6:0;8729:10;10146:23;10138:68;;;;-1:-1:-1;;;10138:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;62899:33:0::1;;::::0;;;:24:::1;:33;::::0;;;;:40;;-1:-1:-1;;62899:40:0::1;62935:4;62899:40;::::0;;62823:124::o;40460:98::-;40518:7;40545:5;40549:1;40545;:5;:::i;69111:337::-;-1:-1:-1;;;;;69204:19:0;;69196:68;;;;-1:-1:-1;;;69196:68:0;;14669:2:1;69196:68:0;;;14651:21:1;14708:2;14688:18;;;14681:30;14747:34;14727:18;;;14720:62;-1:-1:-1;;;14798:18:1;;;14791:34;14842:19;;69196:68:0;14467:400:1;69196:68:0;-1:-1:-1;;;;;69283:21:0;;69275:68;;;;-1:-1:-1;;;69275:68:0;;8782:2:1;69275:68:0;;;8764:21:1;8821:2;8801:18;;;8794:30;8860:34;8840:18;;;8833:62;-1:-1:-1;;;8911:18:1;;;8904:32;8953:19;;69275:68:0;8580:398:1;69275:68:0;-1:-1:-1;;;;;69356:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;69408:32;;16611:25:1;;;69408:32:0;;16584:18:1;69408:32:0;;;;;;;69111:337;;;:::o;41198:98::-;41256:7;41283:5;41287:1;41283;:5;:::i;69460:2228::-;-1:-1:-1;;;;;69582:18:0;;69574:68;;;;-1:-1:-1;;;69574:68:0;;14263:2:1;69574:68:0;;;14245:21:1;14302:2;14282:18;;;14275:30;14341:34;14321:18;;;14314:62;-1:-1:-1;;;14392:18:1;;;14385:35;14437:19;;69574:68:0;14061:401:1;69574:68:0;-1:-1:-1;;;;;69661:16:0;;69653:64;;;;-1:-1:-1;;;69653:64:0;;7560:2:1;69653:64:0;;;7542:21:1;7599:2;7579:18;;;7572:30;7638:34;7618:18;;;7611:62;-1:-1:-1;;;7689:18:1;;;7682:33;7732:19;;69653:64:0;7358:399:1;69653:64:0;69745:1;69736:6;:10;69728:64;;;;-1:-1:-1;;;69728:64:0;;12208:2:1;69728:64:0;;;12190:21:1;12247:2;12227:18;;;12220:30;12286:34;12266:18;;;12259:62;-1:-1:-1;;;12337:18:1;;;12330:39;12386:19;;69728:64:0;12006:405:1;69728:64:0;-1:-1:-1;;;;;69811:28:0;;;;;;:24;:28;;;;;;;;;:78;;;69869:20;;69859:6;69843:13;69853:2;69843:9;:13::i;:::-;:22;;;;:::i;:::-;:46;;69811:78;69803:162;;;;-1:-1:-1;;;69803:162:0;;12618:2:1;69803:162:0;;;12600:21:1;12657:2;12637:18;;;12630:30;12696:34;12676:18;;;12669:62;12767:32;12747:18;;;12740:60;12817:19;;69803:162:0;12416:426:1;69803:162:0;-1:-1:-1;;;;;69985:20:0;;;;;;:14;:20;;;;;;;;69984:21;69976:48;;;;-1:-1:-1;;;69976:48:0;;10672:2:1;69976:48:0;;;10654:21:1;10711:2;10691:18;;;10684:30;-1:-1:-1;;;10730:18:1;;;10723:44;10784:18;;69976:48:0;10470:338:1;69976:48:0;-1:-1:-1;;;;;70044:18:0;;;;;;:14;:18;;;;;;;;70043:19;70035:55;;;;-1:-1:-1;;;70035:55:0;;9185:2:1;70035:55:0;;;9167:21:1;9224:2;9204:18;;;9197:30;9263:25;9243:18;;;9236:53;9306:18;;70035:55:0;8983:347:1;70035:55:0;70112:11;;-1:-1:-1;;;;;70104:19:0;;;70112:11;;70104:19;70101:377;;;-1:-1:-1;;;;;70153:30:0;;;;;;:26;:30;;;;;;;;70149:126;;70220:15;;70210:6;:25;;70202:73;;;;-1:-1:-1;;;70202:73:0;;15850:2:1;70202:73:0;;;15832:21:1;15889:2;15869:18;;;15862:30;15928:34;15908:18;;;15901:62;-1:-1:-1;;;15979:18:1;;;15972:33;16022:19;;70202:73:0;15648:399:1;70202:73:0;70101:377;;;-1:-1:-1;;;;;70312:32:0;;;;;;:26;:32;;;;;;;;70311:33;:54;;;;-1:-1:-1;70354:11:0;;-1:-1:-1;;;;;70348:17:0;;;70354:11;;70348:17;70311:54;70308:170;;;70409:16;;70399:6;:26;;70391:75;;;;-1:-1:-1;;;70391:75:0;;13451:2:1;70391:75:0;;;13433:21:1;13490:2;13470:18;;;13463:30;13529:34;13509:18;;;13502:62;-1:-1:-1;;;13580:18:1;;;13573:34;13624:19;;70391:75:0;13249:400:1;70391:75:0;70776:28;70807:24;70825:4;70807:9;:24::i;:::-;70903:27;;70776:55;;-1:-1:-1;70879:51:0;;;;;;;70959:53;;-1:-1:-1;70996:16:0;;-1:-1:-1;;;70996:16:0;;;;70995:17;70959:53;:89;;;;-1:-1:-1;71037:11:0;;-1:-1:-1;;;;;71029:19:0;;;71037:11;;71029:19;;70959:89;:127;;;;-1:-1:-1;71065:21:0;;-1:-1:-1;;;71065:21:0;;;;70959:127;70941:314;;;71136:27;;71113:50;;71207:36;71222:20;71207:14;:36::i;:::-;-1:-1:-1;;;;;71463:24:0;;71336:12;71463:24;;;:18;:24;;;;;;71351:4;;71463:24;;;:50;;-1:-1:-1;;;;;;71491:22:0;;;;;;:18;:22;;;;;;;;71463:50;71460:96;;;-1:-1:-1;71539:5:0;71460:96;71642:38;71657:4;71662:2;71665:6;71672:7;71642:14;:38::i;:::-;69563:2125;;;69460:2228;;;:::o;42739:240::-;42859:7;42920:12;42912:6;;;;42904:29;;;;-1:-1:-1;;;42904:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;42955:5:0;;;42739:240::o;66211:163::-;66252:7;66273:15;66290;66309:19;:17;:19::i;:::-;66272:56;;-1:-1:-1;66272:56:0;-1:-1:-1;66346:20:0;66272:56;;66346:11;:20::i;:::-;66339:27;;;;66211:163;:::o;41597:98::-;41655:7;41682:5;41686:1;41682;:5;:::i;64806:454::-;64865:7;64874;64883;64892;64901;64910;64919;64940:23;64965:12;64979;64993:18;65015:20;65027:7;65015:11;:20::i;:::-;64939:96;;;;;;;;65047:15;65064:23;65089:12;65105:56;65117:7;65126:4;65132:10;65144:4;65150:10;:8;:10::i;:::-;65105:11;:56::i;:::-;65046:115;;-1:-1:-1;65046:115:0;-1:-1:-1;65046:115:0;-1:-1:-1;65212:15:0;;-1:-1:-1;65229:4:0;;-1:-1:-1;65235:4:0;;-1:-1:-1;65241:10:0;-1:-1:-1;;;;64806:454:0;;;;;;;;;:::o;40841:98::-;40899:7;40926:5;40930:1;40926;:5;:::i;11196:191::-;11270:16;11289:6;;-1:-1:-1;;;;;11306:17:0;;;-1:-1:-1;;;;;;11306:17:0;;;;;;11339:40;;11289:6;;;;;;;11339:40;;11270:16;11339:40;11259:128;11196:191;:::o;71700:1905::-;55503:16;:23;;-1:-1:-1;;;;55503:23:0;-1:-1:-1;;;55503:23:0;;;72017:37:::1;::::0;-1:-1:-1;;;72017:37:0;;72048:4:::1;72017:37;::::0;::::1;4692:51:1::0;71864:12:0;;55136:42:::1;::::0;-1:-1:-1;;55136:42:0;;72017:22:::1;::::0;4665:18:1;;72017:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72072:12;::::0;71992:62;;-1:-1:-1;72072:16:0;72069:492:::1;;72114:22;72139:30;72156:12;;72139;:16;;:30;;;;:::i;:::-;72114:55;;72201:38;72220:18;;72201:14;:18;;:38;;;;:::i;:::-;72184:55:::0;-1:-1:-1;72272:32:0::1;:12:::0;72184:55;72272:16:::1;:32::i;:::-;72447:16;::::0;72254:50;;-1:-1:-1;72429:51:0::1;::::0;-1:-1:-1;;;;;72447:16:0::1;72465:14:::0;72429:17:::1;:51::i;:::-;72512:37;::::0;-1:-1:-1;;;72512:37:0;;72543:4:::1;72512:37;::::0;::::1;4692:51:1::0;-1:-1:-1;;;;;72512:22:0;::::1;::::0;::::1;::::0;4665:18:1;;72512:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72495:54;;72099:462;72069:492;72584:13;::::0;:17;72581:1017:::1;;72689:12;72704:22;:15:::0;72724:1:::1;72704:19;:22::i;:::-;72689:37:::0;-1:-1:-1;72741:17:0::1;72761:25;:15:::0;72689:37;72761:19:::1;:25::i;:::-;72741:45;;73192:38;73218:4;73225;73192:17;:38::i;:::-;73332:37;::::0;-1:-1:-1;;;73332:37:0;;73363:4:::1;73332:37;::::0;::::1;4692:51:1::0;73311:18:0::1;::::0;73332:57:::1;::::0;73374:14;;-1:-1:-1;;;;;73332:22:0;::::1;::::0;::::1;::::0;4665:18:1;;73332:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41:::0;::::1;:57::i;:::-;73464:21;::::0;73311:78;;-1:-1:-1;73451:58:0::1;::::0;-1:-1:-1;;;;;73464:21:0::1;73487:9:::0;73311:78;73451:12:::1;:58::i;:::-;73543:43;::::0;;17834:25:1;;;17890:2;17875:18;;17868:34;;;17918:18;;;17911:34;;;73543:43:0::1;::::0;17822:2:1;17807:18;73543:43:0::1;;;;;;;72612:986;;;72581:1017;-1:-1:-1::0;;55549:16:0;:24;;-1:-1:-1;;;;55549:24:0;;;-1:-1:-1;;71700:1905:0:o;74890:834::-;75001:7;74997:40;;75023:14;:12;:14::i;:::-;-1:-1:-1;;;;;75062:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;75086:22:0;;;;;;:11;:22;;;;;;;;75085:23;75062:46;75058:597;;;75125:48;75147:6;75155:9;75166:6;75125:21;:48::i;:::-;75058:597;;;-1:-1:-1;;;;;75196:19:0;;;;;;:11;:19;;;;;;;;75195:20;:46;;;;-1:-1:-1;;;;;;75219:22:0;;;;;;:11;:22;;;;;;;;75195:46;75191:464;;;75258:46;75278:6;75286:9;75297:6;75258:19;:46::i;75191:464::-;-1:-1:-1;;;;;75327:19:0;;;;;;:11;:19;;;;;;;;75326:20;:47;;;;-1:-1:-1;;;;;;75351:22:0;;;;;;:11;:22;;;;;;;;75350:23;75326:47;75322:333;;;75390:44;75408:6;75416:9;75427:6;75390:17;:44::i;75322:333::-;-1:-1:-1;;;;;75456:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;75479:22:0;;;;;;:11;:22;;;;;;;;75456:45;75452:203;;;75518:48;75540:6;75548:9;75559:6;75518:21;:48::i;75452:203::-;75599:44;75617:6;75625:9;75636:6;75599:17;:44::i;:::-;75679:7;75675:41;;75701:15;68540:21;;68518:13;:43;68594:16;;68572:8;:38;68643:20;;68621:12;:42;68696:22;;68674:14;:44;68751:22;;68729:18;:44;68474:307;66386:561;66483:7;;66519;;66436;;;;;66543:289;66567:9;:16;66563:20;;66543:289;;;66633:7;66609;:21;66617:9;66627:1;66617:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;66617:12:0;66609:21;;;;;;;;;;;;;:31;;:66;;;66668:7;66644;:21;66652:9;66662:1;66652:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;66652:12:0;66644:21;;;;;;;;;;;;;:31;66609:66;66605:97;;;66685:7;;66694;;66677:25;;;;;;;66386:561;;:::o;66605:97::-;66727:34;66739:7;:21;66747:9;66757:1;66747:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;66747:12:0;66739:21;;;;;;;;;;;;;66727:7;;:11;:34::i;:::-;66717:44;;66786:34;66798:7;:21;66806:9;66816:1;66806:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;66806:12:0;66798:21;;;;;;;;;;;;;66786:7;;:11;:34::i;:::-;66776:44;-1:-1:-1;66585:3:0;;;;:::i;:::-;;;;66543:289;;;-1:-1:-1;66868:7:0;;66856;;:20;;:11;:20::i;:::-;66846:7;:30;66842:61;;;66886:7;;66895;;66878:25;;;;;;66386:561;;:::o;66842:61::-;66922:7;;66931;;-1:-1:-1;66386:561:0;-1:-1:-1;66386:561:0:o;65272:413::-;65332:7;65341;65350;65359;65379:12;65394:31;65417:7;65394:22;:31::i;:::-;65379:46;;65436:12;65451:25;65468:7;65451:16;:25::i;:::-;65436:40;;65487:18;65508:30;65530:7;65508:21;:30::i;:::-;65487:51;-1:-1:-1;65549:23:0;65575:43;65613:4;65575:33;65487:51;65575:33;:7;65587:4;65575:11;:17::i;:43::-;65549:69;65654:4;;-1:-1:-1;65660:4:0;;-1:-1:-1;65660:4:0;-1:-1:-1;65272:413:0;;-1:-1:-1;;;65272:413:0:o;65697:502::-;65826:7;;;;65882:24;:7;65894:11;65882;:24::i;:::-;65864:42;-1:-1:-1;65917:12:0;65932:21;:4;65941:11;65932:8;:21::i;:::-;65917:36;-1:-1:-1;65964:13:0;65980:21;:4;65989:11;65980:8;:21::i;:::-;65964:37;-1:-1:-1;66012:18:0;66033:27;:10;66048:11;66033:14;:27::i;:::-;66012:48;-1:-1:-1;66071:23:0;66097:44;66135:5;66097:33;66012:48;66097:33;:7;66109:4;66097:11;:17::i;:44::-;66160:7;;;;-1:-1:-1;66186:4:0;;-1:-1:-1;65697:502:0;;-1:-1:-1;;;;;;;;;65697:502:0:o;73613:632::-;73787:16;;;73801:1;73787:16;;;;;;;;;73763:21;;73787:16;;;;;;;;;;-1:-1:-1;73787:16:0;73763:40;;73832:4;73814;73819:1;73814:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;73814:23:0;;;:7;;;;;;;;;;:23;;;;73858:13;;:20;;;-1:-1:-1;;;73858:20:0;;;;:13;;;;;:18;;:20;;;;;73814:7;;73858:20;;;;;:13;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73848:4;73853:1;73848:7;;;;;;;;:::i;:::-;;;;;;:30;-1:-1:-1;;;;;73848:30:0;;;-1:-1:-1;;;;;73848:30:0;;;;;55136:42;73889:4;73894:1;73889:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;73889:14:0;;;:7;;;;;;;;;:14;73948:13;;73916:60;;73933:4;;73948:13;73964:11;73916:8;:60::i;:::-;74015:13;;:222;;-1:-1:-1;;;74015:222:0;;-1:-1:-1;;;;;74015:13:0;;;;:67;;:222;;74097:11;;74015:13;;74168:4;;74187:9;;74211:15;;74015:222;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73688:557;73613:632;;:::o;74257:621::-;74457:13;;74425:60;;74442:4;;-1:-1:-1;;;;;74457:13:0;74473:11;74425:8;:60::i;:::-;74525:13;;74496:56;;-1:-1:-1;;;74496:56:0;;-1:-1:-1;;;;;74525:13:0;;;74496:56;;;6226:51:1;6293:18;;;6286:34;;;55136:42:0;;74496:20;;6199:18:1;;74496:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;74595:13:0;;:275;;-1:-1:-1;;;74595:275:0;;74644:4;74595:275;;;5684:34:1;55136:42:0;5734:18:1;;;5727:43;5786:18;;;5779:34;;;5829:18;;;5822:34;;;74595:13:0;5872:19:1;;;5865:35;;;5916:19;;;5909:35;-1:-1:-1;;;;;5981:15:1;;;5960:19;;;5953:44;74844:15:0;6013:19:1;;;6006:35;74595:13:0;;;;:26;;5618:19:1;;74595:275:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;67857:605::-;67903:18;;:23;:40;;;;-1:-1:-1;67930:8:0;;:13;67903:40;:62;;;;-1:-1:-1;67947:13:0;;:18;67903:62;:95;;;;-1:-1:-1;67981:12:0;;:17;67903:95;:118;;;;-1:-1:-1;68002:14:0;;:19;67903:118;67900:131;;;67857:605::o;67900:131::-;68077:13;;;68051:21;:39;68128:8;;;68102:16;:34;68173:12;;;68147:20;:38;68222:14;;;68196:22;:40;68273:18;;;68247:22;:44;-1:-1:-1;68312:19:0;;;;68342;;;;68372;;;68402;;;;68432:22;;67857:605::o;75736:609::-;75839:15;75856:23;75881:12;75895:23;75920:12;75934;75948:18;75970:19;75981:7;75970:10;:19::i;:::-;75838:151;;;;;;;;;;;;;;76018:28;76038:7;76018;:15;76026:6;-1:-1:-1;;;;;76018:15:0;-1:-1:-1;;;;;76018:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;76000:15:0;;;;;;:7;:15;;;;;;;;:46;;;;76075:7;:15;;;;:28;;76095:7;76075:19;:28::i;:::-;-1:-1:-1;;;;;76057:15:0;;;;;;;:7;:15;;;;;;:46;;;;76135:18;;;;;;;:39;;76158:15;76135:22;:39::i;:::-;-1:-1:-1;;;;;76114:18:0;;;;;;:7;:18;;;;;:60;76187:19;76193:6;76201:4;76187:5;:19::i;:::-;76217:26;76232:10;76217:14;:26::i;:::-;76254:23;76266:4;76272;76254:11;:23::i;:::-;76310:9;-1:-1:-1;;;;;76293:44:0;76302:6;-1:-1:-1;;;;;76293:44:0;;76321:15;76293:44;;;;16611:25:1;;16599:2;16584:18;;16465:177;76293:44:0;;;;;;;;75827:518;;;;;;;75736:609;;;:::o;76357:621::-;76458:15;76475:23;76500:12;76514:23;76539:12;76553;76567:18;76589:19;76600:7;76589:10;:19::i;:::-;76457:151;;;;;;;;;;;;;;76637:28;76657:7;76637;:15;76645:6;-1:-1:-1;;;;;76637:15:0;-1:-1:-1;;;;;76637:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;76619:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;76697:18;;;;;:7;:18;;;;;:39;;76720:15;76697:22;:39::i;:::-;-1:-1:-1;;;;;76676:18:0;;;;;;:7;:18;;;;;;;;:60;;;;76768:7;:18;;;;:39;;76791:15;76768:22;:39::i;76990:548::-;77089:15;77106:23;77131:12;77145:23;77170:12;77184;77198:18;77220:19;77231:7;77220:10;:19::i;:::-;77088:151;;;;;;;;;;;;;;77268:28;77288:7;77268;:15;77276:6;-1:-1:-1;;;;;77268:15:0;-1:-1:-1;;;;;77268:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;77550:680::-;77653:15;77670:23;77695:12;77709:23;77734:12;77748;77762:18;77784:19;77795:7;77784:10;:19::i;:::-;77652:151;;;;;;;;;;;;;;77832:28;77852:7;77832;:15;77840:6;-1:-1:-1;;;;;77832:15:0;-1:-1:-1;;;;;77832:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;77814:15:0;;;;;;:7;:15;;;;;;;;:46;;;;77889:7;:15;;;;:28;;77909:7;77889:19;:28::i;67494:168::-;67565:7;67592:62;67638:5;67592:27;67604:14;;67592:7;:11;;:27;;;;:::i;:::-;:31;;:62::i;67326:156::-;67391:7;67418:56;67458:5;67418:21;67430:8;;67418:7;:11;;:21;;;;:::i;67674:171::-;67744:7;67771:66;67821:5;67771:31;67783:18;;67771:7;:11;;:31;;;;:::i;61650:638::-;61721:10;;61718:563;;-1:-1:-1;;;;;61813:21:0;;61805:67;;;;-1:-1:-1;;;61805:67:0;;;;;;;:::i;:::-;62113:7;;:19;;62125:6;62113:11;:19::i;:::-;62103:7;:29;62157:35;62169:22;62180:10;:8;:10::i;62169:22::-;62157:7;;;:11;:35::i;:::-;62147:7;:45;62226:43;;16611:25:1;;;62255:4:0;;62235:10;;62226:43;;16599:2:1;16584:18;62226:43:0;16465:177:1;66959:355:0;67022:19;67045:10;:8;:10::i;:::-;67022:33;-1:-1:-1;67066:18:0;67087:27;:10;67022:33;67087:14;:27::i;:::-;67166:4;67150:22;;;;:7;:22;;;;;;67066:48;;-1:-1:-1;67150:38:0;;67066:48;67150:26;:38::i;:::-;67141:4;67125:22;;;;:7;:22;;;;;;;;:63;;;;67202:11;:26;;;;;;67199:107;;;67284:4;67268:22;;;;:7;:22;;;;;;:38;;67295:10;67268:26;:38::i;:::-;67259:4;67243:22;;;;:7;:22;;;;;:63;67011:303;;66959:355;:::o;64647:147::-;64725:7;;:17;;64737:4;64725:11;:17::i;:::-;64715:7;:27;64766:10;;:20;;64781:4;64766:14;:20::i;:::-;64753:10;:33;-1:-1:-1;;64647:147:0:o;14:247:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456:31;:::i;782:388::-;850:6;858;911:2;899:9;890:7;886:23;882:32;879:52;;;927:1;924;917:12;879:52;966:9;953:23;985:31;1010:5;985:31;:::i;:::-;1035:5;-1:-1:-1;1092:2:1;1077:18;;1064:32;1105:33;1064:32;1105:33;:::i;:::-;1157:7;1147:17;;;782:388;;;;;:::o;1175:456::-;1252:6;1260;1268;1321:2;1309:9;1300:7;1296:23;1292:32;1289:52;;;1337:1;1334;1327:12;1289:52;1376:9;1363:23;1395:31;1420:5;1395:31;:::i;:::-;1445:5;-1:-1:-1;1502:2:1;1487:18;;1474:32;1515:33;1474:32;1515:33;:::i;:::-;1175:456;;1567:7;;-1:-1:-1;;;1621:2:1;1606:18;;;;1593:32;;1175:456::o;1636:315::-;1704:6;1712;1765:2;1753:9;1744:7;1740:23;1736:32;1733:52;;;1781:1;1778;1771:12;1733:52;1820:9;1807:23;1839:31;1864:5;1839:31;:::i;:::-;1889:5;1941:2;1926:18;;;;1913:32;;-1:-1:-1;;;1636:315:1:o;1956:615::-;2042:6;2050;2103:2;2091:9;2082:7;2078:23;2074:32;2071:52;;;2119:1;2116;2109:12;2071:52;2159:9;2146:23;2188:18;2229:2;2221:6;2218:14;2215:34;;;2245:1;2242;2235:12;2215:34;2283:6;2272:9;2268:22;2258:32;;2328:7;2321:4;2317:2;2313:13;2309:27;2299:55;;2350:1;2347;2340:12;2299:55;2390:2;2377:16;2416:2;2408:6;2405:14;2402:34;;;2432:1;2429;2422:12;2402:34;2485:7;2480:2;2470:6;2467:1;2463:14;2459:2;2455:23;2451:32;2448:45;2445:65;;;2506:1;2503;2496:12;2445:65;2537:2;2529:11;;;;;2559:6;;-1:-1:-1;1956:615:1;;-1:-1:-1;;;;1956:615:1:o;2576:241::-;2632:6;2685:2;2673:9;2664:7;2660:23;2656:32;2653:52;;;2701:1;2698;2691:12;2653:52;2740:9;2727:23;2759:28;2781:5;2759:28;:::i;2822:245::-;2889:6;2942:2;2930:9;2921:7;2917:23;2913:32;2910:52;;;2958:1;2955;2948:12;2910:52;2990:9;2984:16;3009:28;3031:5;3009:28;:::i;3547:180::-;3606:6;3659:2;3647:9;3638:7;3634:23;3630:32;3627:52;;;3675:1;3672;3665:12;3627:52;-1:-1:-1;3698:23:1;;3547:180;-1:-1:-1;3547:180:1:o;3732:184::-;3802:6;3855:2;3843:9;3834:7;3830:23;3826:32;3823:52;;;3871:1;3868;3861:12;3823:52;-1:-1:-1;3894:16:1;;3732:184;-1:-1:-1;3732:184:1:o;3921:309::-;3986:6;3994;4047:2;4035:9;4026:7;4022:23;4018:32;4015:52;;;4063:1;4060;4053:12;4015:52;4099:9;4086:23;4076:33;;4159:2;4148:9;4144:18;4131:32;4172:28;4194:5;4172:28;:::i;4235:306::-;4323:6;4331;4339;4392:2;4380:9;4371:7;4367:23;4363:32;4360:52;;;4408:1;4405;4398:12;4360:52;4437:9;4431:16;4421:26;;4487:2;4476:9;4472:18;4466:25;4456:35;;4531:2;4520:9;4516:18;4510:25;4500:35;;4235:306;;;;;:::o;6756:597::-;6868:4;6897:2;6926;6915:9;6908:21;6958:6;6952:13;7001:6;6996:2;6985:9;6981:18;6974:34;7026:1;7036:140;7050:6;7047:1;7044:13;7036:140;;;7145:14;;;7141:23;;7135:30;7111:17;;;7130:2;7107:26;7100:66;7065:10;;7036:140;;;7194:6;7191:1;7188:13;7185:91;;;7264:1;7259:2;7250:6;7239:9;7235:22;7231:31;7224:42;7185:91;-1:-1:-1;7337:2:1;7316:15;-1:-1:-1;;7312:29:1;7297:45;;;;7344:2;7293:54;;6756:597;-1:-1:-1;;;6756:597:1:o;11645:356::-;11847:2;11829:21;;;11866:18;;;11859:30;11925:34;11920:2;11905:18;;11898:62;11992:2;11977:18;;11645:356::o;12847:397::-;13049:2;13031:21;;;13088:2;13068:18;;;13061:30;13127:34;13122:2;13107:18;;13100:62;-1:-1:-1;;;13193:2:1;13178:18;;13171:31;13234:3;13219:19;;12847:397::o;16647:980::-;16909:4;16957:3;16946:9;16942:19;16988:6;16977:9;16970:25;17014:2;17052:6;17047:2;17036:9;17032:18;17025:34;17095:3;17090:2;17079:9;17075:18;17068:31;17119:6;17154;17148:13;17185:6;17177;17170:22;17223:3;17212:9;17208:19;17201:26;;17262:2;17254:6;17250:15;17236:29;;17283:1;17293:195;17307:6;17304:1;17301:13;17293:195;;;17372:13;;-1:-1:-1;;;;;17368:39:1;17356:52;;17463:15;;;;17428:12;;;;17404:1;17322:9;17293:195;;;-1:-1:-1;;;;;;;17544:32:1;;;;17539:2;17524:18;;17517:60;-1:-1:-1;;;17608:3:1;17593:19;17586:35;17505:3;16647:980;-1:-1:-1;;;16647:980:1:o;18145:128::-;18185:3;18216:1;18212:6;18209:1;18206:13;18203:39;;;18222:18;;:::i;:::-;-1:-1:-1;18258:9:1;;18145:128::o;18278:217::-;18318:1;18344;18334:132;;18388:10;18383:3;18379:20;18376:1;18369:31;18423:4;18420:1;18413:15;18451:4;18448:1;18441:15;18334:132;-1:-1:-1;18480:9:1;;18278:217::o;18500:422::-;18589:1;18632:5;18589:1;18646:270;18667:7;18657:8;18654:21;18646:270;;;18726:4;18722:1;18718:6;18714:17;18708:4;18705:27;18702:53;;;18735:18;;:::i;:::-;18785:7;18775:8;18771:22;18768:55;;;18805:16;;;;18768:55;18884:22;;;;18844:15;;;;18646:270;;;18650:3;18500:422;;;;;:::o;18927:140::-;18985:5;19014:47;19055:4;19045:8;19041:19;19035:4;19121:5;19151:8;19141:80;;-1:-1:-1;19192:1:1;19206:5;;19141:80;19240:4;19230:76;;-1:-1:-1;19277:1:1;19291:5;;19230:76;19322:4;19340:1;19335:59;;;;19408:1;19403:130;;;;19315:218;;19335:59;19365:1;19356:10;;19379:5;;;19403:130;19440:3;19430:8;19427:17;19424:43;;;19447:18;;:::i;:::-;-1:-1:-1;;19503:1:1;19489:16;;19518:5;;19315:218;;19617:2;19607:8;19604:16;19598:3;19592:4;19589:13;19585:36;19579:2;19569:8;19566:16;19561:2;19555:4;19552:12;19548:35;19545:77;19542:159;;;-1:-1:-1;19654:19:1;;;19686:5;;19542:159;19733:34;19758:8;19752:4;19733:34;:::i;:::-;19803:6;19799:1;19795:6;19791:19;19782:7;19779:32;19776:58;;;19814:18;;:::i;:::-;19852:20;;19072:806;-1:-1:-1;;;19072:806:1:o;19883:168::-;19923:7;19989:1;19985;19981:6;19977:14;19974:1;19971:21;19966:1;19959:9;19952:17;19948:45;19945:71;;;19996:18;;:::i;:::-;-1:-1:-1;20036:9:1;;19883:168::o;20056:125::-;20096:4;20124:1;20121;20118:8;20115:34;;;20129:18;;:::i;:::-;-1:-1:-1;20166:9:1;;20056:125::o;20186:380::-;20265:1;20261:12;;;;20308;;;20329:61;;20383:4;20375:6;20371:17;20361:27;;20329:61;20436:2;20428:6;20425:14;20405:18;20402:38;20399:161;;;20482:10;20477:3;20473:20;20470:1;20463:31;20517:4;20514:1;20507:15;20545:4;20542:1;20535:15;20399:161;;20186:380;;;:::o;20571:135::-;20610:3;-1:-1:-1;;20631:17:1;;20628:43;;;20651:18;;:::i;:::-;-1:-1:-1;20698:1:1;20687:13;;20571:135::o;20711:127::-;20772:10;20767:3;20763:20;20760:1;20753:31;20803:4;20800:1;20793:15;20827:4;20824:1;20817:15;20843:127;20904:10;20899:3;20895:20;20892:1;20885:31;20935:4;20932:1;20925:15;20959:4;20956:1;20949:15;20975:127;21036:10;21031:3;21027:20;21024:1;21017:31;21067:4;21064:1;21057:15;21091:4;21088:1;21081:15;21239:131;-1:-1:-1;;;;;21314:31:1;;21304:42;;21294:70;;21360:1;21357;21350:12;21375:118;21461:5;21454:13;21447:21;21440:5;21437:32;21427:60;;21483:1;21480;21473:12

Swarm Source

ipfs://50aacfb624c4ee676a8d53b3334f8453353c5bdc30a8f42dec1cbdb06fbd4853
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.