ETH Price: $3,529.37 (+7.04%)

Token

RickHead (DDC)
 

Overview

Max Total Supply

0 DDC

Holders

98

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 DDC
0xA86845570f52D84f77C6a352eDa8bE1002f20BDd
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Dope dudes 3D NFT + Physical Art Toy project! 1st collection - 1000 Rick Heads NFTs traveling into the real world. Theophile Signard, Dope Gallery ERA2140

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
RickHead

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-30
*/

/*
    #########################################################################################################
    #                                                                                                       #
    #                                               ╓φ@▒▒▒▒@╗µ,                                             #
    #                                           -╠╠╠╠╠╬╬╬╬╬╬╬╬╬╬╤                                          #
    #                                        .φ╠╠╠╠╠╠╠╠╠╬╬╬╬╬╬╬╣╬╣╬▒µ                                       #
    #                                      .δ╠╠╠╠╠╠╠╠╠╠╠╬╬╬╬╬╬╬╬╬╣╣╬╬▓╕                                     #
    #                                     δ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬▓╕                                   #
    #                                   ╔φ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╬╬╬╬╬╬╣╬╬╣╬╬╬╬╬╬▒                                  #
    #                                  φφ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬▒┐                                #
    #                                ,╠φφ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╬╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬m                               #
    #                               ,░░φ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬▒                              #
    #                              .░░░φφ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬m                             #
    #                              φ░░░░░░╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ε                            #
    #                             φ░░░░░░░░░░╚╚╚╚╚╚╚╚╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╬                            #
    #                            ,╓φφφφφφ▒╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╬╬╬╬╣╣╣╣╣╣╣╣╬╬╬▒                           #
    #                          ░░░░░░░░░░░░░φφ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠▒_                        #
    #                          ░░░░░░░░░░░░φφφ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠▒                        #
    #                          ░░░░░░░░░░░░φφφ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠▒                        #
    #                          ░░░░░░░░░░░░░░φ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠▒                        #
    #                          ░░░░░░░░░░░░░╙╙╙╙╙╙╙╙╙╙╙╙╙╙╙╙╙╙╙╚╚╚╚╚╚╚╩╩╩╩╩╩╠╠╠╠╠╠╠▒                        #
    #                           _ ___,,,,,,,»»»»»»»»»,»»≥≥≥≥≥╔φφφφφφφφφφφφφφσ╔╓,''"                         #
    #                             _[░░░░░░░░░░░φφφφφφ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠░ε                           #
    #                              `"""""""░░░░░╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╝╝╙╙╙_                            #
    #                         -αα_______  _ `""╚╚╚╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╝╜╙"└-_ __ __ ╓▄▄µ                        #
    #                        ╙╙╠░⌐[   _ ___________.└└"╚╠╠╝╙└└~'_ ____________ ╣║╣╣╩▀                       #
    #                        ░░≥░∩░≥        _______ __       __  ____         ╔╬╬╠╠╠╬╩                       #
    #                        ╙░░░∩░░»                                        ╔╬╬╠╠╠╬╩                       #
    #                         "░ⁿ"░░░≥                ╔∩╚╠▒ε             _  é╬╬╠╠╩╩╙                        #
    #                             ░░░░░░,_         -φ╠▒φ╔φ╠╠╠▒╓         ,╔▒╠╠╬╠╠▒                           #
    #                         ,╔╔εⁿ░░░░░░░░░░φφ=╔δφ╠╠╠╠▒░└╠╠╠╠╠╠▒#φφδφφφ╠╠╠╠╠╠╠╠▒╔σ-                        #
    #                         ░░░φ∩"░░░░░░░░░φφφφ╠╠╠╠╠╠╠▒▒╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠▒╠╠╠                        #
    #                         =░░░░φ░"░░░░░░░░φφ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╩╠╠╠╠╠╩                        #
    #                           "░≥░╙≥φ╓░"░░░░░╠╠╠╠╠╠╠╠╠╠╠╠╠╠╬╬╬╬╬╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠                          #
    #                          _░"░░░≥φ░╚╚φφ░░░░╚╠╠╠╠╠╠╠╠╠╬╬╬╠╠╠╠╠╠╠╠╠╠╠╠╠╚╠╠╩╠φ╠φ,                         #
    #                       ╔φ░░∩"░░░░░░╙≥≡░╙╚╠╠φφ░╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╩╠╠╠╩╠╠╠╠╠╠φφ╠╠▒m,                     #
    #                    ╔╠░░░░░░"░░░░░░░░φ≥░░≥░╙╚╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╩╠φ▒╠╠╠╠╠╠╠╠╠╠╠░╠╠╠╠╠╠▒╗_                  #
    #                 .φ░φφ░░░░░░.░░░░░░░░░░░░░▒▒φφ▄▄╙╙╚╩╩╩╩╚║▄φ▒╠╠╠╠╠╠╠╠╠╠╠╠╠╠φ░░╚╚╠╠╠╠╬╠▒┐                #
    #               ╔╠φφφφ░░░░░░-'ⁿ░░░░░░░░░░░░░░╔▓╬░╠╠▒▒▒▒╠╠╠╬▓▓╠╠╠╠╠╠╠╠╠╠╠╠╠╠φ░░░░░╚╠╠╠╠╠╠▒╗              #
    #              ░░╚╠╠╠φ░░░░"~'_;░░░░░░░░░░░░░╣▓╩░╠╠╠╠╠╠╠╠╠╠╠╠╚▓▒╠╠╠╠╠╠╠╠╠╠╠╠φ░''"ⁿ░░╚╠╠╠╠╠╠╠_            #
    #              ,░░╙╚╚░░░░ⁿⁿ  _;░░░░░░░░░░░░╠▓▒φφ╠╠╠╠╠╠╠╠╠╠╠╠╠╙▓╠╠╠╠╠╠╠╠╠╠╠╠φ░   '"░░░╚╚╚╚╠▒             #
    #              ╓░╚╠φ░░"""    .░░░░░░░░░░░░░░░φφφ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠φ    ''",«φ╠╠╠╠             #
    #             ╠╠╠╣▒░░░≥      "░░░░░░░░░░░░░φ╚▒φ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠φ_     ""░░φ╣╣╣▓╕           #
    #            ╔╠╠╚╠▒░"        "░░░░░░░░░░░░░░φφ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╚         '░╠╬╠╣▒           #
    #            `╚╚╚φ╠░          ""░░░░░░░░░░░φ░░φ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠░╚╚          ░░░╙╚╩╛           #
    #               `              -.""ⁿ░░░░░░░░░░░░╚╚╩╠╠╠╠╠╠╠╠╠╠╠╠╠╠╚╚╚╚░╚╚░░φ_             ` _            #
    #                             ,░-`'..'""░░░░░░░░░░░░░░░░░░░░░░░╚░░░░░░φ░░φ╠ε                            #
    #                            ,░░░-''''''....''''¬--»»»»░░=ⁿ""░░░≤φ░░░░░░φφ╠╠ε                           #
    #                           ,░░░░░░.__''''''''''''''''-"""""\░░░░░░ⁿ""░░φ╠╠╠╠ε                          #
    #                          «░░░░░░░░░._____________'''''''''''______.-░░φ╠╠╠╠╠m                         #
    #                         φ░░░░░░░░░░░"-'                         _'""░░░░╠╠╠╠╠▒                        #
    #                       φ░░░φφ░░░░░░░"                              '."░░░φ╠╠╠╠╠╠▒                      #
    #                       ░░░╚╚░░░░░░░∩                                 ,░░░░╚╠╠╠╠╠╩⌐                     #
    #                       ░;,,░"░░░░░░                                  """"ⁿ░░░Γφφ╠_                     #
    #                    ,▄▄▄▄▄╠╠░░░[_                                       _';φ║▓╬╣▓▓▄,                   #
    #                   Θ▒╫╬╠╠╠╠╬╣╬╝╣╦                                      ▄╠╠╠╢╬╠╠╠╠╬╫╬▓_                 #
    #                  ▒▒╠╠╠╠╠╬╣╬╠╣╣╣▒                                      Γφ╠╠╠╬╬╬╬╬╬╬╬╠╣_                #
    #                 └░░╚╚╠╠╠╠╠╠╠╠╠╠╠                                      "░░╚╠╠╠╠╠╠╠╬╠╬╠╩                #
    #                  ≥αφ╚╠╠╠╠╠╠╠╠╠╠╠                                      ╙≈α═╗╣╩╬╬╠▓▓╫wæ⌐                #
    #                  ²δ╙░╙╚╙╙╚╚╙╚╚╝                                        ╚╙╚╙╙╚╚╙╚╙╚╙╚╝                 #
    #########################################################################################################
    #                                          ERA2140 - DopeGallery                                        #
    #########################################################################################################
 */




// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Counters.sol


// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol


// 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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` 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 tokenId
    ) 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.
     * - `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 tokenId
    ) internal virtual {}
}

// File: rickhead.sol


pragma solidity ^0.8.4;





contract RickHead is ERC721, Pausable, Ownable {
    using Counters
    for Counters.Counter;
    using Strings
    for uint256;

    enum SalePhase {
        Locked,
        Private,
        Presale,
        Public
    }
    enum CouponType {
        Private,
        Presale,
        FreeMint
    }

    struct Coupon {
        bytes32 r;
        bytes32 s;
        uint8 v;
    }

    Counters.Counter private _tokenId;

    uint64 public constant maxSupply = 1000;
    uint64 private maxMintsPerAddress = 20;
    uint64 private maxPrivateMintsPerAddress = 2;
    uint64 private maxPresaleMintsPerAddress = 2;
    uint64 private maxFreeMintsPerAddress = 1;
    uint64 private maxPrivateMints = 100;
    uint64 private totalPrivateMints = 0;
    uint64 public mintPrice = 0.20 ether;
    string private baseURI = "ipfs://QmbRvokfZdLmCRgUjZzozQPJiB8sfefFW5hQ3sEJqqhNaH/";
    address private _adminSigner = 0xcCAd13A51947cE87a4f4b3D2E226CaeBE5e6dA40;

    mapping(address => uint256) public PrivateMintsCount;
    mapping(address => uint256) public PresaleMintsCount;
    mapping(address => uint256) public TeamMintsCount;

    event NewURI(string newURI, address updatedBy);
    event WithdrawnPayment(uint256 contractBalance, address transferTo);
    event updatePhase(SalePhase phase, uint64 price, address updatedBy);
    event updateAdminSigner(address adminSigner, address updatedBy);

    SalePhase public phase = SalePhase.Locked;

    constructor() ERC721("RickHead", "DDC") {}

    /**
     * @dev setPhase updates the price and the phase to (Locked, Private, Presale or Public).
     $
     * Emits a {Unpaused} event.
     *
     * Requirements:
     *
     * - Only the owner can call this function
     */
    function setPhase(uint64 phasePrice_, SalePhase phase_)
    external
    onlyOwner {
        phase = phase_;
        mintPrice = phasePrice_;
        emit updatePhase(phase_, phasePrice_, msg.sender);
    }


    /**
     * @dev setMaxPrivateMintsPerAddress updates maxPrivateMintsPerAddress 
     *
     * Requirements:
     *
     * - Only the owner can call this function
     */
    function setMaxPrivateMintsPerAddress(uint64 max)
    external
    onlyOwner {
        maxPrivateMintsPerAddress = max;
    }

    /**
     * @dev setMaxPresaleMintsPerAddress updates maxPresaleMintsPerAddress 
     *
     * Requirements:
     *
     * - Only the owner can call this function
     */
    function setMaxPresaleMintsPerAddress(uint64 max)
    external
    onlyOwner {
        maxPresaleMintsPerAddress = max;
    }


    /** 
     * @dev setMaxMintsPerAddress updates maxMintsPerAddress 
     *
     * Requirements:
     *
     * - Only the owner can call this function
     */
    function setMaxMintsPerAddress(uint64 max)
    external
    onlyOwner {
        maxMintsPerAddress = max;
    }


    /** 
     * @dev setMaxPrivateMints updates maxPrivateMints 
     *
     * Requirements:
     *
     * - Only the owner can call this function
     */
    function setMaxPrivateMints(uint64 max)
    external
    onlyOwner {
        maxPrivateMints = max;
    }


    /** 
     * @dev setTotalPrivateMints updates totalPrivateMints 
     *
     * Requirements:
     *
     * - Only the owner can call this function
     */
    function setTotalPrivateMints(uint64 max)
    external
    onlyOwner {
        totalPrivateMints = max;
    }

    /**
     * @dev setBaseUri updates the new token URI in contract.
     *
     * Emits a {NewURI} event.
     *
     * Requirements:
     *
     * - Only owner of contract can call this function
     **/
    function setBaseUri(string memory uri)
    external
    onlyOwner {
        baseURI = uri;
        emit NewURI(uri, msg.sender);
    }


    /**
     * @dev mint 
     *
     * Emits [Transfer] event.
     *
     * Requirements:
     *
     * - should have a valid coupon if we are ()
     **/
    function mint(uint64 amount, Coupon memory coupon)
    external
    payable
    whenNotPaused {
        uint256 currentSupply = _tokenId.current();
        require(phase != SalePhase.Locked, "Sale is not available");
        if (phase == SalePhase.Private) {
            bytes32 digest = keccak256(
                abi.encode(CouponType.Private, msg.sender)
            );
            require(_isVerifiedCoupon(digest, coupon), "Invalid coupon");
            require(
                PrivateMintsCount[msg.sender] + amount <= maxPrivateMintsPerAddress,
                "Max supply to mint per address during private sale has been reached"
            );
            require(
                totalPrivateMints + amount <= maxPrivateMints,
                "Max supply to mint during private sale has been reached"
            );
        } else if (phase == SalePhase.Presale) {
            bytes32 digest = keccak256(
                abi.encode(CouponType.Presale, msg.sender)
            );
            require(_isVerifiedCoupon(digest, coupon), "Invalid coupon");
            require(
                PresaleMintsCount[msg.sender] + amount <= maxPresaleMintsPerAddress,
                "Max supply to mint per address during presale has been reached"
            );
        }

        require(
            currentSupply + amount <= maxSupply,
            "Max supply limit reached"
        );
        require(
            balanceOf(msg.sender) + amount <= maxMintsPerAddress,
            "Max mint per address reached"
        );

        require(msg.value >= amount * mintPrice, "Insufficient funds");

        for (uint256 i = 0; i < amount; i++) {
            if (phase == SalePhase.Private) {
                totalPrivateMints++;
                PrivateMintsCount[msg.sender]++;
            } else if (phase == SalePhase.Presale) {
                PresaleMintsCount[msg.sender]++;
            }
            _tokenId.increment();
            _safeMint(msg.sender, _tokenId.current());
        }
    }

    /**
     * @dev batchFreeMint 
     *
     * Requirements:
     *
     * - Only owner of contract can call this function
     **/
    function batchFreeMint(address[] memory _winnerAddresses, uint64 amount)
    external
    onlyOwner {
        uint256 currentSupply = _tokenId.current();
        require(
            currentSupply + (_winnerAddresses.length * amount) <= maxSupply,
            "Max supply limit reached, please reduce mint amount"
        );
        for (uint i = 0; i < _winnerAddresses.length; i++) {
            for (uint256 j = 0; j < amount; j++) {
                _tokenId.increment();
                _safeMint(_winnerAddresses[i], _tokenId.current());
            }
        }
    }

    /** 
     * @dev freeMint 
     *
     * Emits [Transfer] event.
     *
     * Requirements:
     *
     * - we can call it only once per address and with a valid coupon
     **/
    function freeMint(Coupon memory coupon)
    external
    payable
    whenNotPaused {
        require(phase == SalePhase.Public, "Sale is not available");

        uint256 currentSupply = _tokenId.current();
        bytes32 digest = keccak256(
            abi.encode(CouponType.FreeMint, msg.sender)
        );
        require(_isVerifiedCoupon(digest, coupon), "Invalid coupon");
        require(
            TeamMintsCount[msg.sender] < maxFreeMintsPerAddress,
            "Max supply to mint for free per address has been reached"
        );
        require(
            currentSupply + 1 <= maxSupply,
            "Max supply limit reached"
        );
        TeamMintsCount[msg.sender]++;
        _tokenId.increment();
        _safeMint(msg.sender, _tokenId.current());

    }

    /**
     * @dev _isVerifiedCoupon verify the coupon
     *
     */
    function _isVerifiedCoupon(bytes32 digest, Coupon memory coupon)
    internal
    view
    returns(bool) {
        address signer = ecrecover(digest, coupon.v, coupon.r, coupon.s);
        require(signer != address(0), "ECDSA: invalid signature"); // Added check for zero address
        return signer == _adminSigner;
    }


    /**
     * @dev setAdminSigner updates the adminSigner address.
     *
     * Emits a {Unpaused} event.
     *
     * Requirements:
     *
     * - Only the owner can call this function
     */
    function setAdminSigner(address _newAdminSigner) public onlyOwner() returns(address) {
        _adminSigner = _newAdminSigner;
        emit updateAdminSigner(_newAdminSigner, msg.sender);
        return _adminSigner;
    }

    /**
     * @dev getAdminSigner returns the adminSigner address
     *
     */
    function getAdminSigner() public view returns(address) {
        return _adminSigner;
    }


    /**
     * @dev getbaseURI returns the base uri 
     *
     */
    function getbaseURI() public view returns(string memory) {
        return baseURI;
    }

    /**
     * @dev tokenURI returns the uri to meta data 
     *
     */

    function tokenURI(uint256 tokenId)
    public
    view
    override
    returns(string memory) {
        require(_exists(tokenId), "ERC721: Query for non-existent token");
        return
        bytes(baseURI).length > 0 ?
            string(abi.encodePacked(baseURI, tokenId.toString())) :
            "";
    }


    /**
     * @dev pause() is used to pause contract.
     *
     * Emits a {Paused} event.
     *
     * Requirements:
     *
     * - Only the owner can call this function
     **/

    function pause() public onlyOwner whenNotPaused {
        _pause();
    }

    /**
     * @dev unpause() is used to unpause contract.
     *
     * Emits a {Unpaused} event.
     *
     * Requirements:
     *
     * - Only the owner can call this function
     **/
    function unpause() public onlyOwner whenPaused {
        _unpause();
    }

    /**
     * @dev withdraw is used to withdraw payment from contract.
     *
     * Emits a {WithdrawnPayment} event.
     *
     * Requirements:
     *
     * - Only the owner can call this function
     **/

    function withdraw() public payable onlyOwner() {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
        emit WithdrawnPayment(balance, msg.sender);
    }

    /**
     * @dev remainingPrivateSupply returns the remaining mint per address during private sale 
     *
     */
    function remainingPrivateSupply() public view returns(uint256) {
        return maxPrivateMints - totalPrivateMints;
    }

    /**
     * @dev availableMints returns the remaining mint per address
     *
     */
    function availableMints(address user) public view returns(uint256) {
        if (phase == SalePhase.Private) {
            if (maxPrivateMintsPerAddress >= PrivateMintsCount[user]) {
                return maxPrivateMintsPerAddress - PrivateMintsCount[user];
            }
        } else if (phase == SalePhase.Presale) {
            if (maxPresaleMintsPerAddress >= PresaleMintsCount[user]) {
                return maxPresaleMintsPerAddress - PresaleMintsCount[user];
            }
        } else if (phase == SalePhase.Public) {
            if (maxMintsPerAddress >= balanceOf(user)) {
                return maxMintsPerAddress - balanceOf(user);
            }
        }
        return 0;
    }

    /**
     * @dev remainingFreeMints returns the remaining free mint per address
     *
     */
    function remainingFreeMints(address user) public view returns(uint256) {
        if (maxFreeMintsPerAddress >= TeamMintsCount[user]) {
            return maxFreeMintsPerAddress - TeamMintsCount[user];
        }
        return 0;
    }

    /**
     * @dev circulatingSupply returns the current supply.
     *
     */
    function circulatingSupply() public view returns(uint256) {
        return _tokenId.current();
    }

}

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":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"newURI","type":"string"},{"indexed":false,"internalType":"address","name":"updatedBy","type":"address"}],"name":"NewURI","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":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"contractBalance","type":"uint256"},{"indexed":false,"internalType":"address","name":"transferTo","type":"address"}],"name":"WithdrawnPayment","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"adminSigner","type":"address"},{"indexed":false,"internalType":"address","name":"updatedBy","type":"address"}],"name":"updateAdminSigner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum RickHead.SalePhase","name":"phase","type":"uint8"},{"indexed":false,"internalType":"uint64","name":"price","type":"uint64"},{"indexed":false,"internalType":"address","name":"updatedBy","type":"address"}],"name":"updatePhase","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"PresaleMintsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"PrivateMintsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"TeamMintsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"availableMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_winnerAddresses","type":"address[]"},{"internalType":"uint64","name":"amount","type":"uint64"}],"name":"batchFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"internalType":"struct RickHead.Coupon","name":"coupon","type":"tuple"}],"name":"freeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getAdminSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getbaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"amount","type":"uint64"},{"components":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"internalType":"struct RickHead.Coupon","name":"coupon","type":"tuple"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phase","outputs":[{"internalType":"enum RickHead.SalePhase","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"remainingFreeMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remainingPrivateSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAdminSigner","type":"address"}],"name":"setAdminSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"max","type":"uint64"}],"name":"setMaxMintsPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"max","type":"uint64"}],"name":"setMaxPresaleMintsPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"max","type":"uint64"}],"name":"setMaxPrivateMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"max","type":"uint64"}],"name":"setMaxPrivateMintsPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"phasePrice_","type":"uint64"},{"internalType":"enum RickHead.SalePhase","name":"phase_","type":"uint8"}],"name":"setPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"max","type":"uint64"}],"name":"setTotalPrivateMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526014600860006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060026008806101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506002600860106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600860186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506064600960006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600960086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506702c68af0bb140000600960106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506040518060600160405280603681526020016200623360369139600a908051906020019062000161929190620003a2565b5073ccad13a51947ce87a4f4b3d2e226caebe5e6da40600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600f60006101000a81548160ff02191690836003811115620001e057620001df62000488565b5b0217905550348015620001f257600080fd5b506040518060400160405280600881526020017f5269636b486561640000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4444430000000000000000000000000000000000000000000000000000000000815250816000908051906020019062000277929190620003a2565b50806001908051906020019062000290929190620003a2565b5050506000600660006101000a81548160ff021916908315150217905550620002ce620002c2620002d460201b60201c565b620002dc60201b60201c565b620004e6565b600033905090565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620003b09062000452565b90600052602060002090601f016020900481019282620003d4576000855562000420565b82601f10620003ef57805160ff191683800117855562000420565b8280016001018555821562000420579182015b828111156200041f57825182559160200191906001019062000402565b5b5090506200042f919062000433565b5090565b5b808211156200044e57600081600090555060010162000434565b5090565b600060028204905060018216806200046b57607f821691505b60208210811415620004825762000481620004b7565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615d3d80620004f66000396000f3fe60806040526004361061025c5760003560e01c806370a0823111610144578063ad5f9eb8116100b6578063d5abeb011161007a578063d5abeb01146108bb578063d66b3eda146108e6578063e7ee105314610923578063e985e9c51461094c578063f2fde38b14610989578063f3644246146109b25761025c565b8063ad5f9eb8146107d8578063b1c9fe6e14610801578063b88d4fde1461082c578063ba24bbe914610855578063c87b56dd1461087e5761025c565b806395d89b411161010857806395d89b41146106c857806398bc5cc8146106f35780639da5b5c214610730578063a0bcfc7f1461075b578063a22cb46514610784578063a4cfd20a146107ad5761025c565b806370a0823114610607578063715018a6146106445780638456cb591461065b5780638da5cb5b146106725780639358928b1461069d5761025c565b806323b872dd116101dd57806342842e0e116101a157806342842e0e146104f9578063559f184a146105225780635a4da0821461054b5780635c975abb146105745780636352211e1461059f5780636817c76c146105dc5761025c565b806323b872dd146104685780633370e34c146104915780633b79a6ba146104bc5780633ccfd60b146104d85780633f4ba83a146104e25761025c565b806311177aea1161022457806311177aea1461034b578063145e44221461038857806317f24d24146103b1578063183bbe80146103ee5780631d7615c71461042b5761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b3146103065780630ebeccea1461032f575b600080fd5b34801561026d57600080fd5b506102886004803603810190610283919061416c565b6109db565b604051610295919061495b565b60405180910390f35b3480156102aa57600080fd5b506102b3610abd565b6040516102c09190614a36565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb919061423c565b610b4f565b6040516102fd91906148cb565b60405180910390f35b34801561031257600080fd5b5061032d600480360381019061032891906140d0565b610bd4565b005b6103496004803603810190610344919061420f565b610cec565b005b34801561035757600080fd5b50610372600480360381019061036d9190613f4d565b610fa1565b60405161037f9190614e28565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa9190614269565b610fb9565b005b3480156103bd57600080fd5b506103d860048036038101906103d39190613f4d565b611061565b6040516103e59190614e28565b60405180910390f35b3480156103fa57600080fd5b5061041560048036038101906104109190613f4d565b611145565b60405161042291906148cb565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d9190613f4d565b611267565b60405161045f9190614e28565b60405180910390f35b34801561047457600080fd5b5061048f600480360381019061048a9190613fba565b61127f565b005b34801561049d57600080fd5b506104a66112df565b6040516104b39190614a36565b60405180910390f35b6104d660048036038101906104d191906142d6565b611371565b005b6104e0611ab9565b005b3480156104ee57600080fd5b506104f7611bbd565b005b34801561050557600080fd5b50610520600480360381019061051b9190613fba565b611c8a565b005b34801561052e57600080fd5b5061054960048036038101906105449190614110565b611caa565b005b34801561055757600080fd5b50610572600480360381019061056d9190614296565b611e29565b005b34801561058057600080fd5b50610589611f37565b604051610596919061495b565b60405180910390f35b3480156105ab57600080fd5b506105c660048036038101906105c1919061423c565b611f4e565b6040516105d391906148cb565b60405180910390f35b3480156105e857600080fd5b506105f1612000565b6040516105fe9190614e6c565b60405180910390f35b34801561061357600080fd5b5061062e60048036038101906106299190613f4d565b61201a565b60405161063b9190614e28565b60405180910390f35b34801561065057600080fd5b506106596120d2565b005b34801561066757600080fd5b5061067061215a565b005b34801561067e57600080fd5b50610687612228565b60405161069491906148cb565b60405180910390f35b3480156106a957600080fd5b506106b2612252565b6040516106bf9190614e28565b60405180910390f35b3480156106d457600080fd5b506106dd612263565b6040516106ea9190614a36565b60405180910390f35b3480156106ff57600080fd5b5061071a60048036038101906107159190613f4d565b6122f5565b6040516107279190614e28565b60405180910390f35b34801561073c57600080fd5b5061074561230d565b6040516107529190614e28565b60405180910390f35b34801561076757600080fd5b50610782600480360381019061077d91906141c6565b612356565b005b34801561079057600080fd5b506107ab60048036038101906107a69190614090565b612425565b005b3480156107b957600080fd5b506107c261243b565b6040516107cf91906148cb565b60405180910390f35b3480156107e457600080fd5b506107ff60048036038101906107fa9190614269565b612465565b005b34801561080d57600080fd5b5061081661250d565b60405161082391906149e4565b60405180910390f35b34801561083857600080fd5b50610853600480360381019061084e919061400d565b612520565b005b34801561086157600080fd5b5061087c60048036038101906108779190614269565b612582565b005b34801561088a57600080fd5b506108a560048036038101906108a0919061423c565b61262a565b6040516108b29190614a36565b60405180910390f35b3480156108c757600080fd5b506108d06126d2565b6040516108dd9190614e6c565b60405180910390f35b3480156108f257600080fd5b5061090d60048036038101906109089190613f4d565b6126d8565b60405161091a9190614e28565b60405180910390f35b34801561092f57600080fd5b5061094a60048036038101906109459190614269565b6129ba565b005b34801561095857600080fd5b50610973600480360381019061096e9190613f7a565b612a61565b604051610980919061495b565b60405180910390f35b34801561099557600080fd5b506109b060048036038101906109ab9190613f4d565b612af5565b005b3480156109be57600080fd5b506109d960048036038101906109d49190614269565b612bed565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aa657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ab65750610ab582612c95565b5b9050919050565b606060008054610acc90615286565b80601f0160208091040260200160405190810160405280929190818152602001828054610af890615286565b8015610b455780601f10610b1a57610100808354040283529160200191610b45565b820191906000526020600020905b815481529060010190602001808311610b2857829003601f168201915b5050505050905090565b6000610b5a82612cff565b610b99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9090614d08565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bdf82611f4e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4790614d88565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c6f612d6b565b73ffffffffffffffffffffffffffffffffffffffff161480610c9e5750610c9d81610c98612d6b565b612a61565b5b610cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd490614ca8565b60405180910390fd5b610ce78383612d73565b505050565b610cf4611f37565b15610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2b90614c68565b60405180910390fd5b600380811115610d4757610d466153f2565b5b600f60009054906101000a900460ff166003811115610d6957610d686153f2565b5b14610da9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da090614e08565b60405180910390fd5b6000610db56007612e2c565b90506000600233604051602001610dcd9291906149bb565b604051602081830303815290604052805190602001209050610def8184612e3a565b610e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2590614b68565b60405180910390fd5b600860189054906101000a900467ffffffffffffffff1667ffffffffffffffff16600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec690614dc8565b60405180910390fd5b6103e867ffffffffffffffff16600183610ee99190614f92565b1115610f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2190614de8565b60405180910390fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610f7a906152e9565b9190505550610f896007612f64565b610f9c33610f976007612e2c565b612f7a565b505050565b600c6020528060005260406000206000915090505481565b610fc1612d6b565b73ffffffffffffffffffffffffffffffffffffffff16610fdf612228565b73ffffffffffffffffffffffffffffffffffffffff1614611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102c90614d28565b60405180910390fd5b80600860006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600860189054906101000a900467ffffffffffffffff1667ffffffffffffffff161061113b57600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600860189054906101000a900467ffffffffffffffff1667ffffffffffffffff1661113491906150f3565b9050611140565b600090505b919050565b600061114f612d6b565b73ffffffffffffffffffffffffffffffffffffffff1661116d612228565b73ffffffffffffffffffffffffffffffffffffffff16146111c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ba90614d28565b60405180910390fd5b81600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fa5d71a67cfb62101dba4597acd23e775be9567b0b5924ed0d91607278a2ae6aa82336040516112359291906148e6565b60405180910390a1600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600e6020528060005260406000206000915090505481565b61129061128a612d6b565b82612f98565b6112cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c690614da8565b60405180910390fd5b6112da838383613076565b505050565b6060600a80546112ee90615286565b80601f016020809104026020016040519081016040528092919081815260200182805461131a90615286565b80156113675780601f1061133c57610100808354040283529160200191611367565b820191906000526020600020905b81548152906001019060200180831161134a57829003601f168201915b5050505050905090565b611379611f37565b156113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090614c68565b60405180910390fd5b60006113c56007612e2c565b9050600060038111156113db576113da6153f2565b5b600f60009054906101000a900460ff1660038111156113fd576113fc6153f2565b5b141561143e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143590614e08565b60405180910390fd5b60016003811115611452576114516153f2565b5b600f60009054906101000a900460ff166003811115611474576114736153f2565b5b1415611639576000803360405160200161148f9291906149bb565b6040516020818303038152906040528051906020012090506114b18184612e3a565b6114f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e790614b68565b60405180910390fd5b60088054906101000a900467ffffffffffffffff1667ffffffffffffffff168467ffffffffffffffff16600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115649190614f92565b11156115a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159c90614aa8565b60405180910390fd5b600960009054906101000a900467ffffffffffffffff1667ffffffffffffffff1684600960089054906101000a900467ffffffffffffffff166115e89190614fe8565b67ffffffffffffffff161115611633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162a90614c08565b60405180910390fd5b506117a6565b6002600381111561164d5761164c6153f2565b5b600f60009054906101000a900460ff16600381111561166f5761166e6153f2565b5b14156117a557600060013360405160200161168b9291906149bb565b6040516020818303038152906040528051906020012090506116ad8184612e3a565b6116ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e390614b68565b60405180910390fd5b600860109054906101000a900467ffffffffffffffff1667ffffffffffffffff168467ffffffffffffffff16600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117629190614f92565b11156117a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179a90614be8565b60405180910390fd5b505b5b6103e867ffffffffffffffff168367ffffffffffffffff16826117c99190614f92565b111561180a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180190614de8565b60405180910390fd5b600860009054906101000a900467ffffffffffffffff1667ffffffffffffffff168367ffffffffffffffff1661183f3361201a565b6118499190614f92565b111561188a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188190614d68565b60405180910390fd5b600960109054906101000a900467ffffffffffffffff16836118ac91906150b1565b67ffffffffffffffff163410156118f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ef90614c48565b60405180910390fd5b60005b8367ffffffffffffffff16811015611ab35760016003811115611921576119206153f2565b5b600f60009054906101000a900460ff166003811115611943576119426153f2565b5b14156119f0576009600881819054906101000a900467ffffffffffffffff168092919061196f90615332565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906119e6906152e9565b9190505550611a83565b60026003811115611a0457611a036153f2565b5b600f60009054906101000a900460ff166003811115611a2657611a256153f2565b5b1415611a8257600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611a7c906152e9565b91905055505b5b611a8d6007612f64565b611aa033611a9b6007612e2c565b612f7a565b8080611aab906152e9565b9150506118fb565b50505050565b611ac1612d6b565b73ffffffffffffffffffffffffffffffffffffffff16611adf612228565b73ffffffffffffffffffffffffffffffffffffffff1614611b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2c90614d28565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611b80573d6000803e3d6000fd5b507fb0caa7e5a1709d95503ec9da196222012fad8495f101214d86c3b72ce101810f8133604051611bb2929190614e43565b60405180910390a150565b611bc5612d6b565b73ffffffffffffffffffffffffffffffffffffffff16611be3612228565b73ffffffffffffffffffffffffffffffffffffffff1614611c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3090614d28565b60405180910390fd5b611c41611f37565b611c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7790614ac8565b60405180910390fd5b611c886132dd565b565b611ca583838360405180602001604052806000815250612520565b505050565b611cb2612d6b565b73ffffffffffffffffffffffffffffffffffffffff16611cd0612228565b73ffffffffffffffffffffffffffffffffffffffff1614611d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1d90614d28565b60405180910390fd5b6000611d326007612e2c565b90506103e867ffffffffffffffff168267ffffffffffffffff168451611d589190615057565b82611d639190614f92565b1115611da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9b90614bc8565b60405180910390fd5b60005b8351811015611e235760005b8367ffffffffffffffff16811015611e0f57611dcf6007612f64565b611dfc858381518110611de557611de4615450565b5b6020026020010151611df76007612e2c565b612f7a565b8080611e07906152e9565b915050611db3565b508080611e1b906152e9565b915050611da7565b50505050565b611e31612d6b565b73ffffffffffffffffffffffffffffffffffffffff16611e4f612228565b73ffffffffffffffffffffffffffffffffffffffff1614611ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9c90614d28565b60405180910390fd5b80600f60006101000a81548160ff02191690836003811115611eca57611ec96153f2565b5b021790555081600960106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f3a5a14e930d7aa110c97704c49b983c99864591e183f425a5a9940f1b388a833818333604051611f2b939291906149ff565b60405180910390a15050565b6000600660009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fee90614cc8565b60405180910390fd5b80915050919050565b600960109054906101000a900467ffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561208b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208290614c88565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6120da612d6b565b73ffffffffffffffffffffffffffffffffffffffff166120f8612228565b73ffffffffffffffffffffffffffffffffffffffff161461214e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214590614d28565b60405180910390fd5b612158600061337f565b565b612162612d6b565b73ffffffffffffffffffffffffffffffffffffffff16612180612228565b73ffffffffffffffffffffffffffffffffffffffff16146121d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cd90614d28565b60405180910390fd5b6121de611f37565b1561221e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221590614c68565b60405180910390fd5b612226613445565b565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061225e6007612e2c565b905090565b60606001805461227290615286565b80601f016020809104026020016040519081016040528092919081815260200182805461229e90615286565b80156122eb5780601f106122c0576101008083540402835291602001916122eb565b820191906000526020600020905b8154815290600101906020018083116122ce57829003601f168201915b5050505050905090565b600d6020528060005260406000206000915090505481565b6000600960089054906101000a900467ffffffffffffffff16600960009054906101000a900467ffffffffffffffff166123479190615127565b67ffffffffffffffff16905090565b61235e612d6b565b73ffffffffffffffffffffffffffffffffffffffff1661237c612228565b73ffffffffffffffffffffffffffffffffffffffff16146123d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c990614d28565b60405180910390fd5b80600a90805190602001906123e8929190613c0b565b507fc7908db8c8588ac430ee4efe758e7ba70a0d22e32a138b548fd0d34fa8a48395813360405161241a929190614a58565b60405180910390a150565b612437612430612d6b565b83836134e8565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61246d612d6b565b73ffffffffffffffffffffffffffffffffffffffff1661248b612228565b73ffffffffffffffffffffffffffffffffffffffff16146124e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d890614d28565b60405180910390fd5b80600860106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b600f60009054906101000a900460ff1681565b61253161252b612d6b565b83612f98565b612570576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256790614da8565b60405180910390fd5b61257c84848484613655565b50505050565b61258a612d6b565b73ffffffffffffffffffffffffffffffffffffffff166125a8612228565b73ffffffffffffffffffffffffffffffffffffffff16146125fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f590614d28565b60405180910390fd5b80600960006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b606061263582612cff565b612674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266b90614d48565b60405180910390fd5b6000600a805461268390615286565b90501161269f57604051806020016040528060008152506126cb565b600a6126aa836136b1565b6040516020016126bb9291906148a7565b6040516020818303038152906040525b9050919050565b6103e881565b6000600160038111156126ee576126ed6153f2565b5b600f60009054906101000a900460ff1660038111156127105761270f6153f2565b5b14156127ef57600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460088054906101000a900467ffffffffffffffff1667ffffffffffffffff16106127ea57600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460088054906101000a900467ffffffffffffffff1667ffffffffffffffff166127e391906150f3565b90506129b5565b6129b0565b60026003811115612803576128026153f2565b5b600f60009054906101000a900460ff166003811115612825576128246153f2565b5b141561290857600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600860109054906101000a900467ffffffffffffffff1667ffffffffffffffff161061290357600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600860109054906101000a900467ffffffffffffffff1667ffffffffffffffff166128fc91906150f3565b90506129b5565b6129af565b60038081111561291b5761291a6153f2565b5b600f60009054906101000a900460ff16600381111561293d5761293c6153f2565b5b14156129ae5761294c8261201a565b600860009054906101000a900467ffffffffffffffff1667ffffffffffffffff16106129ad5761297b8261201a565b600860009054906101000a900467ffffffffffffffff1667ffffffffffffffff166129a691906150f3565b90506129b5565b5b5b5b600090505b919050565b6129c2612d6b565b73ffffffffffffffffffffffffffffffffffffffff166129e0612228565b73ffffffffffffffffffffffffffffffffffffffff1614612a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2d90614d28565b60405180910390fd5b806008806101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612afd612d6b565b73ffffffffffffffffffffffffffffffffffffffff16612b1b612228565b73ffffffffffffffffffffffffffffffffffffffff1614612b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6890614d28565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd890614b08565b60405180910390fd5b612bea8161337f565b50565b612bf5612d6b565b73ffffffffffffffffffffffffffffffffffffffff16612c13612228565b73ffffffffffffffffffffffffffffffffffffffff1614612c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6090614d28565b60405180910390fd5b80600960086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612de683611f4e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60008060018484604001518560000151866020015160405160008152602001604052604051612e6c9493929190614976565b6020604051602081039080840390855afa158015612e8e573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0190614a88565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161491505092915050565b6001816000016000828254019250508190555050565b612f94828260405180602001604052806000815250613812565b5050565b6000612fa382612cff565b612fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd990614c28565b60405180910390fd5b6000612fed83611f4e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061302f575061302e8185612a61565b5b8061306d57508373ffffffffffffffffffffffffffffffffffffffff1661305584610b4f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661309682611f4e565b73ffffffffffffffffffffffffffffffffffffffff16146130ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e390614b28565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561315c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315390614b88565b60405180910390fd5b61316783838361386d565b613172600082612d73565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131c291906150f3565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132199190614f92565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46132d8838383613872565b505050565b6132e5611f37565b613324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331b90614ac8565b60405180910390fd5b6000600660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa613368612d6b565b60405161337591906148cb565b60405180910390a1565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61344d611f37565b1561348d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348490614c68565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586134d1612d6b565b6040516134de91906148cb565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161354e90614ba8565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051613648919061495b565b60405180910390a3505050565b613660848484613076565b61366c84848484613877565b6136ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136a290614ae8565b60405180910390fd5b50505050565b606060008214156136f9576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061380d565b600082905060005b6000821461372b578080613714906152e9565b915050600a826137249190615026565b9150613701565b60008167ffffffffffffffff8111156137475761374661547f565b5b6040519080825280601f01601f1916602001820160405280156137795781602001600182028036833780820191505090505b5090505b600085146138065760018261379291906150f3565b9150600a856137a19190615363565b60306137ad9190614f92565b60f81b8183815181106137c3576137c2615450565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856137ff9190615026565b945061377d565b8093505050505b919050565b61381c8383613a0e565b6138296000848484613877565b613868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161385f90614ae8565b60405180910390fd5b505050565b505050565b505050565b60006138988473ffffffffffffffffffffffffffffffffffffffff16613be8565b15613a01578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026138c1612d6b565b8786866040518563ffffffff1660e01b81526004016138e3949392919061490f565b602060405180830381600087803b1580156138fd57600080fd5b505af192505050801561392e57506040513d601f19601f8201168201806040525081019061392b9190614199565b60015b6139b1573d806000811461395e576040519150601f19603f3d011682016040523d82523d6000602084013e613963565b606091505b506000815114156139a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139a090614ae8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613a06565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7590614ce8565b60405180910390fd5b613a8781612cff565b15613ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613abe90614b48565b60405180910390fd5b613ad36000838361386d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b239190614f92565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613be460008383613872565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054613c1790615286565b90600052602060002090601f016020900481019282613c395760008555613c80565b82601f10613c5257805160ff1916838001178555613c80565b82800160010185558215613c80579182015b82811115613c7f578251825591602001919060010190613c64565b5b509050613c8d9190613c91565b5090565b5b80821115613caa576000816000905550600101613c92565b5090565b6000613cc1613cbc84614eac565b614e87565b90508083825260208201905082856020860282011115613ce457613ce36154b8565b5b60005b85811015613d145781613cfa8882613da2565b845260208401935060208301925050600181019050613ce7565b5050509392505050565b6000613d31613d2c84614ed8565b614e87565b905082815260208101848484011115613d4d57613d4c6154bd565b5b613d58848285615244565b509392505050565b6000613d73613d6e84614f09565b614e87565b905082815260208101848484011115613d8f57613d8e6154bd565b5b613d9a848285615244565b509392505050565b600081359050613db181615c56565b92915050565b600082601f830112613dcc57613dcb6154ae565b5b8135613ddc848260208601613cae565b91505092915050565b600081359050613df481615c6d565b92915050565b600081359050613e0981615c84565b92915050565b600081359050613e1e81615c9b565b92915050565b600081519050613e3381615c9b565b92915050565b600082601f830112613e4e57613e4d6154ae565b5b8135613e5e848260208601613d1e565b91505092915050565b600081359050613e7681615cb2565b92915050565b600082601f830112613e9157613e906154ae565b5b8135613ea1848260208601613d60565b91505092915050565b600060608284031215613ec057613ebf6154b3565b5b613eca6060614e87565b90506000613eda84828501613dfa565b6000830152506020613eee84828501613dfa565b6020830152506040613f0284828501613f38565b60408301525092915050565b600081359050613f1d81615cc2565b92915050565b600081359050613f3281615cd9565b92915050565b600081359050613f4781615cf0565b92915050565b600060208284031215613f6357613f626154c7565b5b6000613f7184828501613da2565b91505092915050565b60008060408385031215613f9157613f906154c7565b5b6000613f9f85828601613da2565b9250506020613fb085828601613da2565b9150509250929050565b600080600060608486031215613fd357613fd26154c7565b5b6000613fe186828701613da2565b9350506020613ff286828701613da2565b925050604061400386828701613f0e565b9150509250925092565b60008060008060808587031215614027576140266154c7565b5b600061403587828801613da2565b945050602061404687828801613da2565b935050604061405787828801613f0e565b925050606085013567ffffffffffffffff811115614078576140776154c2565b5b61408487828801613e39565b91505092959194509250565b600080604083850312156140a7576140a66154c7565b5b60006140b585828601613da2565b92505060206140c685828601613de5565b9150509250929050565b600080604083850312156140e7576140e66154c7565b5b60006140f585828601613da2565b925050602061410685828601613f0e565b9150509250929050565b60008060408385031215614127576141266154c7565b5b600083013567ffffffffffffffff811115614145576141446154c2565b5b61415185828601613db7565b925050602061416285828601613f23565b9150509250929050565b600060208284031215614182576141816154c7565b5b600061419084828501613e0f565b91505092915050565b6000602082840312156141af576141ae6154c7565b5b60006141bd84828501613e24565b91505092915050565b6000602082840312156141dc576141db6154c7565b5b600082013567ffffffffffffffff8111156141fa576141f96154c2565b5b61420684828501613e7c565b91505092915050565b600060608284031215614225576142246154c7565b5b600061423384828501613eaa565b91505092915050565b600060208284031215614252576142516154c7565b5b600061426084828501613f0e565b91505092915050565b60006020828403121561427f5761427e6154c7565b5b600061428d84828501613f23565b91505092915050565b600080604083850312156142ad576142ac6154c7565b5b60006142bb85828601613f23565b92505060206142cc85828601613e67565b9150509250929050565b600080608083850312156142ed576142ec6154c7565b5b60006142fb85828601613f23565b925050602061430c85828601613eaa565b9150509250929050565b61431f8161515b565b82525050565b61432e8161516d565b82525050565b61433d81615179565b82525050565b600061434e82614f4f565b6143588185614f65565b9350614368818560208601615253565b614371816154cc565b840191505092915050565b61438581615220565b82525050565b61439481615232565b82525050565b60006143a582614f5a565b6143af8185614f76565b93506143bf818560208601615253565b6143c8816154cc565b840191505092915050565b60006143de82614f5a565b6143e88185614f87565b93506143f8818560208601615253565b80840191505092915050565b6000815461441181615286565b61441b8186614f87565b9450600182166000811461443657600181146144475761447a565b60ff1983168652818601935061447a565b61445085614f3a565b60005b8381101561447257815481890152600182019150602081019050614453565b838801955050505b50505092915050565b6000614490601883614f76565b915061449b826154dd565b602082019050919050565b60006144b3604383614f76565b91506144be82615506565b606082019050919050565b60006144d6601483614f76565b91506144e18261557b565b602082019050919050565b60006144f9603283614f76565b9150614504826155a4565b604082019050919050565b600061451c602683614f76565b9150614527826155f3565b604082019050919050565b600061453f602583614f76565b915061454a82615642565b604082019050919050565b6000614562601c83614f76565b915061456d82615691565b602082019050919050565b6000614585600e83614f76565b9150614590826156ba565b602082019050919050565b60006145a8602483614f76565b91506145b3826156e3565b604082019050919050565b60006145cb601983614f76565b91506145d682615732565b602082019050919050565b60006145ee603383614f76565b91506145f98261575b565b604082019050919050565b6000614611603e83614f76565b915061461c826157aa565b604082019050919050565b6000614634603783614f76565b915061463f826157f9565b604082019050919050565b6000614657602c83614f76565b915061466282615848565b604082019050919050565b600061467a601283614f76565b915061468582615897565b602082019050919050565b600061469d601083614f76565b91506146a8826158c0565b602082019050919050565b60006146c0602983614f76565b91506146cb826158e9565b604082019050919050565b60006146e3603883614f76565b91506146ee82615938565b604082019050919050565b6000614706602983614f76565b915061471182615987565b604082019050919050565b6000614729602083614f76565b9150614734826159d6565b602082019050919050565b600061474c602c83614f76565b9150614757826159ff565b604082019050919050565b600061476f602083614f76565b915061477a82615a4e565b602082019050919050565b6000614792602483614f76565b915061479d82615a77565b604082019050919050565b60006147b5601c83614f76565b91506147c082615ac6565b602082019050919050565b60006147d8602183614f76565b91506147e382615aef565b604082019050919050565b60006147fb603183614f76565b915061480682615b3e565b604082019050919050565b600061481e603883614f76565b915061482982615b8d565b604082019050919050565b6000614841601883614f76565b915061484c82615bdc565b602082019050919050565b6000614864601583614f76565b915061486f82615c05565b602082019050919050565b614883816151f5565b82525050565b614892816151ff565b82525050565b6148a181615213565b82525050565b60006148b38285614404565b91506148bf82846143d3565b91508190509392505050565b60006020820190506148e06000830184614316565b92915050565b60006040820190506148fb6000830185614316565b6149086020830184614316565b9392505050565b60006080820190506149246000830187614316565b6149316020830186614316565b61493e604083018561487a565b81810360608301526149508184614343565b905095945050505050565b60006020820190506149706000830184614325565b92915050565b600060808201905061498b6000830187614334565b6149986020830186614898565b6149a56040830185614334565b6149b26060830184614334565b95945050505050565b60006040820190506149d0600083018561437c565b6149dd6020830184614316565b9392505050565b60006020820190506149f9600083018461438b565b92915050565b6000606082019050614a14600083018661438b565b614a216020830185614889565b614a2e6040830184614316565b949350505050565b60006020820190508181036000830152614a50818461439a565b905092915050565b60006040820190508181036000830152614a72818561439a565b9050614a816020830184614316565b9392505050565b60006020820190508181036000830152614aa181614483565b9050919050565b60006020820190508181036000830152614ac1816144a6565b9050919050565b60006020820190508181036000830152614ae1816144c9565b9050919050565b60006020820190508181036000830152614b01816144ec565b9050919050565b60006020820190508181036000830152614b218161450f565b9050919050565b60006020820190508181036000830152614b4181614532565b9050919050565b60006020820190508181036000830152614b6181614555565b9050919050565b60006020820190508181036000830152614b8181614578565b9050919050565b60006020820190508181036000830152614ba18161459b565b9050919050565b60006020820190508181036000830152614bc1816145be565b9050919050565b60006020820190508181036000830152614be1816145e1565b9050919050565b60006020820190508181036000830152614c0181614604565b9050919050565b60006020820190508181036000830152614c2181614627565b9050919050565b60006020820190508181036000830152614c418161464a565b9050919050565b60006020820190508181036000830152614c618161466d565b9050919050565b60006020820190508181036000830152614c8181614690565b9050919050565b60006020820190508181036000830152614ca1816146b3565b9050919050565b60006020820190508181036000830152614cc1816146d6565b9050919050565b60006020820190508181036000830152614ce1816146f9565b9050919050565b60006020820190508181036000830152614d018161471c565b9050919050565b60006020820190508181036000830152614d218161473f565b9050919050565b60006020820190508181036000830152614d4181614762565b9050919050565b60006020820190508181036000830152614d6181614785565b9050919050565b60006020820190508181036000830152614d81816147a8565b9050919050565b60006020820190508181036000830152614da1816147cb565b9050919050565b60006020820190508181036000830152614dc1816147ee565b9050919050565b60006020820190508181036000830152614de181614811565b9050919050565b60006020820190508181036000830152614e0181614834565b9050919050565b60006020820190508181036000830152614e2181614857565b9050919050565b6000602082019050614e3d600083018461487a565b92915050565b6000604082019050614e58600083018561487a565b614e656020830184614316565b9392505050565b6000602082019050614e816000830184614889565b92915050565b6000614e91614ea2565b9050614e9d82826152b8565b919050565b6000604051905090565b600067ffffffffffffffff821115614ec757614ec661547f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614ef357614ef261547f565b5b614efc826154cc565b9050602081019050919050565b600067ffffffffffffffff821115614f2457614f2361547f565b5b614f2d826154cc565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f9d826151f5565b9150614fa8836151f5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614fdd57614fdc615394565b5b828201905092915050565b6000614ff3826151ff565b9150614ffe836151ff565b92508267ffffffffffffffff0382111561501b5761501a615394565b5b828201905092915050565b6000615031826151f5565b915061503c836151f5565b92508261504c5761504b6153c3565b5b828204905092915050565b6000615062826151f5565b915061506d836151f5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156150a6576150a5615394565b5b828202905092915050565b60006150bc826151ff565b91506150c7836151ff565b92508167ffffffffffffffff04831182151516156150e8576150e7615394565b5b828202905092915050565b60006150fe826151f5565b9150615109836151f5565b92508282101561511c5761511b615394565b5b828203905092915050565b6000615132826151ff565b915061513d836151ff565b9250828210156151505761514f615394565b5b828203905092915050565b6000615166826151d5565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008190506151bd82615c2e565b919050565b60008190506151d082615c42565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b600061522b826151af565b9050919050565b600061523d826151c2565b9050919050565b82818337600083830152505050565b60005b83811015615271578082015181840152602081019050615256565b83811115615280576000848401525b50505050565b6000600282049050600182168061529e57607f821691505b602082108114156152b2576152b1615421565b5b50919050565b6152c1826154cc565b810181811067ffffffffffffffff821117156152e0576152df61547f565b5b80604052505050565b60006152f4826151f5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561532757615326615394565b5b600182019050919050565b600061533d826151ff565b915067ffffffffffffffff82141561535857615357615394565b5b600182019050919050565b600061536e826151f5565b9150615379836151f5565b925082615389576153886153c3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f4d617820737570706c7920746f206d696e74207065722061646472657373206460008201527f7572696e6720707269766174652073616c6520686173206265656e207265616360208201527f6865640000000000000000000000000000000000000000000000000000000000604082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e76616c696420636f75706f6e000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4d617820737570706c79206c696d697420726561636865642c20706c6561736560008201527f20726564756365206d696e7420616d6f756e7400000000000000000000000000602082015250565b7f4d617820737570706c7920746f206d696e74207065722061646472657373206460008201527f7572696e672070726573616c6520686173206265656e20726561636865640000602082015250565b7f4d617820737570706c7920746f206d696e7420647572696e672070726976617460008201527f652073616c6520686173206265656e2072656163686564000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20517565727920666f72206e6f6e2d6578697374656e74207460008201527f6f6b656e00000000000000000000000000000000000000000000000000000000602082015250565b7f4d6178206d696e74207065722061646472657373207265616368656400000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4d617820737570706c7920746f206d696e7420666f722066726565207065722060008201527f6164647265737320686173206265656e20726561636865640000000000000000602082015250565b7f4d617820737570706c79206c696d697420726561636865640000000000000000600082015250565b7f53616c65206973206e6f7420617661696c61626c650000000000000000000000600082015250565b60038110615c3f57615c3e6153f2565b5b50565b60048110615c5357615c526153f2565b5b50565b615c5f8161515b565b8114615c6a57600080fd5b50565b615c768161516d565b8114615c8157600080fd5b50565b615c8d81615179565b8114615c9857600080fd5b50565b615ca481615183565b8114615caf57600080fd5b50565b60048110615cbf57600080fd5b50565b615ccb816151f5565b8114615cd657600080fd5b50565b615ce2816151ff565b8114615ced57600080fd5b50565b615cf981615213565b8114615d0457600080fd5b5056fea264697066735822122095b89b193d103433650b3dd3715c183002a4b5fbcda26cb812bdf36becb506ee64736f6c63430008070033697066733a2f2f516d6252766f6b665a644c6d435267556a5a7a6f7a51504a6942387366656646573568513373454a7171684e61482f

Deployed Bytecode

0x60806040526004361061025c5760003560e01c806370a0823111610144578063ad5f9eb8116100b6578063d5abeb011161007a578063d5abeb01146108bb578063d66b3eda146108e6578063e7ee105314610923578063e985e9c51461094c578063f2fde38b14610989578063f3644246146109b25761025c565b8063ad5f9eb8146107d8578063b1c9fe6e14610801578063b88d4fde1461082c578063ba24bbe914610855578063c87b56dd1461087e5761025c565b806395d89b411161010857806395d89b41146106c857806398bc5cc8146106f35780639da5b5c214610730578063a0bcfc7f1461075b578063a22cb46514610784578063a4cfd20a146107ad5761025c565b806370a0823114610607578063715018a6146106445780638456cb591461065b5780638da5cb5b146106725780639358928b1461069d5761025c565b806323b872dd116101dd57806342842e0e116101a157806342842e0e146104f9578063559f184a146105225780635a4da0821461054b5780635c975abb146105745780636352211e1461059f5780636817c76c146105dc5761025c565b806323b872dd146104685780633370e34c146104915780633b79a6ba146104bc5780633ccfd60b146104d85780633f4ba83a146104e25761025c565b806311177aea1161022457806311177aea1461034b578063145e44221461038857806317f24d24146103b1578063183bbe80146103ee5780631d7615c71461042b5761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b3146103065780630ebeccea1461032f575b600080fd5b34801561026d57600080fd5b506102886004803603810190610283919061416c565b6109db565b604051610295919061495b565b60405180910390f35b3480156102aa57600080fd5b506102b3610abd565b6040516102c09190614a36565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb919061423c565b610b4f565b6040516102fd91906148cb565b60405180910390f35b34801561031257600080fd5b5061032d600480360381019061032891906140d0565b610bd4565b005b6103496004803603810190610344919061420f565b610cec565b005b34801561035757600080fd5b50610372600480360381019061036d9190613f4d565b610fa1565b60405161037f9190614e28565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa9190614269565b610fb9565b005b3480156103bd57600080fd5b506103d860048036038101906103d39190613f4d565b611061565b6040516103e59190614e28565b60405180910390f35b3480156103fa57600080fd5b5061041560048036038101906104109190613f4d565b611145565b60405161042291906148cb565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d9190613f4d565b611267565b60405161045f9190614e28565b60405180910390f35b34801561047457600080fd5b5061048f600480360381019061048a9190613fba565b61127f565b005b34801561049d57600080fd5b506104a66112df565b6040516104b39190614a36565b60405180910390f35b6104d660048036038101906104d191906142d6565b611371565b005b6104e0611ab9565b005b3480156104ee57600080fd5b506104f7611bbd565b005b34801561050557600080fd5b50610520600480360381019061051b9190613fba565b611c8a565b005b34801561052e57600080fd5b5061054960048036038101906105449190614110565b611caa565b005b34801561055757600080fd5b50610572600480360381019061056d9190614296565b611e29565b005b34801561058057600080fd5b50610589611f37565b604051610596919061495b565b60405180910390f35b3480156105ab57600080fd5b506105c660048036038101906105c1919061423c565b611f4e565b6040516105d391906148cb565b60405180910390f35b3480156105e857600080fd5b506105f1612000565b6040516105fe9190614e6c565b60405180910390f35b34801561061357600080fd5b5061062e60048036038101906106299190613f4d565b61201a565b60405161063b9190614e28565b60405180910390f35b34801561065057600080fd5b506106596120d2565b005b34801561066757600080fd5b5061067061215a565b005b34801561067e57600080fd5b50610687612228565b60405161069491906148cb565b60405180910390f35b3480156106a957600080fd5b506106b2612252565b6040516106bf9190614e28565b60405180910390f35b3480156106d457600080fd5b506106dd612263565b6040516106ea9190614a36565b60405180910390f35b3480156106ff57600080fd5b5061071a60048036038101906107159190613f4d565b6122f5565b6040516107279190614e28565b60405180910390f35b34801561073c57600080fd5b5061074561230d565b6040516107529190614e28565b60405180910390f35b34801561076757600080fd5b50610782600480360381019061077d91906141c6565b612356565b005b34801561079057600080fd5b506107ab60048036038101906107a69190614090565b612425565b005b3480156107b957600080fd5b506107c261243b565b6040516107cf91906148cb565b60405180910390f35b3480156107e457600080fd5b506107ff60048036038101906107fa9190614269565b612465565b005b34801561080d57600080fd5b5061081661250d565b60405161082391906149e4565b60405180910390f35b34801561083857600080fd5b50610853600480360381019061084e919061400d565b612520565b005b34801561086157600080fd5b5061087c60048036038101906108779190614269565b612582565b005b34801561088a57600080fd5b506108a560048036038101906108a0919061423c565b61262a565b6040516108b29190614a36565b60405180910390f35b3480156108c757600080fd5b506108d06126d2565b6040516108dd9190614e6c565b60405180910390f35b3480156108f257600080fd5b5061090d60048036038101906109089190613f4d565b6126d8565b60405161091a9190614e28565b60405180910390f35b34801561092f57600080fd5b5061094a60048036038101906109459190614269565b6129ba565b005b34801561095857600080fd5b50610973600480360381019061096e9190613f7a565b612a61565b604051610980919061495b565b60405180910390f35b34801561099557600080fd5b506109b060048036038101906109ab9190613f4d565b612af5565b005b3480156109be57600080fd5b506109d960048036038101906109d49190614269565b612bed565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aa657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ab65750610ab582612c95565b5b9050919050565b606060008054610acc90615286565b80601f0160208091040260200160405190810160405280929190818152602001828054610af890615286565b8015610b455780601f10610b1a57610100808354040283529160200191610b45565b820191906000526020600020905b815481529060010190602001808311610b2857829003601f168201915b5050505050905090565b6000610b5a82612cff565b610b99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9090614d08565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bdf82611f4e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4790614d88565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c6f612d6b565b73ffffffffffffffffffffffffffffffffffffffff161480610c9e5750610c9d81610c98612d6b565b612a61565b5b610cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd490614ca8565b60405180910390fd5b610ce78383612d73565b505050565b610cf4611f37565b15610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2b90614c68565b60405180910390fd5b600380811115610d4757610d466153f2565b5b600f60009054906101000a900460ff166003811115610d6957610d686153f2565b5b14610da9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da090614e08565b60405180910390fd5b6000610db56007612e2c565b90506000600233604051602001610dcd9291906149bb565b604051602081830303815290604052805190602001209050610def8184612e3a565b610e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2590614b68565b60405180910390fd5b600860189054906101000a900467ffffffffffffffff1667ffffffffffffffff16600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec690614dc8565b60405180910390fd5b6103e867ffffffffffffffff16600183610ee99190614f92565b1115610f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2190614de8565b60405180910390fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610f7a906152e9565b9190505550610f896007612f64565b610f9c33610f976007612e2c565b612f7a565b505050565b600c6020528060005260406000206000915090505481565b610fc1612d6b565b73ffffffffffffffffffffffffffffffffffffffff16610fdf612228565b73ffffffffffffffffffffffffffffffffffffffff1614611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102c90614d28565b60405180910390fd5b80600860006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600860189054906101000a900467ffffffffffffffff1667ffffffffffffffff161061113b57600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600860189054906101000a900467ffffffffffffffff1667ffffffffffffffff1661113491906150f3565b9050611140565b600090505b919050565b600061114f612d6b565b73ffffffffffffffffffffffffffffffffffffffff1661116d612228565b73ffffffffffffffffffffffffffffffffffffffff16146111c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ba90614d28565b60405180910390fd5b81600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fa5d71a67cfb62101dba4597acd23e775be9567b0b5924ed0d91607278a2ae6aa82336040516112359291906148e6565b60405180910390a1600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600e6020528060005260406000206000915090505481565b61129061128a612d6b565b82612f98565b6112cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c690614da8565b60405180910390fd5b6112da838383613076565b505050565b6060600a80546112ee90615286565b80601f016020809104026020016040519081016040528092919081815260200182805461131a90615286565b80156113675780601f1061133c57610100808354040283529160200191611367565b820191906000526020600020905b81548152906001019060200180831161134a57829003601f168201915b5050505050905090565b611379611f37565b156113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090614c68565b60405180910390fd5b60006113c56007612e2c565b9050600060038111156113db576113da6153f2565b5b600f60009054906101000a900460ff1660038111156113fd576113fc6153f2565b5b141561143e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143590614e08565b60405180910390fd5b60016003811115611452576114516153f2565b5b600f60009054906101000a900460ff166003811115611474576114736153f2565b5b1415611639576000803360405160200161148f9291906149bb565b6040516020818303038152906040528051906020012090506114b18184612e3a565b6114f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e790614b68565b60405180910390fd5b60088054906101000a900467ffffffffffffffff1667ffffffffffffffff168467ffffffffffffffff16600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115649190614f92565b11156115a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159c90614aa8565b60405180910390fd5b600960009054906101000a900467ffffffffffffffff1667ffffffffffffffff1684600960089054906101000a900467ffffffffffffffff166115e89190614fe8565b67ffffffffffffffff161115611633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162a90614c08565b60405180910390fd5b506117a6565b6002600381111561164d5761164c6153f2565b5b600f60009054906101000a900460ff16600381111561166f5761166e6153f2565b5b14156117a557600060013360405160200161168b9291906149bb565b6040516020818303038152906040528051906020012090506116ad8184612e3a565b6116ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e390614b68565b60405180910390fd5b600860109054906101000a900467ffffffffffffffff1667ffffffffffffffff168467ffffffffffffffff16600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117629190614f92565b11156117a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179a90614be8565b60405180910390fd5b505b5b6103e867ffffffffffffffff168367ffffffffffffffff16826117c99190614f92565b111561180a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180190614de8565b60405180910390fd5b600860009054906101000a900467ffffffffffffffff1667ffffffffffffffff168367ffffffffffffffff1661183f3361201a565b6118499190614f92565b111561188a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188190614d68565b60405180910390fd5b600960109054906101000a900467ffffffffffffffff16836118ac91906150b1565b67ffffffffffffffff163410156118f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ef90614c48565b60405180910390fd5b60005b8367ffffffffffffffff16811015611ab35760016003811115611921576119206153f2565b5b600f60009054906101000a900460ff166003811115611943576119426153f2565b5b14156119f0576009600881819054906101000a900467ffffffffffffffff168092919061196f90615332565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906119e6906152e9565b9190505550611a83565b60026003811115611a0457611a036153f2565b5b600f60009054906101000a900460ff166003811115611a2657611a256153f2565b5b1415611a8257600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611a7c906152e9565b91905055505b5b611a8d6007612f64565b611aa033611a9b6007612e2c565b612f7a565b8080611aab906152e9565b9150506118fb565b50505050565b611ac1612d6b565b73ffffffffffffffffffffffffffffffffffffffff16611adf612228565b73ffffffffffffffffffffffffffffffffffffffff1614611b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2c90614d28565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611b80573d6000803e3d6000fd5b507fb0caa7e5a1709d95503ec9da196222012fad8495f101214d86c3b72ce101810f8133604051611bb2929190614e43565b60405180910390a150565b611bc5612d6b565b73ffffffffffffffffffffffffffffffffffffffff16611be3612228565b73ffffffffffffffffffffffffffffffffffffffff1614611c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3090614d28565b60405180910390fd5b611c41611f37565b611c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7790614ac8565b60405180910390fd5b611c886132dd565b565b611ca583838360405180602001604052806000815250612520565b505050565b611cb2612d6b565b73ffffffffffffffffffffffffffffffffffffffff16611cd0612228565b73ffffffffffffffffffffffffffffffffffffffff1614611d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1d90614d28565b60405180910390fd5b6000611d326007612e2c565b90506103e867ffffffffffffffff168267ffffffffffffffff168451611d589190615057565b82611d639190614f92565b1115611da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9b90614bc8565b60405180910390fd5b60005b8351811015611e235760005b8367ffffffffffffffff16811015611e0f57611dcf6007612f64565b611dfc858381518110611de557611de4615450565b5b6020026020010151611df76007612e2c565b612f7a565b8080611e07906152e9565b915050611db3565b508080611e1b906152e9565b915050611da7565b50505050565b611e31612d6b565b73ffffffffffffffffffffffffffffffffffffffff16611e4f612228565b73ffffffffffffffffffffffffffffffffffffffff1614611ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9c90614d28565b60405180910390fd5b80600f60006101000a81548160ff02191690836003811115611eca57611ec96153f2565b5b021790555081600960106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f3a5a14e930d7aa110c97704c49b983c99864591e183f425a5a9940f1b388a833818333604051611f2b939291906149ff565b60405180910390a15050565b6000600660009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fee90614cc8565b60405180910390fd5b80915050919050565b600960109054906101000a900467ffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561208b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208290614c88565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6120da612d6b565b73ffffffffffffffffffffffffffffffffffffffff166120f8612228565b73ffffffffffffffffffffffffffffffffffffffff161461214e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214590614d28565b60405180910390fd5b612158600061337f565b565b612162612d6b565b73ffffffffffffffffffffffffffffffffffffffff16612180612228565b73ffffffffffffffffffffffffffffffffffffffff16146121d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cd90614d28565b60405180910390fd5b6121de611f37565b1561221e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221590614c68565b60405180910390fd5b612226613445565b565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061225e6007612e2c565b905090565b60606001805461227290615286565b80601f016020809104026020016040519081016040528092919081815260200182805461229e90615286565b80156122eb5780601f106122c0576101008083540402835291602001916122eb565b820191906000526020600020905b8154815290600101906020018083116122ce57829003601f168201915b5050505050905090565b600d6020528060005260406000206000915090505481565b6000600960089054906101000a900467ffffffffffffffff16600960009054906101000a900467ffffffffffffffff166123479190615127565b67ffffffffffffffff16905090565b61235e612d6b565b73ffffffffffffffffffffffffffffffffffffffff1661237c612228565b73ffffffffffffffffffffffffffffffffffffffff16146123d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c990614d28565b60405180910390fd5b80600a90805190602001906123e8929190613c0b565b507fc7908db8c8588ac430ee4efe758e7ba70a0d22e32a138b548fd0d34fa8a48395813360405161241a929190614a58565b60405180910390a150565b612437612430612d6b565b83836134e8565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61246d612d6b565b73ffffffffffffffffffffffffffffffffffffffff1661248b612228565b73ffffffffffffffffffffffffffffffffffffffff16146124e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d890614d28565b60405180910390fd5b80600860106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b600f60009054906101000a900460ff1681565b61253161252b612d6b565b83612f98565b612570576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256790614da8565b60405180910390fd5b61257c84848484613655565b50505050565b61258a612d6b565b73ffffffffffffffffffffffffffffffffffffffff166125a8612228565b73ffffffffffffffffffffffffffffffffffffffff16146125fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f590614d28565b60405180910390fd5b80600960006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b606061263582612cff565b612674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266b90614d48565b60405180910390fd5b6000600a805461268390615286565b90501161269f57604051806020016040528060008152506126cb565b600a6126aa836136b1565b6040516020016126bb9291906148a7565b6040516020818303038152906040525b9050919050565b6103e881565b6000600160038111156126ee576126ed6153f2565b5b600f60009054906101000a900460ff1660038111156127105761270f6153f2565b5b14156127ef57600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460088054906101000a900467ffffffffffffffff1667ffffffffffffffff16106127ea57600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460088054906101000a900467ffffffffffffffff1667ffffffffffffffff166127e391906150f3565b90506129b5565b6129b0565b60026003811115612803576128026153f2565b5b600f60009054906101000a900460ff166003811115612825576128246153f2565b5b141561290857600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600860109054906101000a900467ffffffffffffffff1667ffffffffffffffff161061290357600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600860109054906101000a900467ffffffffffffffff1667ffffffffffffffff166128fc91906150f3565b90506129b5565b6129af565b60038081111561291b5761291a6153f2565b5b600f60009054906101000a900460ff16600381111561293d5761293c6153f2565b5b14156129ae5761294c8261201a565b600860009054906101000a900467ffffffffffffffff1667ffffffffffffffff16106129ad5761297b8261201a565b600860009054906101000a900467ffffffffffffffff1667ffffffffffffffff166129a691906150f3565b90506129b5565b5b5b5b600090505b919050565b6129c2612d6b565b73ffffffffffffffffffffffffffffffffffffffff166129e0612228565b73ffffffffffffffffffffffffffffffffffffffff1614612a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2d90614d28565b60405180910390fd5b806008806101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612afd612d6b565b73ffffffffffffffffffffffffffffffffffffffff16612b1b612228565b73ffffffffffffffffffffffffffffffffffffffff1614612b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6890614d28565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd890614b08565b60405180910390fd5b612bea8161337f565b50565b612bf5612d6b565b73ffffffffffffffffffffffffffffffffffffffff16612c13612228565b73ffffffffffffffffffffffffffffffffffffffff1614612c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6090614d28565b60405180910390fd5b80600960086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612de683611f4e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60008060018484604001518560000151866020015160405160008152602001604052604051612e6c9493929190614976565b6020604051602081039080840390855afa158015612e8e573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0190614a88565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161491505092915050565b6001816000016000828254019250508190555050565b612f94828260405180602001604052806000815250613812565b5050565b6000612fa382612cff565b612fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd990614c28565b60405180910390fd5b6000612fed83611f4e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061302f575061302e8185612a61565b5b8061306d57508373ffffffffffffffffffffffffffffffffffffffff1661305584610b4f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661309682611f4e565b73ffffffffffffffffffffffffffffffffffffffff16146130ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e390614b28565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561315c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315390614b88565b60405180910390fd5b61316783838361386d565b613172600082612d73565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131c291906150f3565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132199190614f92565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46132d8838383613872565b505050565b6132e5611f37565b613324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331b90614ac8565b60405180910390fd5b6000600660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa613368612d6b565b60405161337591906148cb565b60405180910390a1565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61344d611f37565b1561348d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348490614c68565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586134d1612d6b565b6040516134de91906148cb565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161354e90614ba8565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051613648919061495b565b60405180910390a3505050565b613660848484613076565b61366c84848484613877565b6136ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136a290614ae8565b60405180910390fd5b50505050565b606060008214156136f9576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061380d565b600082905060005b6000821461372b578080613714906152e9565b915050600a826137249190615026565b9150613701565b60008167ffffffffffffffff8111156137475761374661547f565b5b6040519080825280601f01601f1916602001820160405280156137795781602001600182028036833780820191505090505b5090505b600085146138065760018261379291906150f3565b9150600a856137a19190615363565b60306137ad9190614f92565b60f81b8183815181106137c3576137c2615450565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856137ff9190615026565b945061377d565b8093505050505b919050565b61381c8383613a0e565b6138296000848484613877565b613868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161385f90614ae8565b60405180910390fd5b505050565b505050565b505050565b60006138988473ffffffffffffffffffffffffffffffffffffffff16613be8565b15613a01578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026138c1612d6b565b8786866040518563ffffffff1660e01b81526004016138e3949392919061490f565b602060405180830381600087803b1580156138fd57600080fd5b505af192505050801561392e57506040513d601f19601f8201168201806040525081019061392b9190614199565b60015b6139b1573d806000811461395e576040519150601f19603f3d011682016040523d82523d6000602084013e613963565b606091505b506000815114156139a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139a090614ae8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613a06565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7590614ce8565b60405180910390fd5b613a8781612cff565b15613ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613abe90614b48565b60405180910390fd5b613ad36000838361386d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b239190614f92565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613be460008383613872565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054613c1790615286565b90600052602060002090601f016020900481019282613c395760008555613c80565b82601f10613c5257805160ff1916838001178555613c80565b82800160010185558215613c80579182015b82811115613c7f578251825591602001919060010190613c64565b5b509050613c8d9190613c91565b5090565b5b80821115613caa576000816000905550600101613c92565b5090565b6000613cc1613cbc84614eac565b614e87565b90508083825260208201905082856020860282011115613ce457613ce36154b8565b5b60005b85811015613d145781613cfa8882613da2565b845260208401935060208301925050600181019050613ce7565b5050509392505050565b6000613d31613d2c84614ed8565b614e87565b905082815260208101848484011115613d4d57613d4c6154bd565b5b613d58848285615244565b509392505050565b6000613d73613d6e84614f09565b614e87565b905082815260208101848484011115613d8f57613d8e6154bd565b5b613d9a848285615244565b509392505050565b600081359050613db181615c56565b92915050565b600082601f830112613dcc57613dcb6154ae565b5b8135613ddc848260208601613cae565b91505092915050565b600081359050613df481615c6d565b92915050565b600081359050613e0981615c84565b92915050565b600081359050613e1e81615c9b565b92915050565b600081519050613e3381615c9b565b92915050565b600082601f830112613e4e57613e4d6154ae565b5b8135613e5e848260208601613d1e565b91505092915050565b600081359050613e7681615cb2565b92915050565b600082601f830112613e9157613e906154ae565b5b8135613ea1848260208601613d60565b91505092915050565b600060608284031215613ec057613ebf6154b3565b5b613eca6060614e87565b90506000613eda84828501613dfa565b6000830152506020613eee84828501613dfa565b6020830152506040613f0284828501613f38565b60408301525092915050565b600081359050613f1d81615cc2565b92915050565b600081359050613f3281615cd9565b92915050565b600081359050613f4781615cf0565b92915050565b600060208284031215613f6357613f626154c7565b5b6000613f7184828501613da2565b91505092915050565b60008060408385031215613f9157613f906154c7565b5b6000613f9f85828601613da2565b9250506020613fb085828601613da2565b9150509250929050565b600080600060608486031215613fd357613fd26154c7565b5b6000613fe186828701613da2565b9350506020613ff286828701613da2565b925050604061400386828701613f0e565b9150509250925092565b60008060008060808587031215614027576140266154c7565b5b600061403587828801613da2565b945050602061404687828801613da2565b935050604061405787828801613f0e565b925050606085013567ffffffffffffffff811115614078576140776154c2565b5b61408487828801613e39565b91505092959194509250565b600080604083850312156140a7576140a66154c7565b5b60006140b585828601613da2565b92505060206140c685828601613de5565b9150509250929050565b600080604083850312156140e7576140e66154c7565b5b60006140f585828601613da2565b925050602061410685828601613f0e565b9150509250929050565b60008060408385031215614127576141266154c7565b5b600083013567ffffffffffffffff811115614145576141446154c2565b5b61415185828601613db7565b925050602061416285828601613f23565b9150509250929050565b600060208284031215614182576141816154c7565b5b600061419084828501613e0f565b91505092915050565b6000602082840312156141af576141ae6154c7565b5b60006141bd84828501613e24565b91505092915050565b6000602082840312156141dc576141db6154c7565b5b600082013567ffffffffffffffff8111156141fa576141f96154c2565b5b61420684828501613e7c565b91505092915050565b600060608284031215614225576142246154c7565b5b600061423384828501613eaa565b91505092915050565b600060208284031215614252576142516154c7565b5b600061426084828501613f0e565b91505092915050565b60006020828403121561427f5761427e6154c7565b5b600061428d84828501613f23565b91505092915050565b600080604083850312156142ad576142ac6154c7565b5b60006142bb85828601613f23565b92505060206142cc85828601613e67565b9150509250929050565b600080608083850312156142ed576142ec6154c7565b5b60006142fb85828601613f23565b925050602061430c85828601613eaa565b9150509250929050565b61431f8161515b565b82525050565b61432e8161516d565b82525050565b61433d81615179565b82525050565b600061434e82614f4f565b6143588185614f65565b9350614368818560208601615253565b614371816154cc565b840191505092915050565b61438581615220565b82525050565b61439481615232565b82525050565b60006143a582614f5a565b6143af8185614f76565b93506143bf818560208601615253565b6143c8816154cc565b840191505092915050565b60006143de82614f5a565b6143e88185614f87565b93506143f8818560208601615253565b80840191505092915050565b6000815461441181615286565b61441b8186614f87565b9450600182166000811461443657600181146144475761447a565b60ff1983168652818601935061447a565b61445085614f3a565b60005b8381101561447257815481890152600182019150602081019050614453565b838801955050505b50505092915050565b6000614490601883614f76565b915061449b826154dd565b602082019050919050565b60006144b3604383614f76565b91506144be82615506565b606082019050919050565b60006144d6601483614f76565b91506144e18261557b565b602082019050919050565b60006144f9603283614f76565b9150614504826155a4565b604082019050919050565b600061451c602683614f76565b9150614527826155f3565b604082019050919050565b600061453f602583614f76565b915061454a82615642565b604082019050919050565b6000614562601c83614f76565b915061456d82615691565b602082019050919050565b6000614585600e83614f76565b9150614590826156ba565b602082019050919050565b60006145a8602483614f76565b91506145b3826156e3565b604082019050919050565b60006145cb601983614f76565b91506145d682615732565b602082019050919050565b60006145ee603383614f76565b91506145f98261575b565b604082019050919050565b6000614611603e83614f76565b915061461c826157aa565b604082019050919050565b6000614634603783614f76565b915061463f826157f9565b604082019050919050565b6000614657602c83614f76565b915061466282615848565b604082019050919050565b600061467a601283614f76565b915061468582615897565b602082019050919050565b600061469d601083614f76565b91506146a8826158c0565b602082019050919050565b60006146c0602983614f76565b91506146cb826158e9565b604082019050919050565b60006146e3603883614f76565b91506146ee82615938565b604082019050919050565b6000614706602983614f76565b915061471182615987565b604082019050919050565b6000614729602083614f76565b9150614734826159d6565b602082019050919050565b600061474c602c83614f76565b9150614757826159ff565b604082019050919050565b600061476f602083614f76565b915061477a82615a4e565b602082019050919050565b6000614792602483614f76565b915061479d82615a77565b604082019050919050565b60006147b5601c83614f76565b91506147c082615ac6565b602082019050919050565b60006147d8602183614f76565b91506147e382615aef565b604082019050919050565b60006147fb603183614f76565b915061480682615b3e565b604082019050919050565b600061481e603883614f76565b915061482982615b8d565b604082019050919050565b6000614841601883614f76565b915061484c82615bdc565b602082019050919050565b6000614864601583614f76565b915061486f82615c05565b602082019050919050565b614883816151f5565b82525050565b614892816151ff565b82525050565b6148a181615213565b82525050565b60006148b38285614404565b91506148bf82846143d3565b91508190509392505050565b60006020820190506148e06000830184614316565b92915050565b60006040820190506148fb6000830185614316565b6149086020830184614316565b9392505050565b60006080820190506149246000830187614316565b6149316020830186614316565b61493e604083018561487a565b81810360608301526149508184614343565b905095945050505050565b60006020820190506149706000830184614325565b92915050565b600060808201905061498b6000830187614334565b6149986020830186614898565b6149a56040830185614334565b6149b26060830184614334565b95945050505050565b60006040820190506149d0600083018561437c565b6149dd6020830184614316565b9392505050565b60006020820190506149f9600083018461438b565b92915050565b6000606082019050614a14600083018661438b565b614a216020830185614889565b614a2e6040830184614316565b949350505050565b60006020820190508181036000830152614a50818461439a565b905092915050565b60006040820190508181036000830152614a72818561439a565b9050614a816020830184614316565b9392505050565b60006020820190508181036000830152614aa181614483565b9050919050565b60006020820190508181036000830152614ac1816144a6565b9050919050565b60006020820190508181036000830152614ae1816144c9565b9050919050565b60006020820190508181036000830152614b01816144ec565b9050919050565b60006020820190508181036000830152614b218161450f565b9050919050565b60006020820190508181036000830152614b4181614532565b9050919050565b60006020820190508181036000830152614b6181614555565b9050919050565b60006020820190508181036000830152614b8181614578565b9050919050565b60006020820190508181036000830152614ba18161459b565b9050919050565b60006020820190508181036000830152614bc1816145be565b9050919050565b60006020820190508181036000830152614be1816145e1565b9050919050565b60006020820190508181036000830152614c0181614604565b9050919050565b60006020820190508181036000830152614c2181614627565b9050919050565b60006020820190508181036000830152614c418161464a565b9050919050565b60006020820190508181036000830152614c618161466d565b9050919050565b60006020820190508181036000830152614c8181614690565b9050919050565b60006020820190508181036000830152614ca1816146b3565b9050919050565b60006020820190508181036000830152614cc1816146d6565b9050919050565b60006020820190508181036000830152614ce1816146f9565b9050919050565b60006020820190508181036000830152614d018161471c565b9050919050565b60006020820190508181036000830152614d218161473f565b9050919050565b60006020820190508181036000830152614d4181614762565b9050919050565b60006020820190508181036000830152614d6181614785565b9050919050565b60006020820190508181036000830152614d81816147a8565b9050919050565b60006020820190508181036000830152614da1816147cb565b9050919050565b60006020820190508181036000830152614dc1816147ee565b9050919050565b60006020820190508181036000830152614de181614811565b9050919050565b60006020820190508181036000830152614e0181614834565b9050919050565b60006020820190508181036000830152614e2181614857565b9050919050565b6000602082019050614e3d600083018461487a565b92915050565b6000604082019050614e58600083018561487a565b614e656020830184614316565b9392505050565b6000602082019050614e816000830184614889565b92915050565b6000614e91614ea2565b9050614e9d82826152b8565b919050565b6000604051905090565b600067ffffffffffffffff821115614ec757614ec661547f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614ef357614ef261547f565b5b614efc826154cc565b9050602081019050919050565b600067ffffffffffffffff821115614f2457614f2361547f565b5b614f2d826154cc565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f9d826151f5565b9150614fa8836151f5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614fdd57614fdc615394565b5b828201905092915050565b6000614ff3826151ff565b9150614ffe836151ff565b92508267ffffffffffffffff0382111561501b5761501a615394565b5b828201905092915050565b6000615031826151f5565b915061503c836151f5565b92508261504c5761504b6153c3565b5b828204905092915050565b6000615062826151f5565b915061506d836151f5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156150a6576150a5615394565b5b828202905092915050565b60006150bc826151ff565b91506150c7836151ff565b92508167ffffffffffffffff04831182151516156150e8576150e7615394565b5b828202905092915050565b60006150fe826151f5565b9150615109836151f5565b92508282101561511c5761511b615394565b5b828203905092915050565b6000615132826151ff565b915061513d836151ff565b9250828210156151505761514f615394565b5b828203905092915050565b6000615166826151d5565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008190506151bd82615c2e565b919050565b60008190506151d082615c42565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b600061522b826151af565b9050919050565b600061523d826151c2565b9050919050565b82818337600083830152505050565b60005b83811015615271578082015181840152602081019050615256565b83811115615280576000848401525b50505050565b6000600282049050600182168061529e57607f821691505b602082108114156152b2576152b1615421565b5b50919050565b6152c1826154cc565b810181811067ffffffffffffffff821117156152e0576152df61547f565b5b80604052505050565b60006152f4826151f5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561532757615326615394565b5b600182019050919050565b600061533d826151ff565b915067ffffffffffffffff82141561535857615357615394565b5b600182019050919050565b600061536e826151f5565b9150615379836151f5565b925082615389576153886153c3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f4d617820737570706c7920746f206d696e74207065722061646472657373206460008201527f7572696e6720707269766174652073616c6520686173206265656e207265616360208201527f6865640000000000000000000000000000000000000000000000000000000000604082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e76616c696420636f75706f6e000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4d617820737570706c79206c696d697420726561636865642c20706c6561736560008201527f20726564756365206d696e7420616d6f756e7400000000000000000000000000602082015250565b7f4d617820737570706c7920746f206d696e74207065722061646472657373206460008201527f7572696e672070726573616c6520686173206265656e20726561636865640000602082015250565b7f4d617820737570706c7920746f206d696e7420647572696e672070726976617460008201527f652073616c6520686173206265656e2072656163686564000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20517565727920666f72206e6f6e2d6578697374656e74207460008201527f6f6b656e00000000000000000000000000000000000000000000000000000000602082015250565b7f4d6178206d696e74207065722061646472657373207265616368656400000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4d617820737570706c7920746f206d696e7420666f722066726565207065722060008201527f6164647265737320686173206265656e20726561636865640000000000000000602082015250565b7f4d617820737570706c79206c696d697420726561636865640000000000000000600082015250565b7f53616c65206973206e6f7420617661696c61626c650000000000000000000000600082015250565b60038110615c3f57615c3e6153f2565b5b50565b60048110615c5357615c526153f2565b5b50565b615c5f8161515b565b8114615c6a57600080fd5b50565b615c768161516d565b8114615c8157600080fd5b50565b615c8d81615179565b8114615c9857600080fd5b50565b615ca481615183565b8114615caf57600080fd5b50565b60048110615cbf57600080fd5b50565b615ccb816151f5565b8114615cd657600080fd5b50565b615ce2816151ff565b8114615ced57600080fd5b50565b615cf981615213565b8114615d0457600080fd5b5056fea264697066735822122095b89b193d103433650b3dd3715c183002a4b5fbcda26cb812bdf36becb506ee64736f6c63430008070033

Deployed Bytecode Sourcemap

52906:12069:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39730:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40674:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42234:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41757:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59931:803;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53900:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55718:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64536:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61365:226;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54018:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42984:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61860:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56942:2054;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63153:206;;;:::i;:::-;;62847:76;;;;;;;;;;;;;:::i;:::-;;43394:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59145:586;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54690:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19573:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40368:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53687:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40099:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17571:103;;;;;;;;;;;;;:::i;:::-;;62565:75;;;;;;;;;;;;;:::i;:::-;;16920:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64868:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40843:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53959:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63489:124;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56627:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42527:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61685:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55411:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54349:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43650:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56005:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62038:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53360:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63714:712;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55093:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42753:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17829:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56290:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39730:305;39832:4;39884:25;39869:40;;;:11;:40;;;;:105;;;;39941:33;39926:48;;;:11;:48;;;;39869:105;:158;;;;39991:36;40015:11;39991:23;:36::i;:::-;39869:158;39849:178;;39730:305;;;:::o;40674:100::-;40728:13;40761:5;40754:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40674:100;:::o;42234:221::-;42310:7;42338:16;42346:7;42338;:16::i;:::-;42330:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42423:15;:24;42439:7;42423:24;;;;;;;;;;;;;;;;;;;;;42416:31;;42234:221;;;:::o;41757:411::-;41838:13;41854:23;41869:7;41854:14;:23::i;:::-;41838:39;;41902:5;41896:11;;:2;:11;;;;41888:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;41996:5;41980:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;42005:37;42022:5;42029:12;:10;:12::i;:::-;42005:16;:37::i;:::-;41980:62;41958:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;42139:21;42148:2;42152:7;42139:8;:21::i;:::-;41827:341;41757:411;;:::o;59931:803::-;19899:8;:6;:8::i;:::-;19898:9;19890:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;60045:16:::1;60036:25:::0;::::1;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:25;;;;;;;;:::i;:::-;;;60028:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;60100:21;60124:18;:8;:16;:18::i;:::-;60100:42;;60153:14;60205:19;60226:10;60194:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60170:78;;;;;;60153:95;;60267:33;60285:6;60293;60267:17;:33::i;:::-;60259:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;60381:22;;;;;;;;;;;60352:51;;:14;:26;60367:10;60352:26;;;;;;;;;;;;;;;;:51;60330:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;53395:4;60520:30;;60536:1;60520:13;:17;;;;:::i;:::-;:30;;60498:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;60613:14;:26;60628:10;60613:26;;;;;;;;;;;;;;;;:28;;;;;;;;;:::i;:::-;;;;;;60652:20;:8;:18;:20::i;:::-;60683:41;60693:10;60705:18;:8;:16;:18::i;:::-;60683:9;:41::i;:::-;60017:717;;59931:803:::0;:::o;53900:52::-;;;;;;;;;;;;;;;;;:::o;55718:115::-;17151:12;:10;:12::i;:::-;17140:23;;:7;:5;:7::i;:::-;:23;;;17132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55822:3:::1;55801:18;;:24;;;;;;;;;;;;;;;;;;55718:115:::0;:::o;64536:239::-;64598:7;64648:14;:20;64663:4;64648:20;;;;;;;;;;;;;;;;64622:22;;;;;;;;;;;:46;;;64618:131;;64717:14;:20;64732:4;64717:20;;;;;;;;;;;;;;;;64692:22;;;;;;;;;;;:45;;;;;;:::i;:::-;64685:52;;;;64618:131;64766:1;64759:8;;64536:239;;;;:::o;61365:226::-;61441:7;17151:12;:10;:12::i;:::-;17140:23;;:7;:5;:7::i;:::-;:23;;;17132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61476:15:::1;61461:12;;:30;;;;;;;;;;;;;;;;;;61507:46;61525:15;61542:10;61507:46;;;;;;;:::i;:::-;;;;;;;;61571:12;;;;;;;;;;;61564:19;;61365:226:::0;;;:::o;54018:49::-;;;;;;;;;;;;;;;;;:::o;42984:339::-;43179:41;43198:12;:10;:12::i;:::-;43212:7;43179:18;:41::i;:::-;43171:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;43287:28;43297:4;43303:2;43307:7;43287:9;:28::i;:::-;42984:339;;;:::o;61860:90::-;61902:13;61935:7;61928:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61860:90;:::o;56942:2054::-;19899:8;:6;:8::i;:::-;19898:9;19890:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;57050:21:::1;57074:18;:8;:16;:18::i;:::-;57050:42;;57120:16;57111:25;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:25;;;;;;;;:::i;:::-;;;;57103:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;57186:17;57177:26;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;57173:1072;;;57220:14;57276:18:::0;57296:10:::1;57265:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57237:85;;;;;;57220:102;;57345:33;57363:6;57371;57345:17;:33::i;:::-;57337:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;57480:25;::::0;::::1;;;;;;;;57438:67;;57470:6;57438:38;;:17;:29;57456:10;57438:29;;;;;;;;;;;;;;;;:38;;;;:::i;:::-;:67;;57412:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;57679:15;;;;;;;;;;;57649:45;;57669:6;57649:17;;;;;;;;;;;:26;;;;:::i;:::-;:45;;;;57623:162;;;;;;;;;;;;:::i;:::-;;;;;;;;;57205:592;57173:1072;;;57816:17;57807:26;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;57803:442;;;57850:14;57906:18;57926:10;57895:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57867:85;;;;;;57850:102;;57975:33;57993:6;58001;57975:17;:33::i;:::-;57967:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;58110:25;;;;;;;;;;;58068:67;;58100:6;58068:38;;:17;:29;58086:10;58068:29;;;;;;;;;;;;;;;;:38;;;;:::i;:::-;:67;;58042:191;;;;;;;;;;;;:::i;:::-;;;;;;;;;57835:410;57803:442;57173:1072;53395:4;58279:35;;58295:6;58279:22;;:13;:22;;;;:::i;:::-;:35;;58257:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;58433:18;;;;;;;;;;;58399:52;;58423:6;58399:30;;:21;58409:10;58399:9;:21::i;:::-;:30;;;;:::i;:::-;:52;;58377:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;58550:9;;;;;;;;;;;58541:6;:18;;;;:::i;:::-;58528:31;;:9;:31;;58520:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;58600:9;58595:394;58619:6;58615:10;;:1;:10;58595:394;;;58660:17;58651:26;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;58647:240;;;58698:17;;:19;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;58736:17;:29;58754:10;58736:29;;;;;;;;;;;;;;;;:31;;;;;;;;;:::i;:::-;;;;;;58647:240;;;58802:17;58793:26;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;58789:98;;;58840:17;:29;58858:10;58840:29;;;;;;;;;;;;;;;;:31;;;;;;;;;:::i;:::-;;;;;;58789:98;58647:240;58901:20;:8;:18;:20::i;:::-;58936:41;58946:10;58958:18;:8;:16;:18::i;:::-;58936:9;:41::i;:::-;58627:3;;;;;:::i;:::-;;;;58595:394;;;;57039:1957;56942:2054:::0;;:::o;63153:206::-;17151:12;:10;:12::i;:::-;17140:23;;:7;:5;:7::i;:::-;:23;;;17132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63211:15:::1;63229:21;63211:39;;63269:10;63261:28;;:37;63290:7;63261:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;63314;63331:7;63340:10;63314:37;;;;;;;:::i;:::-;;;;;;;;63200:159;63153:206::o:0;62847:76::-;17151:12;:10;:12::i;:::-;17140:23;;:7;:5;:7::i;:::-;:23;;;17132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20176:8:::1;:6;:8::i;:::-;20168:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;62905:10:::2;:8;:10::i;:::-;62847:76::o:0;43394:185::-;43532:39;43549:4;43555:2;43559:7;43532:39;;;;;;;;;;;;:16;:39::i;:::-;43394:185;;;:::o;59145:586::-;17151:12;:10;:12::i;:::-;17140:23;;:7;:5;:7::i;:::-;:23;;;17132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59258:21:::1;59282:18;:8;:16;:18::i;:::-;59258:42;;53395:4;59333:63;;59376:6;59350:32;;:16;:23;:32;;;;:::i;:::-;59333:13;:50;;;;:::i;:::-;:63;;59311:164;;;;;;;;;;;;:::i;:::-;;;;;;;;;59491:6;59486:238;59507:16;:23;59503:1;:27;59486:238;;;59557:9;59552:161;59576:6;59572:10;;:1;:10;59552:161;;;59608:20;:8;:18;:20::i;:::-;59647:50;59657:16;59674:1;59657:19;;;;;;;;:::i;:::-;;;;;;;;59678:18;:8;:16;:18::i;:::-;59647:9;:50::i;:::-;59584:3;;;;;:::i;:::-;;;;59552:161;;;;59532:3;;;;;:::i;:::-;;;;59486:238;;;;59247:484;59145:586:::0;;:::o;54690:212::-;17151:12;:10;:12::i;:::-;17140:23;;:7;:5;:7::i;:::-;:23;;;17132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54794:6:::1;54786:5;;:14;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;54823:11;54811:9;;:23;;;;;;;;;;;;;;;;;;54850:44;54862:6;54870:11;54883:10;54850:44;;;;;;;;:::i;:::-;;;;;;;;54690:212:::0;;:::o;19573:86::-;19620:4;19644:7;;;;;;;;;;;19637:14;;19573:86;:::o;40368:239::-;40440:7;40460:13;40476:7;:16;40484:7;40476:16;;;;;;;;;;;;;;;;;;;;;40460:32;;40528:1;40511:19;;:5;:19;;;;40503:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40594:5;40587:12;;;40368:239;;;:::o;53687:36::-;;;;;;;;;;;;;:::o;40099:207::-;40171:7;40216:1;40199:19;;:5;:19;;;;40191:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40282:9;:16;40292:5;40282:16;;;;;;;;;;;;;;;;40275:23;;40099:207;;;:::o;17571:103::-;17151:12;:10;:12::i;:::-;17140:23;;:7;:5;:7::i;:::-;:23;;;17132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17636:30:::1;17663:1;17636:18;:30::i;:::-;17571:103::o:0;62565:75::-;17151:12;:10;:12::i;:::-;17140:23;;:7;:5;:7::i;:::-;:23;;;17132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19899:8:::1;:6;:8::i;:::-;19898:9;19890:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;62624:8:::2;:6;:8::i;:::-;62565:75::o:0;16920:87::-;16966:7;16993:6;;;;;;;;;;;16986:13;;16920:87;:::o;64868:102::-;64917:7;64944:18;:8;:16;:18::i;:::-;64937:25;;64868:102;:::o;40843:104::-;40899:13;40932:7;40925:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40843:104;:::o;53959:52::-;;;;;;;;;;;;;;;;;:::o;63489:124::-;63543:7;63588:17;;;;;;;;;;;63570:15;;;;;;;;;;;:35;;;;:::i;:::-;63563:42;;;;63489:124;:::o;56627:139::-;17151:12;:10;:12::i;:::-;17140:23;;:7;:5;:7::i;:::-;:23;;;17132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56716:3:::1;56706:7;:13;;;;;;;;;;;;:::i;:::-;;56735:23;56742:3;56747:10;56735:23;;;;;;;:::i;:::-;;;;;;;;56627:139:::0;:::o;42527:155::-;42622:52;42641:12;:10;:12::i;:::-;42655:8;42665;42622:18;:52::i;:::-;42527:155;;:::o;61685:93::-;61731:7;61758:12;;;;;;;;;;;61751:19;;61685:93;:::o;55411:129::-;17151:12;:10;:12::i;:::-;17140:23;;:7;:5;:7::i;:::-;:23;;;17132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55529:3:::1;55501:25;;:31;;;;;;;;;;;;;;;;;;55411:129:::0;:::o;54349:41::-;;;;;;;;;;;;;:::o;43650:328::-;43825:41;43844:12;:10;:12::i;:::-;43858:7;43825:18;:41::i;:::-;43817:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;43931:39;43945:4;43951:2;43955:7;43964:5;43931:13;:39::i;:::-;43650:328;;;;:::o;56005:109::-;17151:12;:10;:12::i;:::-;17140:23;;:7;:5;:7::i;:::-;:23;;;17132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56103:3:::1;56085:15;;:21;;;;;;;;;;;;;;;;;;56005:109:::0;:::o;62038:322::-;62122:13;62156:16;62164:7;62156;:16::i;:::-;62148:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;62264:1;62246:7;62240:21;;;;;:::i;:::-;;;:25;:112;;;;;;;;;;;;;;;;;62305:7;62314:18;:7;:16;:18::i;:::-;62288:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62240:112;62224:128;;62038:322;;;:::o;53360:39::-;53395:4;53360:39;:::o;63714:712::-;63772:7;63805:17;63796:26;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;63792:608;;;63872:17;:23;63890:4;63872:23;;;;;;;;;;;;;;;;63843:25;;;;;;;;;;:52;;;63839:151;;63951:17;:23;63969:4;63951:23;;;;;;;;;;;;;;;;63923:25;;;;;;;;;;:51;;;;;;:::i;:::-;63916:58;;;;63839:151;63792:608;;;64020:17;64011:26;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;64007:393;;;64087:17;:23;64105:4;64087:23;;;;;;;;;;;;;;;;64058:25;;;;;;;;;;;:52;;;64054:151;;64166:17;:23;64184:4;64166:23;;;;;;;;;;;;;;;;64138:25;;;;;;;;;;;:51;;;;;;:::i;:::-;64131:58;;;;64054:151;64007:393;;;64235:16;64226:25;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:25;;;;;;;;:::i;:::-;;;64222:178;;;64294:15;64304:4;64294:9;:15::i;:::-;64272:18;;;;;;;;;;;:37;;;64268:121;;64358:15;64368:4;64358:9;:15::i;:::-;64337:18;;;;;;;;;;;:36;;;;;;:::i;:::-;64330:43;;;;64268:121;64222:178;64007:393;63792:608;64417:1;64410:8;;63714:712;;;;:::o;55093:129::-;17151:12;:10;:12::i;:::-;17140:23;;:7;:5;:7::i;:::-;:23;;;17132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55211:3:::1;55183:25;::::0;:31:::1;;;;;;;;;;;;;;;;;;55093:129:::0;:::o;42753:164::-;42850:4;42874:18;:25;42893:5;42874:25;;;;;;;;;;;;;;;:35;42900:8;42874:35;;;;;;;;;;;;;;;;;;;;;;;;;42867:42;;42753:164;;;;:::o;17829:201::-;17151:12;:10;:12::i;:::-;17140:23;;:7;:5;:7::i;:::-;:23;;;17132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17938:1:::1;17918:22;;:8;:22;;;;17910:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;17994:28;18013:8;17994:18;:28::i;:::-;17829:201:::0;:::o;56290:113::-;17151:12;:10;:12::i;:::-;17140:23;;:7;:5;:7::i;:::-;:23;;;17132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56392:3:::1;56372:17;;:23;;;;;;;;;;;;;;;;;;56290:113:::0;:::o;32310:157::-;32395:4;32434:25;32419:40;;;:11;:40;;;;32412:47;;32310:157;;;:::o;45488:127::-;45553:4;45605:1;45577:30;;:7;:16;45585:7;45577:16;;;;;;;;;;;;;;;;;;;;;:30;;;;45570:37;;45488:127;;;:::o;15591:98::-;15644:7;15671:10;15664:17;;15591:98;:::o;49634:174::-;49736:2;49709:15;:24;49725:7;49709:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;49792:7;49788:2;49754:46;;49763:23;49778:7;49763:14;:23::i;:::-;49754:46;;;;;;;;;;;;49634:174;;:::o;12089:114::-;12154:7;12181;:14;;;12174:21;;12089:114;;;:::o;60817:331::-;60919:4;60936:14;60953:47;60963:6;60971;:8;;;60981:6;:8;;;60991:6;:8;;;60953:47;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60936:64;;61037:1;61019:20;;:6;:20;;;;61011:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;61128:12;;;;;;;;;;;61118:22;;:6;:22;;;61111:29;;;60817:331;;;;:::o;12211:127::-;12318:1;12300:7;:14;;;:19;;;;;;;;;;;12211:127;:::o;46472:110::-;46548:26;46558:2;46562:7;46548:26;;;;;;;;;;;;:9;:26::i;:::-;46472:110;;:::o;45782:348::-;45875:4;45900:16;45908:7;45900;:16::i;:::-;45892:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45976:13;45992:23;46007:7;45992:14;:23::i;:::-;45976:39;;46045:5;46034:16;;:7;:16;;;:52;;;;46054:32;46071:5;46078:7;46054:16;:32::i;:::-;46034:52;:87;;;;46114:7;46090:31;;:20;46102:7;46090:11;:20::i;:::-;:31;;;46034:87;46026:96;;;45782:348;;;;:::o;48891:625::-;49050:4;49023:31;;:23;49038:7;49023:14;:23::i;:::-;:31;;;49015:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;49129:1;49115:16;;:2;:16;;;;49107:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;49185:39;49206:4;49212:2;49216:7;49185:20;:39::i;:::-;49289:29;49306:1;49310:7;49289:8;:29::i;:::-;49350:1;49331:9;:15;49341:4;49331:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;49379:1;49362:9;:13;49372:2;49362:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;49410:2;49391:7;:16;49399:7;49391:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;49449:7;49445:2;49430:27;;49439:4;49430:27;;;;;;;;;;;;49470:38;49490:4;49496:2;49500:7;49470:19;:38::i;:::-;48891:625;;;:::o;20632:120::-;20176:8;:6;:8::i;:::-;20168:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;20701:5:::1;20691:7;;:15;;;;;;;;;;;;;;;;;;20722:22;20731:12;:10;:12::i;:::-;20722:22;;;;;;:::i;:::-;;;;;;;;20632:120::o:0;18190:191::-;18264:16;18283:6;;;;;;;;;;;18264:25;;18309:8;18300:6;;:17;;;;;;;;;;;;;;;;;;18364:8;18333:40;;18354:8;18333:40;;;;;;;;;;;;18253:128;18190:191;:::o;20373:118::-;19899:8;:6;:8::i;:::-;19898:9;19890:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;20443:4:::1;20433:7;;:14;;;;;;;;;;;;;;;;;;20463:20;20470:12;:10;:12::i;:::-;20463:20;;;;;;:::i;:::-;;;;;;;;20373:118::o:0;49950:315::-;50105:8;50096:17;;:5;:17;;;;50088:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;50192:8;50154:18;:25;50173:5;50154:25;;;;;;;;;;;;;;;:35;50180:8;50154:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;50238:8;50216:41;;50231:5;50216:41;;;50248:8;50216:41;;;;;;:::i;:::-;;;;;;;;49950:315;;;:::o;44860:::-;45017:28;45027:4;45033:2;45037:7;45017:9;:28::i;:::-;45064:48;45087:4;45093:2;45097:7;45106:5;45064:22;:48::i;:::-;45056:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;44860:315;;;;:::o;13100:723::-;13156:13;13386:1;13377:5;:10;13373:53;;;13404:10;;;;;;;;;;;;;;;;;;;;;13373:53;13436:12;13451:5;13436:20;;13467:14;13492:78;13507:1;13499:4;:9;13492:78;;13525:8;;;;;:::i;:::-;;;;13556:2;13548:10;;;;;:::i;:::-;;;13492:78;;;13580:19;13612:6;13602:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13580:39;;13630:154;13646:1;13637:5;:10;13630:154;;13674:1;13664:11;;;;;:::i;:::-;;;13741:2;13733:5;:10;;;;:::i;:::-;13720:2;:24;;;;:::i;:::-;13707:39;;13690:6;13697;13690:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;13770:2;13761:11;;;;;:::i;:::-;;;13630:154;;;13808:6;13794:21;;;;;13100:723;;;;:::o;46809:321::-;46939:18;46945:2;46949:7;46939:5;:18::i;:::-;46990:54;47021:1;47025:2;47029:7;47038:5;46990:22;:54::i;:::-;46968:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;46809:321;;;:::o;52201:126::-;;;;:::o;52712:125::-;;;;:::o;50830:799::-;50985:4;51006:15;:2;:13;;;:15::i;:::-;51002:620;;;51058:2;51042:36;;;51079:12;:10;:12::i;:::-;51093:4;51099:7;51108:5;51042:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51038:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51301:1;51284:6;:13;:18;51280:272;;;51327:60;;;;;;;;;;:::i;:::-;;;;;;;;51280:272;51502:6;51496:13;51487:6;51483:2;51479:15;51472:38;51038:529;51175:41;;;51165:51;;;:6;:51;;;;51158:58;;;;;51002:620;51606:4;51599:11;;50830:799;;;;;;;:::o;47466:439::-;47560:1;47546:16;;:2;:16;;;;47538:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;47619:16;47627:7;47619;:16::i;:::-;47618:17;47610:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;47681:45;47710:1;47714:2;47718:7;47681:20;:45::i;:::-;47756:1;47739:9;:13;47749:2;47739:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;47787:2;47768:7;:16;47776:7;47768:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;47832:7;47828:2;47807:33;;47824:1;47807:33;;;;;;;;;;;;47853:44;47881:1;47885:2;47889:7;47853:19;:44::i;:::-;47466:439;;:::o;22045:326::-;22105:4;22362:1;22340:7;:19;;;:23;22333:30;;22045:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:139::-;2309:5;2347:6;2334:20;2325:29;;2363:33;2390:5;2363:33;:::i;:::-;2263:139;;;;:::o;2408:137::-;2453:5;2491:6;2478:20;2469:29;;2507:32;2533:5;2507:32;:::i;:::-;2408:137;;;;:::o;2551:141::-;2607:5;2638:6;2632:13;2623:22;;2654:32;2680:5;2654:32;:::i;:::-;2551:141;;;;:::o;2711:338::-;2766:5;2815:3;2808:4;2800:6;2796:17;2792:27;2782:122;;2823:79;;:::i;:::-;2782:122;2940:6;2927:20;2965:78;3039:3;3031:6;3024:4;3016:6;3012:17;2965:78;:::i;:::-;2956:87;;2772:277;2711:338;;;;:::o;3055:167::-;3115:5;3153:6;3140:20;3131:29;;3169:47;3210:5;3169:47;:::i;:::-;3055:167;;;;:::o;3242:340::-;3298:5;3347:3;3340:4;3332:6;3328:17;3324:27;3314:122;;3355:79;;:::i;:::-;3314:122;3472:6;3459:20;3497:79;3572:3;3564:6;3557:4;3549:6;3545:17;3497:79;:::i;:::-;3488:88;;3304:278;3242:340;;;;:::o;3618:723::-;3691:5;3735:4;3723:9;3718:3;3714:19;3710:30;3707:117;;;3743:79;;:::i;:::-;3707:117;3842:21;3858:4;3842:21;:::i;:::-;3833:30;;3919:1;3959:49;4004:3;3995:6;3984:9;3980:22;3959:49;:::i;:::-;3952:4;3945:5;3941:16;3934:75;3873:147;4076:2;4117:49;4162:3;4153:6;4142:9;4138:22;4117:49;:::i;:::-;4110:4;4103:5;4099:16;4092:75;4030:148;4234:2;4275:47;4318:3;4309:6;4298:9;4294:22;4275:47;:::i;:::-;4268:4;4261:5;4257:16;4250:73;4188:146;3618:723;;;;:::o;4347:139::-;4393:5;4431:6;4418:20;4409:29;;4447:33;4474:5;4447:33;:::i;:::-;4347:139;;;;:::o;4492:137::-;4537:5;4575:6;4562:20;4553:29;;4591:32;4617:5;4591:32;:::i;:::-;4492:137;;;;:::o;4635:135::-;4679:5;4717:6;4704:20;4695:29;;4733:31;4758:5;4733:31;:::i;:::-;4635:135;;;;:::o;4776:329::-;4835:6;4884:2;4872:9;4863:7;4859:23;4855:32;4852:119;;;4890:79;;:::i;:::-;4852:119;5010:1;5035:53;5080:7;5071:6;5060:9;5056:22;5035:53;:::i;:::-;5025:63;;4981:117;4776:329;;;;:::o;5111:474::-;5179:6;5187;5236:2;5224:9;5215:7;5211:23;5207:32;5204:119;;;5242:79;;:::i;:::-;5204:119;5362:1;5387:53;5432:7;5423:6;5412:9;5408:22;5387:53;:::i;:::-;5377:63;;5333:117;5489:2;5515:53;5560:7;5551:6;5540:9;5536:22;5515:53;:::i;:::-;5505:63;;5460:118;5111:474;;;;;:::o;5591:619::-;5668:6;5676;5684;5733:2;5721:9;5712:7;5708:23;5704:32;5701:119;;;5739:79;;:::i;:::-;5701:119;5859:1;5884:53;5929:7;5920:6;5909:9;5905:22;5884:53;:::i;:::-;5874:63;;5830:117;5986:2;6012:53;6057:7;6048:6;6037:9;6033:22;6012:53;:::i;:::-;6002:63;;5957:118;6114:2;6140:53;6185:7;6176:6;6165:9;6161:22;6140:53;:::i;:::-;6130:63;;6085:118;5591:619;;;;;:::o;6216:943::-;6311:6;6319;6327;6335;6384:3;6372:9;6363:7;6359:23;6355:33;6352:120;;;6391:79;;:::i;:::-;6352:120;6511:1;6536:53;6581:7;6572:6;6561:9;6557:22;6536:53;:::i;:::-;6526:63;;6482:117;6638:2;6664:53;6709:7;6700:6;6689:9;6685:22;6664:53;:::i;:::-;6654:63;;6609:118;6766:2;6792:53;6837:7;6828:6;6817:9;6813:22;6792:53;:::i;:::-;6782:63;;6737:118;6922:2;6911:9;6907:18;6894:32;6953:18;6945:6;6942:30;6939:117;;;6975:79;;:::i;:::-;6939:117;7080:62;7134:7;7125:6;7114:9;7110:22;7080:62;:::i;:::-;7070:72;;6865:287;6216:943;;;;;;;:::o;7165:468::-;7230:6;7238;7287:2;7275:9;7266:7;7262:23;7258:32;7255:119;;;7293:79;;:::i;:::-;7255:119;7413:1;7438:53;7483:7;7474:6;7463:9;7459:22;7438:53;:::i;:::-;7428:63;;7384:117;7540:2;7566:50;7608:7;7599:6;7588:9;7584:22;7566:50;:::i;:::-;7556:60;;7511:115;7165:468;;;;;:::o;7639:474::-;7707:6;7715;7764:2;7752:9;7743:7;7739:23;7735:32;7732:119;;;7770:79;;:::i;:::-;7732:119;7890:1;7915:53;7960:7;7951:6;7940:9;7936:22;7915:53;:::i;:::-;7905:63;;7861:117;8017:2;8043:53;8088:7;8079:6;8068:9;8064:22;8043:53;:::i;:::-;8033:63;;7988:118;7639:474;;;;;:::o;8119:682::-;8211:6;8219;8268:2;8256:9;8247:7;8243:23;8239:32;8236:119;;;8274:79;;:::i;:::-;8236:119;8422:1;8411:9;8407:17;8394:31;8452:18;8444:6;8441:30;8438:117;;;8474:79;;:::i;:::-;8438:117;8579:78;8649:7;8640:6;8629:9;8625:22;8579:78;:::i;:::-;8569:88;;8365:302;8706:2;8732:52;8776:7;8767:6;8756:9;8752:22;8732:52;:::i;:::-;8722:62;;8677:117;8119:682;;;;;:::o;8807:327::-;8865:6;8914:2;8902:9;8893:7;8889:23;8885:32;8882:119;;;8920:79;;:::i;:::-;8882:119;9040:1;9065:52;9109:7;9100:6;9089:9;9085:22;9065:52;:::i;:::-;9055:62;;9011:116;8807:327;;;;:::o;9140:349::-;9209:6;9258:2;9246:9;9237:7;9233:23;9229:32;9226:119;;;9264:79;;:::i;:::-;9226:119;9384:1;9409:63;9464:7;9455:6;9444:9;9440:22;9409:63;:::i;:::-;9399:73;;9355:127;9140:349;;;;:::o;9495:509::-;9564:6;9613:2;9601:9;9592:7;9588:23;9584:32;9581:119;;;9619:79;;:::i;:::-;9581:119;9767:1;9756:9;9752:17;9739:31;9797:18;9789:6;9786:30;9783:117;;;9819:79;;:::i;:::-;9783:117;9924:63;9979:7;9970:6;9959:9;9955:22;9924:63;:::i;:::-;9914:73;;9710:287;9495:509;;;;:::o;10010:377::-;10093:6;10142:2;10130:9;10121:7;10117:23;10113:32;10110:119;;;10148:79;;:::i;:::-;10110:119;10268:1;10293:77;10362:7;10353:6;10342:9;10338:22;10293:77;:::i;:::-;10283:87;;10239:141;10010:377;;;;:::o;10393:329::-;10452:6;10501:2;10489:9;10480:7;10476:23;10472:32;10469:119;;;10507:79;;:::i;:::-;10469:119;10627:1;10652:53;10697:7;10688:6;10677:9;10673:22;10652:53;:::i;:::-;10642:63;;10598:117;10393:329;;;;:::o;10728:327::-;10786:6;10835:2;10823:9;10814:7;10810:23;10806:32;10803:119;;;10841:79;;:::i;:::-;10803:119;10961:1;10986:52;11030:7;11021:6;11010:9;11006:22;10986:52;:::i;:::-;10976:62;;10932:116;10728:327;;;;:::o;11061:500::-;11142:6;11150;11199:2;11187:9;11178:7;11174:23;11170:32;11167:119;;;11205:79;;:::i;:::-;11167:119;11325:1;11350:52;11394:7;11385:6;11374:9;11370:22;11350:52;:::i;:::-;11340:62;;11296:116;11451:2;11477:67;11536:7;11527:6;11516:9;11512:22;11477:67;:::i;:::-;11467:77;;11422:132;11061:500;;;;;:::o;11567:521::-;11658:6;11666;11715:3;11703:9;11694:7;11690:23;11686:33;11683:120;;;11722:79;;:::i;:::-;11683:120;11842:1;11867:52;11911:7;11902:6;11891:9;11887:22;11867:52;:::i;:::-;11857:62;;11813:116;11968:2;11994:77;12063:7;12054:6;12043:9;12039:22;11994:77;:::i;:::-;11984:87;;11939:142;11567:521;;;;;:::o;12094:118::-;12181:24;12199:5;12181:24;:::i;:::-;12176:3;12169:37;12094:118;;:::o;12218:109::-;12299:21;12314:5;12299:21;:::i;:::-;12294:3;12287:34;12218:109;;:::o;12333:118::-;12420:24;12438:5;12420:24;:::i;:::-;12415:3;12408:37;12333:118;;:::o;12457:360::-;12543:3;12571:38;12603:5;12571:38;:::i;:::-;12625:70;12688:6;12683:3;12625:70;:::i;:::-;12618:77;;12704:52;12749:6;12744:3;12737:4;12730:5;12726:16;12704:52;:::i;:::-;12781:29;12803:6;12781:29;:::i;:::-;12776:3;12772:39;12765:46;;12547:270;12457:360;;;;:::o;12823:157::-;12923:50;12967:5;12923:50;:::i;:::-;12918:3;12911:63;12823:157;;:::o;12986:155::-;13085:49;13128:5;13085:49;:::i;:::-;13080:3;13073:62;12986:155;;:::o;13147:364::-;13235:3;13263:39;13296:5;13263:39;:::i;:::-;13318:71;13382:6;13377:3;13318:71;:::i;:::-;13311:78;;13398:52;13443:6;13438:3;13431:4;13424:5;13420:16;13398:52;:::i;:::-;13475:29;13497:6;13475:29;:::i;:::-;13470:3;13466:39;13459:46;;13239:272;13147:364;;;;:::o;13517:377::-;13623:3;13651:39;13684:5;13651:39;:::i;:::-;13706:89;13788:6;13783:3;13706:89;:::i;:::-;13699:96;;13804:52;13849:6;13844:3;13837:4;13830:5;13826:16;13804:52;:::i;:::-;13881:6;13876:3;13872:16;13865:23;;13627:267;13517:377;;;;:::o;13924:845::-;14027:3;14064:5;14058:12;14093:36;14119:9;14093:36;:::i;:::-;14145:89;14227:6;14222:3;14145:89;:::i;:::-;14138:96;;14265:1;14254:9;14250:17;14281:1;14276:137;;;;14427:1;14422:341;;;;14243:520;;14276:137;14360:4;14356:9;14345;14341:25;14336:3;14329:38;14396:6;14391:3;14387:16;14380:23;;14276:137;;14422:341;14489:38;14521:5;14489:38;:::i;:::-;14549:1;14563:154;14577:6;14574:1;14571:13;14563:154;;;14651:7;14645:14;14641:1;14636:3;14632:11;14625:35;14701:1;14692:7;14688:15;14677:26;;14599:4;14596:1;14592:12;14587:17;;14563:154;;;14746:6;14741:3;14737:16;14730:23;;14429:334;;14243:520;;14031:738;;13924:845;;;;:::o;14775:366::-;14917:3;14938:67;15002:2;14997:3;14938:67;:::i;:::-;14931:74;;15014:93;15103:3;15014:93;:::i;:::-;15132:2;15127:3;15123:12;15116:19;;14775:366;;;:::o;15147:::-;15289:3;15310:67;15374:2;15369:3;15310:67;:::i;:::-;15303:74;;15386:93;15475:3;15386:93;:::i;:::-;15504:2;15499:3;15495:12;15488:19;;15147:366;;;:::o;15519:::-;15661:3;15682:67;15746:2;15741:3;15682:67;:::i;:::-;15675:74;;15758:93;15847:3;15758:93;:::i;:::-;15876:2;15871:3;15867:12;15860:19;;15519:366;;;:::o;15891:::-;16033:3;16054:67;16118:2;16113:3;16054:67;:::i;:::-;16047:74;;16130:93;16219:3;16130:93;:::i;:::-;16248:2;16243:3;16239:12;16232:19;;15891:366;;;:::o;16263:::-;16405:3;16426:67;16490:2;16485:3;16426:67;:::i;:::-;16419:74;;16502:93;16591:3;16502:93;:::i;:::-;16620:2;16615:3;16611:12;16604:19;;16263:366;;;:::o;16635:::-;16777:3;16798:67;16862:2;16857:3;16798:67;:::i;:::-;16791:74;;16874:93;16963:3;16874:93;:::i;:::-;16992:2;16987:3;16983:12;16976:19;;16635:366;;;:::o;17007:::-;17149:3;17170:67;17234:2;17229:3;17170:67;:::i;:::-;17163:74;;17246:93;17335:3;17246:93;:::i;:::-;17364:2;17359:3;17355:12;17348:19;;17007:366;;;:::o;17379:::-;17521:3;17542:67;17606:2;17601:3;17542:67;:::i;:::-;17535:74;;17618:93;17707:3;17618:93;:::i;:::-;17736:2;17731:3;17727:12;17720:19;;17379:366;;;:::o;17751:::-;17893:3;17914:67;17978:2;17973:3;17914:67;:::i;:::-;17907:74;;17990:93;18079:3;17990:93;:::i;:::-;18108:2;18103:3;18099:12;18092:19;;17751:366;;;:::o;18123:::-;18265:3;18286:67;18350:2;18345:3;18286:67;:::i;:::-;18279:74;;18362:93;18451:3;18362:93;:::i;:::-;18480:2;18475:3;18471:12;18464:19;;18123:366;;;:::o;18495:::-;18637:3;18658:67;18722:2;18717:3;18658:67;:::i;:::-;18651:74;;18734:93;18823:3;18734:93;:::i;:::-;18852:2;18847:3;18843:12;18836:19;;18495:366;;;:::o;18867:::-;19009:3;19030:67;19094:2;19089:3;19030:67;:::i;:::-;19023:74;;19106:93;19195:3;19106:93;:::i;:::-;19224:2;19219:3;19215:12;19208:19;;18867:366;;;:::o;19239:::-;19381:3;19402:67;19466:2;19461:3;19402:67;:::i;:::-;19395:74;;19478:93;19567:3;19478:93;:::i;:::-;19596:2;19591:3;19587:12;19580:19;;19239:366;;;:::o;19611:::-;19753:3;19774:67;19838:2;19833:3;19774:67;:::i;:::-;19767:74;;19850:93;19939:3;19850:93;:::i;:::-;19968:2;19963:3;19959:12;19952:19;;19611:366;;;:::o;19983:::-;20125:3;20146:67;20210:2;20205:3;20146:67;:::i;:::-;20139:74;;20222:93;20311:3;20222:93;:::i;:::-;20340:2;20335:3;20331:12;20324:19;;19983:366;;;:::o;20355:::-;20497:3;20518:67;20582:2;20577:3;20518:67;:::i;:::-;20511:74;;20594:93;20683:3;20594:93;:::i;:::-;20712:2;20707:3;20703:12;20696:19;;20355:366;;;:::o;20727:::-;20869:3;20890:67;20954:2;20949:3;20890:67;:::i;:::-;20883:74;;20966:93;21055:3;20966:93;:::i;:::-;21084:2;21079:3;21075:12;21068:19;;20727:366;;;:::o;21099:::-;21241:3;21262:67;21326:2;21321:3;21262:67;:::i;:::-;21255:74;;21338:93;21427:3;21338:93;:::i;:::-;21456:2;21451:3;21447:12;21440:19;;21099:366;;;:::o;21471:::-;21613:3;21634:67;21698:2;21693:3;21634:67;:::i;:::-;21627:74;;21710:93;21799:3;21710:93;:::i;:::-;21828:2;21823:3;21819:12;21812:19;;21471:366;;;:::o;21843:::-;21985:3;22006:67;22070:2;22065:3;22006:67;:::i;:::-;21999:74;;22082:93;22171:3;22082:93;:::i;:::-;22200:2;22195:3;22191:12;22184:19;;21843:366;;;:::o;22215:::-;22357:3;22378:67;22442:2;22437:3;22378:67;:::i;:::-;22371:74;;22454:93;22543:3;22454:93;:::i;:::-;22572:2;22567:3;22563:12;22556:19;;22215:366;;;:::o;22587:::-;22729:3;22750:67;22814:2;22809:3;22750:67;:::i;:::-;22743:74;;22826:93;22915:3;22826:93;:::i;:::-;22944:2;22939:3;22935:12;22928:19;;22587:366;;;:::o;22959:::-;23101:3;23122:67;23186:2;23181:3;23122:67;:::i;:::-;23115:74;;23198:93;23287:3;23198:93;:::i;:::-;23316:2;23311:3;23307:12;23300:19;;22959:366;;;:::o;23331:::-;23473:3;23494:67;23558:2;23553:3;23494:67;:::i;:::-;23487:74;;23570:93;23659:3;23570:93;:::i;:::-;23688:2;23683:3;23679:12;23672:19;;23331:366;;;:::o;23703:::-;23845:3;23866:67;23930:2;23925:3;23866:67;:::i;:::-;23859:74;;23942:93;24031:3;23942:93;:::i;:::-;24060:2;24055:3;24051:12;24044:19;;23703:366;;;:::o;24075:::-;24217:3;24238:67;24302:2;24297:3;24238:67;:::i;:::-;24231:74;;24314:93;24403:3;24314:93;:::i;:::-;24432:2;24427:3;24423:12;24416:19;;24075:366;;;:::o;24447:::-;24589:3;24610:67;24674:2;24669:3;24610:67;:::i;:::-;24603:74;;24686:93;24775:3;24686:93;:::i;:::-;24804:2;24799:3;24795:12;24788:19;;24447:366;;;:::o;24819:::-;24961:3;24982:67;25046:2;25041:3;24982:67;:::i;:::-;24975:74;;25058:93;25147:3;25058:93;:::i;:::-;25176:2;25171:3;25167:12;25160:19;;24819:366;;;:::o;25191:::-;25333:3;25354:67;25418:2;25413:3;25354:67;:::i;:::-;25347:74;;25430:93;25519:3;25430:93;:::i;:::-;25548:2;25543:3;25539:12;25532:19;;25191:366;;;:::o;25563:118::-;25650:24;25668:5;25650:24;:::i;:::-;25645:3;25638:37;25563:118;;:::o;25687:115::-;25772:23;25789:5;25772:23;:::i;:::-;25767:3;25760:36;25687:115;;:::o;25808:112::-;25891:22;25907:5;25891:22;:::i;:::-;25886:3;25879:35;25808:112;;:::o;25926:429::-;26103:3;26125:92;26213:3;26204:6;26125:92;:::i;:::-;26118:99;;26234:95;26325:3;26316:6;26234:95;:::i;:::-;26227:102;;26346:3;26339:10;;25926:429;;;;;:::o;26361:222::-;26454:4;26492:2;26481:9;26477:18;26469:26;;26505:71;26573:1;26562:9;26558:17;26549:6;26505:71;:::i;:::-;26361:222;;;;:::o;26589:332::-;26710:4;26748:2;26737:9;26733:18;26725:26;;26761:71;26829:1;26818:9;26814:17;26805:6;26761:71;:::i;:::-;26842:72;26910:2;26899:9;26895:18;26886:6;26842:72;:::i;:::-;26589:332;;;;;:::o;26927:640::-;27122:4;27160:3;27149:9;27145:19;27137:27;;27174:71;27242:1;27231:9;27227:17;27218:6;27174:71;:::i;:::-;27255:72;27323:2;27312:9;27308:18;27299:6;27255:72;:::i;:::-;27337;27405:2;27394:9;27390:18;27381:6;27337:72;:::i;:::-;27456:9;27450:4;27446:20;27441:2;27430:9;27426:18;27419:48;27484:76;27555:4;27546:6;27484:76;:::i;:::-;27476:84;;26927:640;;;;;;;:::o;27573:210::-;27660:4;27698:2;27687:9;27683:18;27675:26;;27711:65;27773:1;27762:9;27758:17;27749:6;27711:65;:::i;:::-;27573:210;;;;:::o;27789:545::-;27962:4;28000:3;27989:9;27985:19;27977:27;;28014:71;28082:1;28071:9;28067:17;28058:6;28014:71;:::i;:::-;28095:68;28159:2;28148:9;28144:18;28135:6;28095:68;:::i;:::-;28173:72;28241:2;28230:9;28226:18;28217:6;28173:72;:::i;:::-;28255;28323:2;28312:9;28308:18;28299:6;28255:72;:::i;:::-;27789:545;;;;;;;:::o;28340:358::-;28474:4;28512:2;28501:9;28497:18;28489:26;;28525:84;28606:1;28595:9;28591:17;28582:6;28525:84;:::i;:::-;28619:72;28687:2;28676:9;28672:18;28663:6;28619:72;:::i;:::-;28340:358;;;;;:::o;28704:246::-;28809:4;28847:2;28836:9;28832:18;28824:26;;28860:83;28940:1;28929:9;28925:17;28916:6;28860:83;:::i;:::-;28704:246;;;;:::o;28956:462::-;29115:4;29153:2;29142:9;29138:18;29130:26;;29166:83;29246:1;29235:9;29231:17;29222:6;29166:83;:::i;:::-;29259:70;29325:2;29314:9;29310:18;29301:6;29259:70;:::i;:::-;29339:72;29407:2;29396:9;29392:18;29383:6;29339:72;:::i;:::-;28956:462;;;;;;:::o;29424:313::-;29537:4;29575:2;29564:9;29560:18;29552:26;;29624:9;29618:4;29614:20;29610:1;29599:9;29595:17;29588:47;29652:78;29725:4;29716:6;29652:78;:::i;:::-;29644:86;;29424:313;;;;:::o;29743:423::-;29884:4;29922:2;29911:9;29907:18;29899:26;;29971:9;29965:4;29961:20;29957:1;29946:9;29942:17;29935:47;29999:78;30072:4;30063:6;29999:78;:::i;:::-;29991:86;;30087:72;30155:2;30144:9;30140:18;30131:6;30087:72;:::i;:::-;29743:423;;;;;:::o;30172:419::-;30338:4;30376:2;30365:9;30361:18;30353:26;;30425:9;30419:4;30415:20;30411:1;30400:9;30396:17;30389:47;30453:131;30579:4;30453:131;:::i;:::-;30445:139;;30172:419;;;:::o;30597:::-;30763:4;30801:2;30790:9;30786:18;30778:26;;30850:9;30844:4;30840:20;30836:1;30825:9;30821:17;30814:47;30878:131;31004:4;30878:131;:::i;:::-;30870:139;;30597:419;;;:::o;31022:::-;31188:4;31226:2;31215:9;31211:18;31203:26;;31275:9;31269:4;31265:20;31261:1;31250:9;31246:17;31239:47;31303:131;31429:4;31303:131;:::i;:::-;31295:139;;31022:419;;;:::o;31447:::-;31613:4;31651:2;31640:9;31636:18;31628:26;;31700:9;31694:4;31690:20;31686:1;31675:9;31671:17;31664:47;31728:131;31854:4;31728:131;:::i;:::-;31720:139;;31447:419;;;:::o;31872:::-;32038:4;32076:2;32065:9;32061:18;32053:26;;32125:9;32119:4;32115:20;32111:1;32100:9;32096:17;32089:47;32153:131;32279:4;32153:131;:::i;:::-;32145:139;;31872:419;;;:::o;32297:::-;32463:4;32501:2;32490:9;32486:18;32478:26;;32550:9;32544:4;32540:20;32536:1;32525:9;32521:17;32514:47;32578:131;32704:4;32578:131;:::i;:::-;32570:139;;32297:419;;;:::o;32722:::-;32888:4;32926:2;32915:9;32911:18;32903:26;;32975:9;32969:4;32965:20;32961:1;32950:9;32946:17;32939:47;33003:131;33129:4;33003:131;:::i;:::-;32995:139;;32722:419;;;:::o;33147:::-;33313:4;33351:2;33340:9;33336:18;33328:26;;33400:9;33394:4;33390:20;33386:1;33375:9;33371:17;33364:47;33428:131;33554:4;33428:131;:::i;:::-;33420:139;;33147:419;;;:::o;33572:::-;33738:4;33776:2;33765:9;33761:18;33753:26;;33825:9;33819:4;33815:20;33811:1;33800:9;33796:17;33789:47;33853:131;33979:4;33853:131;:::i;:::-;33845:139;;33572:419;;;:::o;33997:::-;34163:4;34201:2;34190:9;34186:18;34178:26;;34250:9;34244:4;34240:20;34236:1;34225:9;34221:17;34214:47;34278:131;34404:4;34278:131;:::i;:::-;34270:139;;33997:419;;;:::o;34422:::-;34588:4;34626:2;34615:9;34611:18;34603:26;;34675:9;34669:4;34665:20;34661:1;34650:9;34646:17;34639:47;34703:131;34829:4;34703:131;:::i;:::-;34695:139;;34422:419;;;:::o;34847:::-;35013:4;35051:2;35040:9;35036:18;35028:26;;35100:9;35094:4;35090:20;35086:1;35075:9;35071:17;35064:47;35128:131;35254:4;35128:131;:::i;:::-;35120:139;;34847:419;;;:::o;35272:::-;35438:4;35476:2;35465:9;35461:18;35453:26;;35525:9;35519:4;35515:20;35511:1;35500:9;35496:17;35489:47;35553:131;35679:4;35553:131;:::i;:::-;35545:139;;35272:419;;;:::o;35697:::-;35863:4;35901:2;35890:9;35886:18;35878:26;;35950:9;35944:4;35940:20;35936:1;35925:9;35921:17;35914:47;35978:131;36104:4;35978:131;:::i;:::-;35970:139;;35697:419;;;:::o;36122:::-;36288:4;36326:2;36315:9;36311:18;36303:26;;36375:9;36369:4;36365:20;36361:1;36350:9;36346:17;36339:47;36403:131;36529:4;36403:131;:::i;:::-;36395:139;;36122:419;;;:::o;36547:::-;36713:4;36751:2;36740:9;36736:18;36728:26;;36800:9;36794:4;36790:20;36786:1;36775:9;36771:17;36764:47;36828:131;36954:4;36828:131;:::i;:::-;36820:139;;36547:419;;;:::o;36972:::-;37138:4;37176:2;37165:9;37161:18;37153:26;;37225:9;37219:4;37215:20;37211:1;37200:9;37196:17;37189:47;37253:131;37379:4;37253:131;:::i;:::-;37245:139;;36972:419;;;:::o;37397:::-;37563:4;37601:2;37590:9;37586:18;37578:26;;37650:9;37644:4;37640:20;37636:1;37625:9;37621:17;37614:47;37678:131;37804:4;37678:131;:::i;:::-;37670:139;;37397:419;;;:::o;37822:::-;37988:4;38026:2;38015:9;38011:18;38003:26;;38075:9;38069:4;38065:20;38061:1;38050:9;38046:17;38039:47;38103:131;38229:4;38103:131;:::i;:::-;38095:139;;37822:419;;;:::o;38247:::-;38413:4;38451:2;38440:9;38436:18;38428:26;;38500:9;38494:4;38490:20;38486:1;38475:9;38471:17;38464:47;38528:131;38654:4;38528:131;:::i;:::-;38520:139;;38247:419;;;:::o;38672:::-;38838:4;38876:2;38865:9;38861:18;38853:26;;38925:9;38919:4;38915:20;38911:1;38900:9;38896:17;38889:47;38953:131;39079:4;38953:131;:::i;:::-;38945:139;;38672:419;;;:::o;39097:::-;39263:4;39301:2;39290:9;39286:18;39278:26;;39350:9;39344:4;39340:20;39336:1;39325:9;39321:17;39314:47;39378:131;39504:4;39378:131;:::i;:::-;39370:139;;39097:419;;;:::o;39522:::-;39688:4;39726:2;39715:9;39711:18;39703:26;;39775:9;39769:4;39765:20;39761:1;39750:9;39746:17;39739:47;39803:131;39929:4;39803:131;:::i;:::-;39795:139;;39522:419;;;:::o;39947:::-;40113:4;40151:2;40140:9;40136:18;40128:26;;40200:9;40194:4;40190:20;40186:1;40175:9;40171:17;40164:47;40228:131;40354:4;40228:131;:::i;:::-;40220:139;;39947:419;;;:::o;40372:::-;40538:4;40576:2;40565:9;40561:18;40553:26;;40625:9;40619:4;40615:20;40611:1;40600:9;40596:17;40589:47;40653:131;40779:4;40653:131;:::i;:::-;40645:139;;40372:419;;;:::o;40797:::-;40963:4;41001:2;40990:9;40986:18;40978:26;;41050:9;41044:4;41040:20;41036:1;41025:9;41021:17;41014:47;41078:131;41204:4;41078:131;:::i;:::-;41070:139;;40797:419;;;:::o;41222:::-;41388:4;41426:2;41415:9;41411:18;41403:26;;41475:9;41469:4;41465:20;41461:1;41450:9;41446:17;41439:47;41503:131;41629:4;41503:131;:::i;:::-;41495:139;;41222:419;;;:::o;41647:::-;41813:4;41851:2;41840:9;41836:18;41828:26;;41900:9;41894:4;41890:20;41886:1;41875:9;41871:17;41864:47;41928:131;42054:4;41928:131;:::i;:::-;41920:139;;41647:419;;;:::o;42072:::-;42238:4;42276:2;42265:9;42261:18;42253:26;;42325:9;42319:4;42315:20;42311:1;42300:9;42296:17;42289:47;42353:131;42479:4;42353:131;:::i;:::-;42345:139;;42072:419;;;:::o;42497:222::-;42590:4;42628:2;42617:9;42613:18;42605:26;;42641:71;42709:1;42698:9;42694:17;42685:6;42641:71;:::i;:::-;42497:222;;;;:::o;42725:332::-;42846:4;42884:2;42873:9;42869:18;42861:26;;42897:71;42965:1;42954:9;42950:17;42941:6;42897:71;:::i;:::-;42978:72;43046:2;43035:9;43031:18;43022:6;42978:72;:::i;:::-;42725:332;;;;;:::o;43063:218::-;43154:4;43192:2;43181:9;43177:18;43169:26;;43205:69;43271:1;43260:9;43256:17;43247:6;43205:69;:::i;:::-;43063:218;;;;:::o;43287:129::-;43321:6;43348:20;;:::i;:::-;43338:30;;43377:33;43405:4;43397:6;43377:33;:::i;:::-;43287:129;;;:::o;43422:75::-;43455:6;43488:2;43482:9;43472:19;;43422:75;:::o;43503:311::-;43580:4;43670:18;43662:6;43659:30;43656:56;;;43692:18;;:::i;:::-;43656:56;43742:4;43734:6;43730:17;43722:25;;43802:4;43796;43792:15;43784:23;;43503:311;;;:::o;43820:307::-;43881:4;43971:18;43963:6;43960:30;43957:56;;;43993:18;;:::i;:::-;43957:56;44031:29;44053:6;44031:29;:::i;:::-;44023:37;;44115:4;44109;44105:15;44097:23;;43820:307;;;:::o;44133:308::-;44195:4;44285:18;44277:6;44274:30;44271:56;;;44307:18;;:::i;:::-;44271:56;44345:29;44367:6;44345:29;:::i;:::-;44337:37;;44429:4;44423;44419:15;44411:23;;44133:308;;;:::o;44447:141::-;44496:4;44519:3;44511:11;;44542:3;44539:1;44532:14;44576:4;44573:1;44563:18;44555:26;;44447:141;;;:::o;44594:98::-;44645:6;44679:5;44673:12;44663:22;;44594:98;;;:::o;44698:99::-;44750:6;44784:5;44778:12;44768:22;;44698:99;;;:::o;44803:168::-;44886:11;44920:6;44915:3;44908:19;44960:4;44955:3;44951:14;44936:29;;44803:168;;;;:::o;44977:169::-;45061:11;45095:6;45090:3;45083:19;45135:4;45130:3;45126:14;45111:29;;44977:169;;;;:::o;45152:148::-;45254:11;45291:3;45276:18;;45152:148;;;;:::o;45306:305::-;45346:3;45365:20;45383:1;45365:20;:::i;:::-;45360:25;;45399:20;45417:1;45399:20;:::i;:::-;45394:25;;45553:1;45485:66;45481:74;45478:1;45475:81;45472:107;;;45559:18;;:::i;:::-;45472:107;45603:1;45600;45596:9;45589:16;;45306:305;;;;:::o;45617:254::-;45656:3;45675:19;45692:1;45675:19;:::i;:::-;45670:24;;45708:19;45725:1;45708:19;:::i;:::-;45703:24;;45813:1;45793:18;45789:26;45786:1;45783:33;45780:59;;;45819:18;;:::i;:::-;45780:59;45863:1;45860;45856:9;45849:16;;45617:254;;;;:::o;45877:185::-;45917:1;45934:20;45952:1;45934:20;:::i;:::-;45929:25;;45968:20;45986:1;45968:20;:::i;:::-;45963:25;;46007:1;45997:35;;46012:18;;:::i;:::-;45997:35;46054:1;46051;46047:9;46042:14;;45877:185;;;;:::o;46068:348::-;46108:7;46131:20;46149:1;46131:20;:::i;:::-;46126:25;;46165:20;46183:1;46165:20;:::i;:::-;46160:25;;46353:1;46285:66;46281:74;46278:1;46275:81;46270:1;46263:9;46256:17;46252:105;46249:131;;;46360:18;;:::i;:::-;46249:131;46408:1;46405;46401:9;46390:20;;46068:348;;;;:::o;46422:297::-;46461:7;46484:19;46501:1;46484:19;:::i;:::-;46479:24;;46517:19;46534:1;46517:19;:::i;:::-;46512:24;;46656:1;46636:18;46632:26;46629:1;46626:33;46621:1;46614:9;46607:17;46603:57;46600:83;;;46663:18;;:::i;:::-;46600:83;46711:1;46708;46704:9;46693:20;;46422:297;;;;:::o;46725:191::-;46765:4;46785:20;46803:1;46785:20;:::i;:::-;46780:25;;46819:20;46837:1;46819:20;:::i;:::-;46814:25;;46858:1;46855;46852:8;46849:34;;;46863:18;;:::i;:::-;46849:34;46908:1;46905;46901:9;46893:17;;46725:191;;;;:::o;46922:188::-;46961:4;46981:19;46998:1;46981:19;:::i;:::-;46976:24;;47014:19;47031:1;47014:19;:::i;:::-;47009:24;;47052:1;47049;47046:8;47043:34;;;47057:18;;:::i;:::-;47043:34;47102:1;47099;47095:9;47087:17;;46922:188;;;;:::o;47116:96::-;47153:7;47182:24;47200:5;47182:24;:::i;:::-;47171:35;;47116:96;;;:::o;47218:90::-;47252:7;47295:5;47288:13;47281:21;47270:32;;47218:90;;;:::o;47314:77::-;47351:7;47380:5;47369:16;;47314:77;;;:::o;47397:149::-;47433:7;47473:66;47466:5;47462:78;47451:89;;47397:149;;;:::o;47552:141::-;47604:7;47633:5;47622:16;;47639:48;47681:5;47639:48;:::i;:::-;47552:141;;;:::o;47699:139::-;47750:7;47779:5;47768:16;;47785:47;47826:5;47785:47;:::i;:::-;47699:139;;;:::o;47844:126::-;47881:7;47921:42;47914:5;47910:54;47899:65;;47844:126;;;:::o;47976:77::-;48013:7;48042:5;48031:16;;47976:77;;;:::o;48059:101::-;48095:7;48135:18;48128:5;48124:30;48113:41;;48059:101;;;:::o;48166:86::-;48201:7;48241:4;48234:5;48230:16;48219:27;;48166:86;;;:::o;48258:141::-;48321:9;48354:39;48387:5;48354:39;:::i;:::-;48341:52;;48258:141;;;:::o;48405:139::-;48467:9;48500:38;48532:5;48500:38;:::i;:::-;48487:51;;48405:139;;;:::o;48550:154::-;48634:6;48629:3;48624;48611:30;48696:1;48687:6;48682:3;48678:16;48671:27;48550:154;;;:::o;48710:307::-;48778:1;48788:113;48802:6;48799:1;48796:13;48788:113;;;48887:1;48882:3;48878:11;48872:18;48868:1;48863:3;48859:11;48852:39;48824:2;48821:1;48817:10;48812:15;;48788:113;;;48919:6;48916:1;48913:13;48910:101;;;48999:1;48990:6;48985:3;48981:16;48974:27;48910:101;48759:258;48710:307;;;:::o;49023:320::-;49067:6;49104:1;49098:4;49094:12;49084:22;;49151:1;49145:4;49141:12;49172:18;49162:81;;49228:4;49220:6;49216:17;49206:27;;49162:81;49290:2;49282:6;49279:14;49259:18;49256:38;49253:84;;;49309:18;;:::i;:::-;49253:84;49074:269;49023:320;;;:::o;49349:281::-;49432:27;49454:4;49432:27;:::i;:::-;49424:6;49420:40;49562:6;49550:10;49547:22;49526:18;49514:10;49511:34;49508:62;49505:88;;;49573:18;;:::i;:::-;49505:88;49613:10;49609:2;49602:22;49392:238;49349:281;;:::o;49636:233::-;49675:3;49698:24;49716:5;49698:24;:::i;:::-;49689:33;;49744:66;49737:5;49734:77;49731:103;;;49814:18;;:::i;:::-;49731:103;49861:1;49854:5;49850:13;49843:20;;49636:233;;;:::o;49875:183::-;49913:3;49936:23;49953:5;49936:23;:::i;:::-;49927:32;;49981:18;49974:5;49971:29;49968:55;;;50003:18;;:::i;:::-;49968:55;50050:1;50043:5;50039:13;50032:20;;49875:183;;;:::o;50064:176::-;50096:1;50113:20;50131:1;50113:20;:::i;:::-;50108:25;;50147:20;50165:1;50147:20;:::i;:::-;50142:25;;50186:1;50176:35;;50191:18;;:::i;:::-;50176:35;50232:1;50229;50225:9;50220:14;;50064:176;;;;:::o;50246:180::-;50294:77;50291:1;50284:88;50391:4;50388:1;50381:15;50415:4;50412:1;50405:15;50432:180;50480:77;50477:1;50470:88;50577:4;50574:1;50567:15;50601:4;50598:1;50591:15;50618:180;50666:77;50663:1;50656:88;50763:4;50760:1;50753:15;50787:4;50784:1;50777:15;50804:180;50852:77;50849:1;50842:88;50949:4;50946:1;50939:15;50973:4;50970:1;50963:15;50990:180;51038:77;51035:1;51028:88;51135:4;51132:1;51125:15;51159:4;51156:1;51149:15;51176:180;51224:77;51221:1;51214:88;51321:4;51318:1;51311:15;51345:4;51342:1;51335:15;51362:117;51471:1;51468;51461:12;51485:117;51594:1;51591;51584:12;51731:117;51840:1;51837;51830:12;51854:117;51963:1;51960;51953:12;51977:117;52086:1;52083;52076:12;52100:117;52209:1;52206;52199:12;52223:102;52264:6;52315:2;52311:7;52306:2;52299:5;52295:14;52291:28;52281:38;;52223:102;;;:::o;52331:174::-;52471:26;52467:1;52459:6;52455:14;52448:50;52331:174;:::o;52511:291::-;52651:34;52647:1;52639:6;52635:14;52628:58;52720:34;52715:2;52707:6;52703:15;52696:59;52789:5;52784:2;52776:6;52772:15;52765:30;52511:291;:::o;52808:170::-;52948:22;52944:1;52936:6;52932:14;52925:46;52808:170;:::o;52984:237::-;53124:34;53120:1;53112:6;53108:14;53101:58;53193:20;53188:2;53180:6;53176:15;53169:45;52984:237;:::o;53227:225::-;53367:34;53363:1;53355:6;53351:14;53344:58;53436:8;53431:2;53423:6;53419:15;53412:33;53227:225;:::o;53458:224::-;53598:34;53594:1;53586:6;53582:14;53575:58;53667:7;53662:2;53654:6;53650:15;53643:32;53458:224;:::o;53688:178::-;53828:30;53824:1;53816:6;53812:14;53805:54;53688:178;:::o;53872:164::-;54012:16;54008:1;54000:6;53996:14;53989:40;53872:164;:::o;54042:223::-;54182:34;54178:1;54170:6;54166:14;54159:58;54251:6;54246:2;54238:6;54234:15;54227:31;54042:223;:::o;54271:175::-;54411:27;54407:1;54399:6;54395:14;54388:51;54271:175;:::o;54452:238::-;54592:34;54588:1;54580:6;54576:14;54569:58;54661:21;54656:2;54648:6;54644:15;54637:46;54452:238;:::o;54696:249::-;54836:34;54832:1;54824:6;54820:14;54813:58;54905:32;54900:2;54892:6;54888:15;54881:57;54696:249;:::o;54951:242::-;55091:34;55087:1;55079:6;55075:14;55068:58;55160:25;55155:2;55147:6;55143:15;55136:50;54951:242;:::o;55199:231::-;55339:34;55335:1;55327:6;55323:14;55316:58;55408:14;55403:2;55395:6;55391:15;55384:39;55199:231;:::o;55436:168::-;55576:20;55572:1;55564:6;55560:14;55553:44;55436:168;:::o;55610:166::-;55750:18;55746:1;55738:6;55734:14;55727:42;55610:166;:::o;55782:228::-;55922:34;55918:1;55910:6;55906:14;55899:58;55991:11;55986:2;55978:6;55974:15;55967:36;55782:228;:::o;56016:243::-;56156:34;56152:1;56144:6;56140:14;56133:58;56225:26;56220:2;56212:6;56208:15;56201:51;56016:243;:::o;56265:228::-;56405:34;56401:1;56393:6;56389:14;56382:58;56474:11;56469:2;56461:6;56457:15;56450:36;56265:228;:::o;56499:182::-;56639:34;56635:1;56627:6;56623:14;56616:58;56499:182;:::o;56687:231::-;56827:34;56823:1;56815:6;56811:14;56804:58;56896:14;56891:2;56883:6;56879:15;56872:39;56687:231;:::o;56924:182::-;57064:34;57060:1;57052:6;57048:14;57041:58;56924:182;:::o;57112:223::-;57252:34;57248:1;57240:6;57236:14;57229:58;57321:6;57316:2;57308:6;57304:15;57297:31;57112:223;:::o;57341:178::-;57481:30;57477:1;57469:6;57465:14;57458:54;57341:178;:::o;57525:220::-;57665:34;57661:1;57653:6;57649:14;57642:58;57734:3;57729:2;57721:6;57717:15;57710:28;57525:220;:::o;57751:236::-;57891:34;57887:1;57879:6;57875:14;57868:58;57960:19;57955:2;57947:6;57943:15;57936:44;57751:236;:::o;57993:243::-;58133:34;58129:1;58121:6;58117:14;58110:58;58202:26;58197:2;58189:6;58185:15;58178:51;57993:243;:::o;58242:174::-;58382:26;58378:1;58370:6;58366:14;58359:50;58242:174;:::o;58422:171::-;58562:23;58558:1;58550:6;58546:14;58539:47;58422:171;:::o;58599:120::-;58687:1;58680:5;58677:12;58667:46;;58693:18;;:::i;:::-;58667:46;58599:120;:::o;58725:119::-;58812:1;58805:5;58802:12;58792:46;;58818:18;;:::i;:::-;58792:46;58725:119;:::o;58850:122::-;58923:24;58941:5;58923:24;:::i;:::-;58916:5;58913:35;58903:63;;58962:1;58959;58952:12;58903:63;58850:122;:::o;58978:116::-;59048:21;59063:5;59048:21;:::i;:::-;59041:5;59038:32;59028:60;;59084:1;59081;59074:12;59028:60;58978:116;:::o;59100:122::-;59173:24;59191:5;59173:24;:::i;:::-;59166:5;59163:35;59153:63;;59212:1;59209;59202:12;59153:63;59100:122;:::o;59228:120::-;59300:23;59317:5;59300:23;:::i;:::-;59293:5;59290:34;59280:62;;59338:1;59335;59328:12;59280:62;59228:120;:::o;59354:113::-;59441:1;59434:5;59431:12;59421:40;;59457:1;59454;59447:12;59421:40;59354:113;:::o;59473:122::-;59546:24;59564:5;59546:24;:::i;:::-;59539:5;59536:35;59526:63;;59585:1;59582;59575:12;59526:63;59473:122;:::o;59601:120::-;59673:23;59690:5;59673:23;:::i;:::-;59666:5;59663:34;59653:62;;59711:1;59708;59701:12;59653:62;59601:120;:::o;59727:118::-;59798:22;59814:5;59798:22;:::i;:::-;59791:5;59788:33;59778:61;;59835:1;59832;59825:12;59778:61;59727:118;:::o

Swarm Source

ipfs://95b89b193d103433650b3dd3715c183002a4b5fbcda26cb812bdf36becb506ee
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.