ETH Price: $2,532.43 (+0.04%)

Token

Bonfire Club (BFC)
 

Overview

Max Total Supply

8,888 BFC

Holders

44

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
gabesfree.eth
Balance
1 BFC
0x1c1d7e85f14cf6e86892d0bded33b42a5615e577
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BonfireClub

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-12
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.16;

/**
* Bonfire Club is a progressively developing NFT that gives exclusive access and perks within Bonfire Club. 
* There are 8,888 Flame Heads stored as ERC-721 tokens on the Ethereum blockchain. 
*/
 
/**
 * @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);
}


/**
 * @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`, 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 Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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

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



/**
 * @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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


/**
 * @dev Collection of functions related to the address type
 */
library Address {
    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;
    }

    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");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    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");
    }

    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);
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    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);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    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);
    }

    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);
            }
        }
    }
}



abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

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);
    }
}



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



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




abstract contract ContextMixin {
    function msgSender()
        internal
        view
        returns (address payable sender)
    {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
                sender := and(
                    mload(add(array, index)),
                    0xffffffffffffffffffffffffffffffffffffffff
                )
            }
        } else {
            sender = payable(msg.sender);
        }
        return sender;
    }
}


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

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

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

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

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

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

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

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

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

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

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

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

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

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


contract Initializable {
    bool inited = false;

    modifier initializer() {
        require(!inited, "already inited");
        _;
        inited = true;
    }
}


contract EIP712Base is Initializable {
    struct EIP712Domain {
        string name;
        string version;
        address verifyingContract;
        bytes32 salt;
    }

    string constant public ERC712_VERSION = "1";

    bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256(
        bytes(
            "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"
        )
    );
    bytes32 internal domainSeperator;

    // supposed to be called once while initializing.
    // one of the contracts that inherits this contract follows proxy pattern
    // so it is not possible to do this in a constructor
    function _initializeEIP712(
        string memory name
    )
        internal
        initializer
    {
        _setDomainSeperator(name);
    }

    function _setDomainSeperator(string memory name) internal {
        domainSeperator = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                keccak256(bytes(ERC712_VERSION)),
                address(this),
                bytes32(getChainId())
            )
        );
    }

    function getDomainSeperator() public view returns (bytes32) {
        return domainSeperator;
    }

    function getChainId() public view returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }

    /**
     * Accept message hash and returns hash message in EIP712 compatible form
     * So that it can be used to recover signer from signature signed using EIP712 formatted data
     * https://eips.ethereum.org/EIPS/eip-712
     * "\\x19" makes the encoding deterministic
     * "\\x01" is the version byte to make it compatible to EIP-191
     */
    function toTypedMessageHash(bytes32 messageHash)
        internal
        view
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash)
            );
    }
}


contract NativeMetaTransaction is EIP712Base {
    using SafeMath for uint256;
    bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256(
        bytes(
            "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"
        )
    );
    event MetaTransactionExecuted(
        address userAddress,
        address payable relayerAddress,
        bytes functionSignature
    );
    mapping(address => uint256) nonces;

    /*
     * Meta transaction structure.
     * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas
     * He should call the desired function directly in that case.
     */
    struct MetaTransaction {
        uint256 nonce;
        address from;
        bytes functionSignature;
    }

    function executeMetaTransaction(
        address userAddress,
        bytes memory functionSignature,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) public payable returns (bytes memory) {
        MetaTransaction memory metaTx = MetaTransaction({
            nonce: nonces[userAddress],
            from: userAddress,
            functionSignature: functionSignature
        });

        require(
            verify(userAddress, metaTx, sigR, sigS, sigV),
            "Signer and signature do not match"
        );

        // increase nonce for user (to avoid re-use)
        nonces[userAddress] = nonces[userAddress].add(1);

        emit MetaTransactionExecuted(
            userAddress,
            payable(msg.sender),
            functionSignature
        );

        // Append userAddress and relayer address at the end to extract it from calling context
        (bool success, bytes memory returnData) = address(this).call(
            abi.encodePacked(functionSignature, userAddress)
        );
        require(success, "Function call not successful");

        return returnData;
    }

    function hashMetaTransaction(MetaTransaction memory metaTx)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encode(
                    META_TRANSACTION_TYPEHASH,
                    metaTx.nonce,
                    metaTx.from,
                    keccak256(metaTx.functionSignature)
                )
            );
    }

    function getNonce(address user) public view returns (uint256 nonce) {
        nonce = nonces[user];
    }

    function verify(
        address signer,
        MetaTransaction memory metaTx,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) internal view returns (bool) {
        require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER");
        return
            signer ==
            ecrecover(
                toTypedMessageHash(hashMetaTransaction(metaTx)),
                sigV,
                sigR,
                sigS
            );
    }
}


/**
 * @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) public _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: balance query for the zero address");
        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 || getApproved(tokenId) == spender || isApprovedForAll(owner, 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 {}

    
}


contract OwnableDelegateProxy {}

/**
 * Used to delegate ownership of a contract to another address, to save on unneeded transactions to approve contract use for users
 */
contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

/**
 * @title ERC721Tradable
 * ERC721Tradable - ERC721 contract that whitelists a trading address, and has minting functionality.
 */
abstract contract ERC721Tradable is ERC721, ContextMixin, NativeMetaTransaction, Ownable {
    using SafeMath for uint256;
    using Counters for Counters.Counter;
    uint256 public total_supply = 8888;
    uint256 public price = 6*10**16; // 1 ETH in WEI 10**18 | 0.1 ETH in WEI 10**17 | WL 0.06 ETH in WEI 6*10**16 | postWL 0.09 ETH in WEI 90**16 
    
    bool public claim_mod = false; // Set True to activate claim
    bool public reveal = false; // Set True to activate reveal

    bool public whitelist_mod = true; // Set False to de-activate whitelist
    mapping(address => uint) public whitelist; 

    address public wallet1_1;
    address public wallet2_1;
    address public wallet3_88;
    address public wallet4_10;

    address public admin;

    /**
     * We rely on the OZ Counter util to keep track of the next available ID.
     * We track the nextTokenId instead of the currentTokenId to save users on gas costs. 
     * Read more about it here: https://shiny.mirror.xyz/OUampBbIz9ebEicfGnQf5At_ReMHlZy0tB4glb9xQ0E
     */ 
    Counters.Counter private _nextTokenId;
    address public proxyRegistryAddress;

    constructor(
        string memory _name,
        string memory _symbol
    ) ERC721(_name, _symbol) {
        proxyRegistryAddress = 0xa5409ec958C83C3f309868babACA7c86DCB077c1;
        // nextTokenId is initialized to 1, since starting at 0 leads to higher gas cost for the first minter
        _nextTokenId.increment();
        _initializeEIP712(_name);
    }

    function setProxy(address _proxyRegistryAddress) public {
        require(owner() == _msgSender() || admin == _msgSender());
        proxyRegistryAddress = _proxyRegistryAddress;
    }

    function baseTokenURI() virtual public view returns (string memory);

    function tokenURI(uint256 _tokenId) override public view returns (string memory) {
        if(reveal){
            return string(abi.encodePacked(baseTokenURI(),"/",Strings.toString(_tokenId),".json"));
        }else{
            return baseTokenURI();
        }
    }

    /**
     * Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-less listings.
     */
    function isApprovedForAll(address owner, address operator)
        override
        public
        view
        returns (bool)
    {
        // Whitelist OpenSea proxy contract for easy trading.
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }

        return super.isApprovedForAll(owner, operator);
    }

    /**
     * This is used instead of msg.sender as transactions won't be sent by the original token owner, but by OpenSea.
     */
    function _msgSender()
            internal
            override
            view
            returns (address sender)
        {
            return ContextMixin.msgSender();
        }
    
    /**
     * @dev Mints a token to an address with a tokenURI.
     * @param _to address of the future owner of the token
     */
    function mintTo(address _to) public onlyOwner {
        uint256 tokenId = _nextTokenId.current();
        require(tokenId > 0 && tokenId < total_supply + 1, "Exceeds token supply");
        _nextTokenId.increment();
        _safeMint(_to, tokenId);
    }

    /**
     * @dev Claim a token to an address with a tokenURI.
     * @param _to address of the future owner of the token
     */
    function claimTo(address _to) private {
        uint256 tokenId = _nextTokenId.current();
        require(tokenId > 0 && tokenId < total_supply + 1, "Exceeds token supply");
        _nextTokenId.increment();
        _safeMint(_to, tokenId);
    }

    /**
     * @dev Claim a token to an address with a tokenURI.
     */
    function claim(uint number) public payable {
        require(claim_mod == true, "Claim is off;");
        require(0 < number && number < 11 , "Only 10 mints in one claim");
        require(number * price == msg.value);

        if(whitelist_mod){    
            if(isWhitelisted(_msgSender()) == true && number < 4 && whitelist[_msgSender()] + number <= 4 ){
                for (uint i=0; i<number; i++) {
                        addMintCounter(_msgSender());
                        claimTo(_msgSender());
                }
            }
        }else{
            for (uint i=0; i<number; i++) {
                claimTo(_msgSender());               
            }
        }
    }

    /**
     * @dev Set price for token mint in WEI.
     * @param _value address of the future owner of the token
     */
    function setPriceInWei(uint256 _value) public {
        require(owner() == _msgSender() || admin == _msgSender());
        require(_value >= 0, "Price must be > -0");
        price = _value;
    }
    
    /**
     * @dev Turn on whitelist mod. Only WL users could claim NFT.
     */
    function whitelistMod(bool value) public {
        require(owner() == _msgSender() || admin == _msgSender());
        whitelist_mod = value;
    }

    /**
     * @dev Turn on pre-reveal mod. All NFT Metadata are the same.
     */
    function revealMod(bool value) public {
        require(owner() == _msgSender() || admin == _msgSender());
        reveal = value;
    }

    /**
     * @dev Turn on/off claim mod.
     */
    function claimMod(bool value) public {
        require(owner() == _msgSender() || admin == _msgSender());
        claim_mod = value;
    }

    /**
     * @dev Set 1# wallet that will receive 1% of profit.
     */
    function setUser1_1(address wallet) public onlyOwner {
        wallet1_1 = wallet;
    }

    /**
     * @dev Set 2# wallet that will receive 1% of profit.
     */
    function setUser2_1(address wallet) public onlyOwner {
        wallet2_1 = wallet;
    }

    /**
     * @dev Set 3# wallet that will receive 98% of profit.
     */
    function setUser3_88(address wallet) public onlyOwner {
        wallet3_88 = wallet;
    }

    /**
     * @dev Set 4# wallet that will receive 10% of profit.
     */
    function setUser4_10(address wallet) public onlyOwner {
        wallet4_10 = wallet;
    }

    /**
     * @dev Set Admin wallet.
     */
    function setAdmin(address wallet) public onlyOwner {
        admin = wallet;
    }


    /**
     * @dev This will allow to rescue profit from the contract.
     */
    function rescueTokensFromContract() external onlyOwner {
        uint256 balance_1 = address(this).balance / 100 ;
        uint256 balance_10 = address(this).balance / 10 ;
        uint256 balance_88 = address(this).balance - 2*balance_1 - balance_10;
        payable(wallet1_1).transfer(balance_1);  
        payable(wallet2_1).transfer(balance_1);  
        payable(wallet3_88).transfer(balance_88);   
        payable(wallet4_10).transfer(balance_10);  
    
    }

    /**
     * @dev This will allow to check if wallet is whitelisted.
     */
    function isWhitelisted(address wallet) public view returns(bool) {
        return whitelist[wallet] > 0;
    }

    /**
     * @dev This will return the current price in. WEI.
     */
    function getPrice() public view returns(uint256) {
        return price;
    }

    /**
     * @dev This will return the value of WL mod.
     */
    function getWhitelist() public view returns(bool) {
        return whitelist_mod;
    }

    /**
     * @dev This will return the value of total supply.
     */
    function totalSupply() public view returns(uint256) {
        return total_supply;
    }

    /**
     * @dev This will return the value of total minted tokens.
     */
    function getMinted() public view returns(uint256) {
        return _nextTokenId.current() - 1;
    }


    /**
     * @dev This will update the number of minted NFTs per whitelisted wallet.
     */
    function addMintCounter(address wallet) private {
        require(whitelist[wallet] < 4, "Address is full; Only 3 mints per WL Address");
        whitelist[wallet] = whitelist[wallet] + 1;
    }

    /**
     * @dev This will add the wallet to the whitelist.
     */
    function addWalletToWhitelist(address wallet) public {
        require(owner() == _msgSender() || admin == _msgSender());
        whitelist[wallet] = 1;
    }

    /**
     * @dev This will add the wallets to the whitelist.
     */
    function addWalletsToWhitelist(address[] memory wallets) public {
        require(owner() == _msgSender() || admin == _msgSender());
        // We know the length of the array
        uint arrayLength = wallets.length;
        for (uint i=0; i<arrayLength; i++) {
            addWalletToWhitelist(wallets[i]);
        }
    }

    /**
     * @dev This will return the token ids per wallet.
     */
    function getIdsByOwner(address wallet) public view returns(uint[] memory){
        uint256 amount = balanceOf(wallet);
        uint256[] memory array = new uint[](amount);
        uint256 j = 0;
        for (uint i=1; i<getMinted()+1; i++) {
             if(ERC721._owners[i] == wallet){
                array[j] = i;
                j++;
             }
        }
        return array;
    }

}



/**
 * @title Creature
 * Creature - a contract for my non-fungible creatures.
 */
contract BonfireClub is ERC721Tradable {
    string _tokenURI;  

    constructor() ERC721Tradable("Bonfire Club", "BFC") { 
        _tokenURI = "https://bonfireclub.mypinata.cloud/ipfs/QmRFhQsJxektZ539yrfR7j3sLbDJgAyS7nSV7gbTKoxhpD";
        wallet1_1 = msg.sender;
        wallet2_1 = msg.sender;
        wallet3_88 = msg.sender;
        wallet4_10 = msg.sender;
    }

    /**
     * @dev This will return the current token URI.
     */
    function baseTokenURI() public view override returns (string memory) {
        return _tokenURI;
    }

    /**
     * @dev This will update the current token URI.
     */
    function _setTokenURI(string memory tokenURI) public onlyOwner {
            _tokenURI = tokenURI;
    }

     /**
     * @dev This will update the current token URI by Admin.
     */
    function _setTokenURIByAdmin(string memory tokenURI) public {
            require(_msgSender() == ERC721Tradable.admin);
            _tokenURI = tokenURI;
    }
}

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":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_owners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tokenURI","type":"string"}],"name":"_setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenURI","type":"string"}],"name":"_setTokenURIByAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"addWalletToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"}],"name":"addWalletsToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"claimMod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim_mod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getIdsByOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescueTokensFromContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"revealMod","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":"wallet","type":"address"}],"name":"setAdmin","outputs":[],"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":"uint256","name":"_value","type":"uint256"}],"name":"setPriceInWei","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"name":"setProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setUser1_1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setUser2_1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setUser3_88","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setUser4_10","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"wallet1_1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wallet2_1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wallet3_88","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wallet4_10","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"whitelistMod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelist_mod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040526000600660006101000a81548160ff0219169083151502179055506122b8600a5566d529ae9e860000600b556000600c60006101000a81548160ff0219169083151502179055506000600c60016101000a81548160ff0219169083151502179055506001600c60026101000a81548160ff0219169083151502179055503480156200008e57600080fd5b506040518060400160405280600c81526020017f426f6e6669726520436c756200000000000000000000000000000000000000008152506040518060400160405280600381526020017f4246430000000000000000000000000000000000000000000000000000000000815250818181600090816200010e919062000859565b50806001908162000120919062000859565b5050506200014362000137620002f760201b60201c565b6200031360201b60201c565b73a5409ec958c83c3f309868babaca7c86dcb077c1601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001af6013620003d960201b62002d811760201c565b620001c082620003ef60201b60201c565b50506040518060800160405280605681526020016200698b6056913960159081620001ec919062000859565b5033600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000a80565b60006200030e6200047160201b62002d971760201c565b905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b600660009054906101000a900460ff161562000442576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200043990620009a1565b60405180910390fd5b62000453816200052360201b60201c565b6001600660006101000a81548160ff02191690831515021790555050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16036200051c57600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff81830151169250505062000520565b3390505b90565b6040518060800160405280604f8152602001620069e1604f91398051906020012081805190602001206040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525080519060200120306200059a620005d260201b60201c565b60001b604051602001620005b395949392919062000a23565b6040516020818303038152906040528051906020012060078190555050565b6000804690508091505090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200066157607f821691505b60208210810362000677576200067662000619565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006e17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620006a2565b620006ed8683620006a2565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200073a620007346200072e8462000705565b6200070f565b62000705565b9050919050565b6000819050919050565b620007568362000719565b6200076e620007658262000741565b848454620006af565b825550505050565b600090565b6200078562000776565b620007928184846200074b565b505050565b5b81811015620007ba57620007ae6000826200077b565b60018101905062000798565b5050565b601f8211156200080957620007d3816200067d565b620007de8462000692565b81016020851015620007ee578190505b62000806620007fd8562000692565b83018262000797565b50505b505050565b600082821c905092915050565b60006200082e600019846008026200080e565b1980831691505092915050565b60006200084983836200081b565b9150826002028217905092915050565b6200086482620005df565b67ffffffffffffffff81111562000880576200087f620005ea565b5b6200088c825462000648565b62000899828285620007be565b600060209050601f831160018114620008d15760008415620008bc578287015190505b620008c885826200083b565b86555062000938565b601f198416620008e1866200067d565b60005b828110156200090b57848901518255600182019150602085019450602081019050620008e4565b868310156200092b578489015162000927601f8916826200081b565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f616c726561647920696e69746564000000000000000000000000000000000000600082015250565b600062000989600e8362000940565b9150620009968262000951565b602082019050919050565b60006020820190508181036000830152620009bc816200097a565b9050919050565b6000819050919050565b620009d881620009c3565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a0b82620009de565b9050919050565b62000a1d81620009fe565b82525050565b600060a08201905062000a3a6000830188620009cd565b62000a496020830187620009cd565b62000a586040830186620009cd565b62000a67606083018562000a12565b62000a766080830184620009cd565b9695505050505050565b615efb8062000a906000396000f3fe6080604052600436106103815760003560e01c80638774e5d0116101d1578063ad7c73ce11610102578063d01f63f5116100a0578063e985e9c51161006f578063e985e9c514610cf4578063f2fde38b14610d31578063f851a44014610d5a578063f89b74ad14610d8557610381565b8063d01f63f514610c4a578063d1f8c50214610c75578063d547cfb714610ca0578063e661ae0314610ccb57610381565b8063ba1c0547116100dc578063ba1c054714610ba2578063be2863ab14610bb9578063c87b56dd14610be2578063cd7c032614610c1f57610381565b8063ad7c73ce14610b27578063b06ceba514610b50578063b88d4fde14610b7957610381565b8063992924a61161016f578063a22cb46511610149578063a22cb46514610a7d578063a475b5dd14610aa6578063aaab84f114610ad1578063ac72200d14610afc57610381565b8063992924a6146109d85780639b19251a14610a15578063a035b1fe14610a5257610381565b80638da5cb5b116101ab5780638da5cb5b1461092e57806395d89b411461095957806397107d6d1461098457806398d5fdca146109ad57610381565b80638774e5d0146108b357806387f350b8146108dc57806389c5560d1461090557610381565b80633408e470116102b657806342842e0e11610254578063704b6c0211610223578063704b6c021461080d57806370a0823114610836578063715018a614610873578063755edd171461088a57610381565b806342842e0e146107535780634d2c8f371461077c5780635e0f046e146107a55780636352211e146107d057610381565b8063379607f511610290578063379607f5146106a65780633940e9ee146106c25780633af32abf146106ed5780633f0f42e21461072a57610381565b80633408e47014610627578063357fe9791461065257806335b3dea41461067d57610381565b80630f7e59701161032357806320379ee5116102fd57806320379ee51461056b578063233dc86b1461059657806323b872dd146105c15780632d0335ab146105ea57610381565b80630f7e5970146104ec5780631196f24f1461051757806318160ddd1461054057610381565b8063095ea7b31161035f578063095ea7b31461042b5780630c53c51c146104545780630e282166146104845780630e37eab0146104c157610381565b806301ffc9a71461038657806306fdde03146103c3578063081812fc146103ee575b600080fd5b34801561039257600080fd5b506103ad60048036038101906103a89190613f80565b610dae565b6040516103ba9190613fc8565b60405180910390f35b3480156103cf57600080fd5b506103d8610e90565b6040516103e59190614073565b60405180910390f35b3480156103fa57600080fd5b50610415600480360381019061041091906140cb565b610f22565b6040516104229190614139565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d9190614180565b610fa7565b005b61046e60048036038101906104699190614364565b6110be565b60405161047b9190614450565b60405180910390f35b34801561049057600080fd5b506104ab60048036038101906104a69190614472565b611330565b6040516104b8919061455d565b60405180910390f35b3480156104cd57600080fd5b506104d6611463565b6040516104e39190613fc8565b60405180910390f35b3480156104f857600080fd5b50610501611476565b60405161050e9190614073565b60405180910390f35b34801561052357600080fd5b5061053e600480360381019061053991906145ab565b6114af565b005b34801561054c57600080fd5b50610555611571565b60405161056291906145e7565b60405180910390f35b34801561057757600080fd5b5061058061157b565b60405161058d9190614611565b60405180910390f35b3480156105a257600080fd5b506105ab611585565b6040516105b89190613fc8565b60405180910390f35b3480156105cd57600080fd5b506105e860048036038101906105e3919061462c565b611598565b005b3480156105f657600080fd5b50610611600480360381019061060c9190614472565b6115f8565b60405161061e91906145e7565b60405180910390f35b34801561063357600080fd5b5061063c611641565b60405161064991906145e7565b60405180910390f35b34801561065e57600080fd5b5061066761164e565b6040516106749190614139565b60405180910390f35b34801561068957600080fd5b506106a4600480360381019061069f91906145ab565b611674565b005b6106c060048036038101906106bb91906140cb565b611736565b005b3480156106ce57600080fd5b506106d7611907565b6040516106e491906145e7565b60405180910390f35b3480156106f957600080fd5b50610714600480360381019061070f9190614472565b61190d565b6040516107219190613fc8565b60405180910390f35b34801561073657600080fd5b50610751600480360381019061074c9190614472565b611958565b005b34801561075f57600080fd5b5061077a6004803603810190610775919061462c565b611a45565b005b34801561078857600080fd5b506107a3600480360381019061079e9190614472565b611a65565b005b3480156107b157600080fd5b506107ba611b25565b6040516107c79190614139565b60405180910390f35b3480156107dc57600080fd5b506107f760048036038101906107f291906140cb565b611b4b565b6040516108049190614139565b60405180910390f35b34801561081957600080fd5b50610834600480360381019061082f9190614472565b611bfc565b005b34801561084257600080fd5b5061085d60048036038101906108589190614472565b611cbc565b60405161086a91906145e7565b60405180910390f35b34801561087f57600080fd5b50610888611d73565b005b34801561089657600080fd5b506108b160048036038101906108ac9190614472565b611dfb565b005b3480156108bf57600080fd5b506108da60048036038101906108d591906140cb565b611ef9565b005b3480156108e857600080fd5b5061090360048036038101906108fe9190614720565b611fec565b005b34801561091157600080fd5b5061092c60048036038101906109279190614720565b61207b565b005b34801561093a57600080fd5b506109436120ef565b6040516109509190614139565b60405180910390f35b34801561096557600080fd5b5061096e612119565b60405161097b9190614073565b60405180910390f35b34801561099057600080fd5b506109ab60048036038101906109a69190614472565b6121ab565b005b3480156109b957600080fd5b506109c2612294565b6040516109cf91906145e7565b60405180910390f35b3480156109e457600080fd5b506109ff60048036038101906109fa91906140cb565b61229e565b604051610a0c9190614139565b60405180910390f35b348015610a2157600080fd5b50610a3c6004803603810190610a379190614472565b6122d1565b604051610a4991906145e7565b60405180910390f35b348015610a5e57600080fd5b50610a676122e9565b604051610a7491906145e7565b60405180910390f35b348015610a8957600080fd5b50610aa46004803603810190610a9f9190614769565b6122ef565b005b348015610ab257600080fd5b50610abb612305565b604051610ac89190613fc8565b60405180910390f35b348015610add57600080fd5b50610ae6612318565b604051610af39190614139565b60405180910390f35b348015610b0857600080fd5b50610b1161233e565b604051610b1e91906145e7565b60405180910390f35b348015610b3357600080fd5b50610b4e6004803603810190610b499190614472565b61235b565b005b348015610b5c57600080fd5b50610b776004803603810190610b7291906145ab565b61241b565b005b348015610b8557600080fd5b50610ba06004803603810190610b9b91906147a9565b6124dd565b005b348015610bae57600080fd5b50610bb761253f565b005b348015610bc557600080fd5b50610be06004803603810190610bdb91906148f4565b6127ad565b005b348015610bee57600080fd5b50610c096004803603810190610c0491906140cb565b61289e565b604051610c169190614073565b60405180910390f35b348015610c2b57600080fd5b50610c346128fd565b604051610c419190614139565b60405180910390f35b348015610c5657600080fd5b50610c5f612923565b604051610c6c9190613fc8565b60405180910390f35b348015610c8157600080fd5b50610c8a61293a565b604051610c979190614139565b60405180910390f35b348015610cac57600080fd5b50610cb5612960565b604051610cc29190614073565b60405180910390f35b348015610cd757600080fd5b50610cf26004803603810190610ced9190614472565b6129f2565b005b348015610d0057600080fd5b50610d1b6004803603810190610d16919061493d565b612ab2565b604051610d289190613fc8565b60405180910390f35b348015610d3d57600080fd5b50610d586004803603810190610d539190614472565b612ba4565b005b348015610d6657600080fd5b50610d6f612c9b565b604051610d7c9190614139565b60405180910390f35b348015610d9157600080fd5b50610dac6004803603810190610da79190614472565b612cc1565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e7957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e895750610e8882612e47565b5b9050919050565b606060008054610e9f906149ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610ecb906149ac565b8015610f185780601f10610eed57610100808354040283529160200191610f18565b820191906000526020600020905b815481529060010190602001808311610efb57829003601f168201915b5050505050905090565b6000610f2d82612eb1565b610f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6390614a4f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610fb282611b4b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611022576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101990614ae1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611041612f1d565b73ffffffffffffffffffffffffffffffffffffffff161480611070575061106f8161106a612f1d565b612ab2565b5b6110af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a690614b73565b60405180910390fd5b6110b98383612f2c565b505050565b606060006040518060600160405280600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018781525090506111418782878787612fe5565b611180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117790614c05565b60405180910390fd5b6111d36001600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546130ed90919063ffffffff16565b600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b87338860405161124993929190614c46565b60405180910390a16000803073ffffffffffffffffffffffffffffffffffffffff16888a60405160200161127e929190614d08565b60405160208183030381529060405260405161129a9190614d30565b6000604051808303816000865af19150503d80600081146112d7576040519150601f19603f3d011682016040523d82523d6000602084013e6112dc565b606091505b509150915081611321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131890614d93565b60405180910390fd5b80935050505095945050505050565b6060600061133d83611cbc565b905060008167ffffffffffffffff81111561135b5761135a6141ca565b5b6040519080825280602002602001820160405280156113895781602001602082028036833780820191505090505b509050600080600190505b600161139e61233e565b6113a89190614de2565b811015611457578573ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611444578083838151811061142957611428614e16565b5b602002602001018181525050818061144090614e45565b9250505b808061144f90614e45565b915050611394565b50819350505050919050565b600c60009054906101000a900460ff1681565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b6114b7612f1d565b73ffffffffffffffffffffffffffffffffffffffff166114d56120ef565b73ffffffffffffffffffffffffffffffffffffffff16148061154b57506114fa612f1d565b73ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61155457600080fd5b80600c60006101000a81548160ff02191690831515021790555050565b6000600a54905090565b6000600754905090565b600c60029054906101000a900460ff1681565b6115a96115a3612f1d565b82613103565b6115e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115df90614eff565b60405180910390fd5b6115f38383836131e1565b505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000804690508091505090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61167c612f1d565b73ffffffffffffffffffffffffffffffffffffffff1661169a6120ef565b73ffffffffffffffffffffffffffffffffffffffff16148061171057506116bf612f1d565b73ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61171957600080fd5b80600c60026101000a81548160ff02191690831515021790555050565b60011515600c60009054906101000a900460ff1615151461178c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178390614f6b565b60405180910390fd5b80600010801561179c5750600b81105b6117db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d290614fd7565b60405180910390fd5b34600b54826117ea9190614ff7565b146117f457600080fd5b600c60029054906101000a900460ff16156118d4576001151561181d611818612f1d565b61190d565b151514801561182c5750600481105b801561188a5750600481600d6000611842612f1d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118879190614de2565b11155b156118cf5760005b818110156118cd576118aa6118a5612f1d565b613447565b6118ba6118b5612f1d565b61355b565b80806118c590614e45565b915050611892565b505b611904565b60005b81811015611902576118ef6118ea612f1d565b61355b565b80806118fa90614e45565b9150506118d7565b505b50565b600a5481565b600080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054119050919050565b611960612f1d565b73ffffffffffffffffffffffffffffffffffffffff1661197e6120ef565b73ffffffffffffffffffffffffffffffffffffffff1614806119f457506119a3612f1d565b73ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6119fd57600080fd5b6001600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b611a60838383604051806020016040528060008152506124dd565b505050565b611a6d612f1d565b73ffffffffffffffffffffffffffffffffffffffff16611a8b6120ef565b73ffffffffffffffffffffffffffffffffffffffff1614611ae1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad89061509d565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bea9061512f565b60405180910390fd5b80915050919050565b611c04612f1d565b73ffffffffffffffffffffffffffffffffffffffff16611c226120ef565b73ffffffffffffffffffffffffffffffffffffffff1614611c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6f9061509d565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d23906151c1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611d7b612f1d565b73ffffffffffffffffffffffffffffffffffffffff16611d996120ef565b73ffffffffffffffffffffffffffffffffffffffff1614611def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de69061509d565b60405180910390fd5b611df960006135dd565b565b611e03612f1d565b73ffffffffffffffffffffffffffffffffffffffff16611e216120ef565b73ffffffffffffffffffffffffffffffffffffffff1614611e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6e9061509d565b60405180910390fd5b6000611e8360136136a3565b9050600081118015611ea257506001600a54611e9f9190614de2565b81105b611ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed89061522d565b60405180910390fd5b611eeb6013612d81565b611ef582826136b1565b5050565b611f01612f1d565b73ffffffffffffffffffffffffffffffffffffffff16611f1f6120ef565b73ffffffffffffffffffffffffffffffffffffffff161480611f955750611f44612f1d565b73ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611f9e57600080fd5b6000811015611fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd990615299565b60405180910390fd5b80600b8190555050565b611ff4612f1d565b73ffffffffffffffffffffffffffffffffffffffff166120126120ef565b73ffffffffffffffffffffffffffffffffffffffff1614612068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205f9061509d565b60405180910390fd5b80601590816120779190615465565b5050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166120bc612f1d565b73ffffffffffffffffffffffffffffffffffffffff16146120dc57600080fd5b80601590816120eb9190615465565b5050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054612128906149ac565b80601f0160208091040260200160405190810160405280929190818152602001828054612154906149ac565b80156121a15780601f10612176576101008083540402835291602001916121a1565b820191906000526020600020905b81548152906001019060200180831161218457829003601f168201915b5050505050905090565b6121b3612f1d565b73ffffffffffffffffffffffffffffffffffffffff166121d16120ef565b73ffffffffffffffffffffffffffffffffffffffff16148061224757506121f6612f1d565b73ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61225057600080fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600b54905090565b60026020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d6020528060005260406000206000915090505481565b600b5481565b6123016122fa612f1d565b83836136cf565b5050565b600c60019054906101000a900460ff1681565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600161234c60136136a3565b6123569190615537565b905090565b612363612f1d565b73ffffffffffffffffffffffffffffffffffffffff166123816120ef565b73ffffffffffffffffffffffffffffffffffffffff16146123d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ce9061509d565b60405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612423612f1d565b73ffffffffffffffffffffffffffffffffffffffff166124416120ef565b73ffffffffffffffffffffffffffffffffffffffff1614806124b75750612466612f1d565b73ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6124c057600080fd5b80600c60016101000a81548160ff02191690831515021790555050565b6124ee6124e8612f1d565b83613103565b61252d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252490614eff565b60405180910390fd5b6125398484848461383b565b50505050565b612547612f1d565b73ffffffffffffffffffffffffffffffffffffffff166125656120ef565b73ffffffffffffffffffffffffffffffffffffffff16146125bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b29061509d565b60405180910390fd5b60006064476125ca919061559a565b90506000600a476125db919061559a565b90506000818360026125ed9190614ff7565b476125f89190615537565b6126029190615537565b9050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505015801561266c573d6000803e3d6000fd5b50600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156126d5573d6000803e3d6000fd5b50601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561273e573d6000803e3d6000fd5b50601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156127a7573d6000803e3d6000fd5b50505050565b6127b5612f1d565b73ffffffffffffffffffffffffffffffffffffffff166127d36120ef565b73ffffffffffffffffffffffffffffffffffffffff16148061284957506127f8612f1d565b73ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61285257600080fd5b60008151905060005b818110156128995761288683828151811061287957612878614e16565b5b6020026020010151611958565b808061289190614e45565b91505061285b565b505050565b6060600c60019054906101000a900460ff16156128ed576128bd612960565b6128c683613897565b6040516020016128d792919061569f565b60405160208183030381529060405290506128f8565b6128f5612960565b90505b919050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600c60029054906101000a900460ff16905090565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606015805461296f906149ac565b80601f016020809104026020016040519081016040528092919081815260200182805461299b906149ac565b80156129e85780601f106129bd576101008083540402835291602001916129e8565b820191906000526020600020905b8154815290600101906020018083116129cb57829003601f168201915b5050505050905090565b6129fa612f1d565b73ffffffffffffffffffffffffffffffffffffffff16612a186120ef565b73ffffffffffffffffffffffffffffffffffffffff1614612a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a659061509d565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401612b2a9190614139565b602060405180830381865afa158015612b47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6b9190615717565b73ffffffffffffffffffffffffffffffffffffffff1603612b90576001915050612b9e565b612b9a84846139f7565b9150505b92915050565b612bac612f1d565b73ffffffffffffffffffffffffffffffffffffffff16612bca6120ef565b73ffffffffffffffffffffffffffffffffffffffff1614612c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c179061509d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c86906157b6565b60405180910390fd5b612c98816135dd565b50565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612cc9612f1d565b73ffffffffffffffffffffffffffffffffffffffff16612ce76120ef565b73ffffffffffffffffffffffffffffffffffffffff1614612d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d349061509d565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6001816000016000828254019250508190555050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603612e4057600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050612e44565b3390505b90565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000612f27612d97565b905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612f9f83611b4b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603613055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304c90615848565b60405180910390fd5b600161306861306387613a8b565b613af3565b838686604051600081526020016040526040516130889493929190615877565b6020604051602081039080840390855afa1580156130aa573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600081836130fb9190614de2565b905092915050565b600061310e82612eb1565b61314d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131449061592e565b60405180910390fd5b600061315883611b4b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806131c757508373ffffffffffffffffffffffffffffffffffffffff166131af84610f22565b73ffffffffffffffffffffffffffffffffffffffff16145b806131d857506131d78185612ab2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661320182611b4b565b73ffffffffffffffffffffffffffffffffffffffff1614613257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324e906159c0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036132c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132bd90615a52565b60405180910390fd5b6132d1838383613b2c565b6132dc600082612f2c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461332c9190615537565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133839190614de2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613442838383613b31565b505050565b6004600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106134c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134c090615ae4565b60405180910390fd5b6001600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135159190614de2565b600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b600061356760136136a3565b905060008111801561358657506001600a546135839190614de2565b81105b6135c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135bc9061522d565b60405180910390fd5b6135cf6013612d81565b6135d982826136b1565b5050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6136cb828260405180602001604052806000815250613b36565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361373d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161373490615b50565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161382e9190613fc8565b60405180910390a3505050565b6138468484846131e1565b61385284848484613b91565b613891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161388890615be2565b60405180910390fd5b50505050565b6060600082036138de576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506139f2565b600082905060005b600082146139105780806138f990614e45565b915050600a82613909919061559a565b91506138e6565b60008167ffffffffffffffff81111561392c5761392b6141ca565b5b6040519080825280601f01601f19166020018201604052801561395e5781602001600182028036833780820191505090505b5090505b600085146139eb576001826139779190615537565b9150600a856139869190615c02565b60306139929190614de2565b60f81b8183815181106139a8576139a7614e16565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856139e4919061559a565b9450613962565b8093505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000604051806080016040528060438152602001615e83604391398051906020012082600001518360200151846040015180519060200120604051602001613ad69493929190615c33565b604051602081830303815290604052805190602001209050919050565b6000613afd61157b565b82604051602001613b0f929190615ce5565b604051602081830303815290604052805190602001209050919050565b505050565b505050565b613b408383613d18565b613b4d6000848484613b91565b613b8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b8390615be2565b60405180910390fd5b505050565b6000613bb28473ffffffffffffffffffffffffffffffffffffffff16613ef1565b15613d0b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613bdb612f1d565b8786866040518563ffffffff1660e01b8152600401613bfd9493929190615d1c565b6020604051808303816000875af1925050508015613c3957506040513d601f19601f82011682018060405250810190613c369190615d7d565b60015b613cbb573d8060008114613c69576040519150601f19603f3d011682016040523d82523d6000602084013e613c6e565b606091505b506000815103613cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613caa90615be2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613d10565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d7e90615df6565b60405180910390fd5b613d9081612eb1565b15613dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dc790615e62565b60405180910390fd5b613ddc60008383613b2c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613e2c9190614de2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613eed60008383613b31565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613f5d81613f28565b8114613f6857600080fd5b50565b600081359050613f7a81613f54565b92915050565b600060208284031215613f9657613f95613f1e565b5b6000613fa484828501613f6b565b91505092915050565b60008115159050919050565b613fc281613fad565b82525050565b6000602082019050613fdd6000830184613fb9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561401d578082015181840152602081019050614002565b60008484015250505050565b6000601f19601f8301169050919050565b600061404582613fe3565b61404f8185613fee565b935061405f818560208601613fff565b61406881614029565b840191505092915050565b6000602082019050818103600083015261408d818461403a565b905092915050565b6000819050919050565b6140a881614095565b81146140b357600080fd5b50565b6000813590506140c58161409f565b92915050565b6000602082840312156140e1576140e0613f1e565b5b60006140ef848285016140b6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614123826140f8565b9050919050565b61413381614118565b82525050565b600060208201905061414e600083018461412a565b92915050565b61415d81614118565b811461416857600080fd5b50565b60008135905061417a81614154565b92915050565b6000806040838503121561419757614196613f1e565b5b60006141a58582860161416b565b92505060206141b6858286016140b6565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61420282614029565b810181811067ffffffffffffffff82111715614221576142206141ca565b5b80604052505050565b6000614234613f14565b905061424082826141f9565b919050565b600067ffffffffffffffff8211156142605761425f6141ca565b5b61426982614029565b9050602081019050919050565b82818337600083830152505050565b600061429861429384614245565b61422a565b9050828152602081018484840111156142b4576142b36141c5565b5b6142bf848285614276565b509392505050565b600082601f8301126142dc576142db6141c0565b5b81356142ec848260208601614285565b91505092915050565b6000819050919050565b614308816142f5565b811461431357600080fd5b50565b600081359050614325816142ff565b92915050565b600060ff82169050919050565b6143418161432b565b811461434c57600080fd5b50565b60008135905061435e81614338565b92915050565b600080600080600060a086880312156143805761437f613f1e565b5b600061438e8882890161416b565b955050602086013567ffffffffffffffff8111156143af576143ae613f23565b5b6143bb888289016142c7565b94505060406143cc88828901614316565b93505060606143dd88828901614316565b92505060806143ee8882890161434f565b9150509295509295909350565b600081519050919050565b600082825260208201905092915050565b6000614422826143fb565b61442c8185614406565b935061443c818560208601613fff565b61444581614029565b840191505092915050565b6000602082019050818103600083015261446a8184614417565b905092915050565b60006020828403121561448857614487613f1e565b5b60006144968482850161416b565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6144d481614095565b82525050565b60006144e683836144cb565b60208301905092915050565b6000602082019050919050565b600061450a8261449f565b61451481856144aa565b935061451f836144bb565b8060005b8381101561455057815161453788826144da565b9750614542836144f2565b925050600181019050614523565b5085935050505092915050565b6000602082019050818103600083015261457781846144ff565b905092915050565b61458881613fad565b811461459357600080fd5b50565b6000813590506145a58161457f565b92915050565b6000602082840312156145c1576145c0613f1e565b5b60006145cf84828501614596565b91505092915050565b6145e181614095565b82525050565b60006020820190506145fc60008301846145d8565b92915050565b61460b816142f5565b82525050565b60006020820190506146266000830184614602565b92915050565b60008060006060848603121561464557614644613f1e565b5b60006146538682870161416b565b93505060206146648682870161416b565b9250506040614675868287016140b6565b9150509250925092565b600067ffffffffffffffff82111561469a576146996141ca565b5b6146a382614029565b9050602081019050919050565b60006146c36146be8461467f565b61422a565b9050828152602081018484840111156146df576146de6141c5565b5b6146ea848285614276565b509392505050565b600082601f830112614707576147066141c0565b5b81356147178482602086016146b0565b91505092915050565b60006020828403121561473657614735613f1e565b5b600082013567ffffffffffffffff81111561475457614753613f23565b5b614760848285016146f2565b91505092915050565b600080604083850312156147805761477f613f1e565b5b600061478e8582860161416b565b925050602061479f85828601614596565b9150509250929050565b600080600080608085870312156147c3576147c2613f1e565b5b60006147d18782880161416b565b94505060206147e28782880161416b565b93505060406147f3878288016140b6565b925050606085013567ffffffffffffffff81111561481457614813613f23565b5b614820878288016142c7565b91505092959194509250565b600067ffffffffffffffff821115614847576148466141ca565b5b602082029050602081019050919050565b600080fd5b600061487061486b8461482c565b61422a565b9050808382526020820190506020840283018581111561489357614892614858565b5b835b818110156148bc57806148a8888261416b565b845260208401935050602081019050614895565b5050509392505050565b600082601f8301126148db576148da6141c0565b5b81356148eb84826020860161485d565b91505092915050565b60006020828403121561490a57614909613f1e565b5b600082013567ffffffffffffffff81111561492857614927613f23565b5b614934848285016148c6565b91505092915050565b6000806040838503121561495457614953613f1e565b5b60006149628582860161416b565b92505060206149738582860161416b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806149c457607f821691505b6020821081036149d7576149d661497d565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614a39602c83613fee565b9150614a44826149dd565b604082019050919050565b60006020820190508181036000830152614a6881614a2c565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614acb602183613fee565b9150614ad682614a6f565b604082019050919050565b60006020820190508181036000830152614afa81614abe565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614b5d603883613fee565b9150614b6882614b01565b604082019050919050565b60006020820190508181036000830152614b8c81614b50565b9050919050565b7f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b6000614bef602183613fee565b9150614bfa82614b93565b604082019050919050565b60006020820190508181036000830152614c1e81614be2565b9050919050565b6000614c30826140f8565b9050919050565b614c4081614c25565b82525050565b6000606082019050614c5b600083018661412a565b614c686020830185614c37565b8181036040830152614c7a8184614417565b9050949350505050565b600081905092915050565b6000614c9a826143fb565b614ca48185614c84565b9350614cb4818560208601613fff565b80840191505092915050565b60008160601b9050919050565b6000614cd882614cc0565b9050919050565b6000614cea82614ccd565b9050919050565b614d02614cfd82614118565b614cdf565b82525050565b6000614d148285614c8f565b9150614d208284614cf1565b6014820191508190509392505050565b6000614d3c8284614c8f565b915081905092915050565b7f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000600082015250565b6000614d7d601c83613fee565b9150614d8882614d47565b602082019050919050565b60006020820190508181036000830152614dac81614d70565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614ded82614095565b9150614df883614095565b9250828201905080821115614e1057614e0f614db3565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614e5082614095565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e8257614e81614db3565b5b600182019050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614ee9603183613fee565b9150614ef482614e8d565b604082019050919050565b60006020820190508181036000830152614f1881614edc565b9050919050565b7f436c61696d206973206f66663b00000000000000000000000000000000000000600082015250565b6000614f55600d83613fee565b9150614f6082614f1f565b602082019050919050565b60006020820190508181036000830152614f8481614f48565b9050919050565b7f4f6e6c79203130206d696e747320696e206f6e6520636c61696d000000000000600082015250565b6000614fc1601a83613fee565b9150614fcc82614f8b565b602082019050919050565b60006020820190508181036000830152614ff081614fb4565b9050919050565b600061500282614095565b915061500d83614095565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561504657615045614db3565b5b828202905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615087602083613fee565b915061509282615051565b602082019050919050565b600060208201905081810360008301526150b68161507a565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000615119602983613fee565b9150615124826150bd565b604082019050919050565b600060208201905081810360008301526151488161510c565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006151ab602a83613fee565b91506151b68261514f565b604082019050919050565b600060208201905081810360008301526151da8161519e565b9050919050565b7f4578636565647320746f6b656e20737570706c79000000000000000000000000600082015250565b6000615217601483613fee565b9150615222826151e1565b602082019050919050565b600060208201905081810360008301526152468161520a565b9050919050565b7f5072696365206d757374206265203e202d300000000000000000000000000000600082015250565b6000615283601283613fee565b915061528e8261524d565b602082019050919050565b600060208201905081810360008301526152b281615276565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261531b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826152de565b61532586836152de565b95508019841693508086168417925050509392505050565b6000819050919050565b600061536261535d61535884614095565b61533d565b614095565b9050919050565b6000819050919050565b61537c83615347565b61539061538882615369565b8484546152eb565b825550505050565b600090565b6153a5615398565b6153b0818484615373565b505050565b5b818110156153d4576153c960008261539d565b6001810190506153b6565b5050565b601f821115615419576153ea816152b9565b6153f3846152ce565b81016020851015615402578190505b61541661540e856152ce565b8301826153b5565b50505b505050565b600082821c905092915050565b600061543c6000198460080261541e565b1980831691505092915050565b6000615455838361542b565b9150826002028217905092915050565b61546e82613fe3565b67ffffffffffffffff811115615487576154866141ca565b5b61549182546149ac565b61549c8282856153d8565b600060209050601f8311600181146154cf57600084156154bd578287015190505b6154c78582615449565b86555061552f565b601f1984166154dd866152b9565b60005b82811015615505578489015182556001820191506020850194506020810190506154e0565b86831015615522578489015161551e601f89168261542b565b8355505b6001600288020188555050505b505050505050565b600061554282614095565b915061554d83614095565b925082820390508181111561556557615564614db3565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006155a582614095565b91506155b083614095565b9250826155c0576155bf61556b565b5b828204905092915050565b600081905092915050565b60006155e182613fe3565b6155eb81856155cb565b93506155fb818560208601613fff565b80840191505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b600061563d6001836155cb565b915061564882615607565b600182019050919050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006156896005836155cb565b915061569482615653565b600582019050919050565b60006156ab82856155d6565b91506156b682615630565b91506156c282846155d6565b91506156cd8261567c565b91508190509392505050565b60006156e482614118565b9050919050565b6156f4816156d9565b81146156ff57600080fd5b50565b600081519050615711816156eb565b92915050565b60006020828403121561572d5761572c613f1e565b5b600061573b84828501615702565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006157a0602683613fee565b91506157ab82615744565b604082019050919050565b600060208201905081810360008301526157cf81615793565b9050919050565b7f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360008201527f49474e4552000000000000000000000000000000000000000000000000000000602082015250565b6000615832602583613fee565b915061583d826157d6565b604082019050919050565b6000602082019050818103600083015261586181615825565b9050919050565b6158718161432b565b82525050565b600060808201905061588c6000830187614602565b6158996020830186615868565b6158a66040830185614602565b6158b36060830184614602565b95945050505050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000615918602c83613fee565b9150615923826158bc565b604082019050919050565b600060208201905081810360008301526159478161590b565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006159aa602583613fee565b91506159b58261594e565b604082019050919050565b600060208201905081810360008301526159d98161599d565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615a3c602483613fee565b9150615a47826159e0565b604082019050919050565b60006020820190508181036000830152615a6b81615a2f565b9050919050565b7f416464726573732069732066756c6c3b204f6e6c792033206d696e747320706560008201527f7220574c20416464726573730000000000000000000000000000000000000000602082015250565b6000615ace602c83613fee565b9150615ad982615a72565b604082019050919050565b60006020820190508181036000830152615afd81615ac1565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615b3a601983613fee565b9150615b4582615b04565b602082019050919050565b60006020820190508181036000830152615b6981615b2d565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615bcc603283613fee565b9150615bd782615b70565b604082019050919050565b60006020820190508181036000830152615bfb81615bbf565b9050919050565b6000615c0d82614095565b9150615c1883614095565b925082615c2857615c2761556b565b5b828206905092915050565b6000608082019050615c486000830187614602565b615c5560208301866145d8565b615c62604083018561412a565b615c6f6060830184614602565b95945050505050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000615cae6002836155cb565b9150615cb982615c78565b600282019050919050565b6000819050919050565b615cdf615cda826142f5565b615cc4565b82525050565b6000615cf082615ca1565b9150615cfc8285615cce565b602082019150615d0c8284615cce565b6020820191508190509392505050565b6000608082019050615d31600083018761412a565b615d3e602083018661412a565b615d4b60408301856145d8565b8181036060830152615d5d8184614417565b905095945050505050565b600081519050615d7781613f54565b92915050565b600060208284031215615d9357615d92613f1e565b5b6000615da184828501615d68565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615de0602083613fee565b9150615deb82615daa565b602082019050919050565b60006020820190508181036000830152615e0f81615dd3565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615e4c601c83613fee565b9150615e5782615e16565b602082019050919050565b60006020820190508181036000830152615e7b81615e3f565b905091905056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a2646970667358221220fedf5a67b47bb27b8fe13b5b773c499c0d47762519a5eef6fd1975875c8a576064736f6c6343000810003368747470733a2f2f626f6e66697265636c75622e6d7970696e6174612e636c6f75642f697066732f516d52466851734a78656b745a35333979726652376a33734c62444a67417953376e5356376762544b6f78687044454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c7429

Deployed Bytecode

0x6080604052600436106103815760003560e01c80638774e5d0116101d1578063ad7c73ce11610102578063d01f63f5116100a0578063e985e9c51161006f578063e985e9c514610cf4578063f2fde38b14610d31578063f851a44014610d5a578063f89b74ad14610d8557610381565b8063d01f63f514610c4a578063d1f8c50214610c75578063d547cfb714610ca0578063e661ae0314610ccb57610381565b8063ba1c0547116100dc578063ba1c054714610ba2578063be2863ab14610bb9578063c87b56dd14610be2578063cd7c032614610c1f57610381565b8063ad7c73ce14610b27578063b06ceba514610b50578063b88d4fde14610b7957610381565b8063992924a61161016f578063a22cb46511610149578063a22cb46514610a7d578063a475b5dd14610aa6578063aaab84f114610ad1578063ac72200d14610afc57610381565b8063992924a6146109d85780639b19251a14610a15578063a035b1fe14610a5257610381565b80638da5cb5b116101ab5780638da5cb5b1461092e57806395d89b411461095957806397107d6d1461098457806398d5fdca146109ad57610381565b80638774e5d0146108b357806387f350b8146108dc57806389c5560d1461090557610381565b80633408e470116102b657806342842e0e11610254578063704b6c0211610223578063704b6c021461080d57806370a0823114610836578063715018a614610873578063755edd171461088a57610381565b806342842e0e146107535780634d2c8f371461077c5780635e0f046e146107a55780636352211e146107d057610381565b8063379607f511610290578063379607f5146106a65780633940e9ee146106c25780633af32abf146106ed5780633f0f42e21461072a57610381565b80633408e47014610627578063357fe9791461065257806335b3dea41461067d57610381565b80630f7e59701161032357806320379ee5116102fd57806320379ee51461056b578063233dc86b1461059657806323b872dd146105c15780632d0335ab146105ea57610381565b80630f7e5970146104ec5780631196f24f1461051757806318160ddd1461054057610381565b8063095ea7b31161035f578063095ea7b31461042b5780630c53c51c146104545780630e282166146104845780630e37eab0146104c157610381565b806301ffc9a71461038657806306fdde03146103c3578063081812fc146103ee575b600080fd5b34801561039257600080fd5b506103ad60048036038101906103a89190613f80565b610dae565b6040516103ba9190613fc8565b60405180910390f35b3480156103cf57600080fd5b506103d8610e90565b6040516103e59190614073565b60405180910390f35b3480156103fa57600080fd5b50610415600480360381019061041091906140cb565b610f22565b6040516104229190614139565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d9190614180565b610fa7565b005b61046e60048036038101906104699190614364565b6110be565b60405161047b9190614450565b60405180910390f35b34801561049057600080fd5b506104ab60048036038101906104a69190614472565b611330565b6040516104b8919061455d565b60405180910390f35b3480156104cd57600080fd5b506104d6611463565b6040516104e39190613fc8565b60405180910390f35b3480156104f857600080fd5b50610501611476565b60405161050e9190614073565b60405180910390f35b34801561052357600080fd5b5061053e600480360381019061053991906145ab565b6114af565b005b34801561054c57600080fd5b50610555611571565b60405161056291906145e7565b60405180910390f35b34801561057757600080fd5b5061058061157b565b60405161058d9190614611565b60405180910390f35b3480156105a257600080fd5b506105ab611585565b6040516105b89190613fc8565b60405180910390f35b3480156105cd57600080fd5b506105e860048036038101906105e3919061462c565b611598565b005b3480156105f657600080fd5b50610611600480360381019061060c9190614472565b6115f8565b60405161061e91906145e7565b60405180910390f35b34801561063357600080fd5b5061063c611641565b60405161064991906145e7565b60405180910390f35b34801561065e57600080fd5b5061066761164e565b6040516106749190614139565b60405180910390f35b34801561068957600080fd5b506106a4600480360381019061069f91906145ab565b611674565b005b6106c060048036038101906106bb91906140cb565b611736565b005b3480156106ce57600080fd5b506106d7611907565b6040516106e491906145e7565b60405180910390f35b3480156106f957600080fd5b50610714600480360381019061070f9190614472565b61190d565b6040516107219190613fc8565b60405180910390f35b34801561073657600080fd5b50610751600480360381019061074c9190614472565b611958565b005b34801561075f57600080fd5b5061077a6004803603810190610775919061462c565b611a45565b005b34801561078857600080fd5b506107a3600480360381019061079e9190614472565b611a65565b005b3480156107b157600080fd5b506107ba611b25565b6040516107c79190614139565b60405180910390f35b3480156107dc57600080fd5b506107f760048036038101906107f291906140cb565b611b4b565b6040516108049190614139565b60405180910390f35b34801561081957600080fd5b50610834600480360381019061082f9190614472565b611bfc565b005b34801561084257600080fd5b5061085d60048036038101906108589190614472565b611cbc565b60405161086a91906145e7565b60405180910390f35b34801561087f57600080fd5b50610888611d73565b005b34801561089657600080fd5b506108b160048036038101906108ac9190614472565b611dfb565b005b3480156108bf57600080fd5b506108da60048036038101906108d591906140cb565b611ef9565b005b3480156108e857600080fd5b5061090360048036038101906108fe9190614720565b611fec565b005b34801561091157600080fd5b5061092c60048036038101906109279190614720565b61207b565b005b34801561093a57600080fd5b506109436120ef565b6040516109509190614139565b60405180910390f35b34801561096557600080fd5b5061096e612119565b60405161097b9190614073565b60405180910390f35b34801561099057600080fd5b506109ab60048036038101906109a69190614472565b6121ab565b005b3480156109b957600080fd5b506109c2612294565b6040516109cf91906145e7565b60405180910390f35b3480156109e457600080fd5b506109ff60048036038101906109fa91906140cb565b61229e565b604051610a0c9190614139565b60405180910390f35b348015610a2157600080fd5b50610a3c6004803603810190610a379190614472565b6122d1565b604051610a4991906145e7565b60405180910390f35b348015610a5e57600080fd5b50610a676122e9565b604051610a7491906145e7565b60405180910390f35b348015610a8957600080fd5b50610aa46004803603810190610a9f9190614769565b6122ef565b005b348015610ab257600080fd5b50610abb612305565b604051610ac89190613fc8565b60405180910390f35b348015610add57600080fd5b50610ae6612318565b604051610af39190614139565b60405180910390f35b348015610b0857600080fd5b50610b1161233e565b604051610b1e91906145e7565b60405180910390f35b348015610b3357600080fd5b50610b4e6004803603810190610b499190614472565b61235b565b005b348015610b5c57600080fd5b50610b776004803603810190610b7291906145ab565b61241b565b005b348015610b8557600080fd5b50610ba06004803603810190610b9b91906147a9565b6124dd565b005b348015610bae57600080fd5b50610bb761253f565b005b348015610bc557600080fd5b50610be06004803603810190610bdb91906148f4565b6127ad565b005b348015610bee57600080fd5b50610c096004803603810190610c0491906140cb565b61289e565b604051610c169190614073565b60405180910390f35b348015610c2b57600080fd5b50610c346128fd565b604051610c419190614139565b60405180910390f35b348015610c5657600080fd5b50610c5f612923565b604051610c6c9190613fc8565b60405180910390f35b348015610c8157600080fd5b50610c8a61293a565b604051610c979190614139565b60405180910390f35b348015610cac57600080fd5b50610cb5612960565b604051610cc29190614073565b60405180910390f35b348015610cd757600080fd5b50610cf26004803603810190610ced9190614472565b6129f2565b005b348015610d0057600080fd5b50610d1b6004803603810190610d16919061493d565b612ab2565b604051610d289190613fc8565b60405180910390f35b348015610d3d57600080fd5b50610d586004803603810190610d539190614472565b612ba4565b005b348015610d6657600080fd5b50610d6f612c9b565b604051610d7c9190614139565b60405180910390f35b348015610d9157600080fd5b50610dac6004803603810190610da79190614472565b612cc1565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e7957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e895750610e8882612e47565b5b9050919050565b606060008054610e9f906149ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610ecb906149ac565b8015610f185780601f10610eed57610100808354040283529160200191610f18565b820191906000526020600020905b815481529060010190602001808311610efb57829003601f168201915b5050505050905090565b6000610f2d82612eb1565b610f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6390614a4f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610fb282611b4b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611022576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101990614ae1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611041612f1d565b73ffffffffffffffffffffffffffffffffffffffff161480611070575061106f8161106a612f1d565b612ab2565b5b6110af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a690614b73565b60405180910390fd5b6110b98383612f2c565b505050565b606060006040518060600160405280600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018781525090506111418782878787612fe5565b611180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117790614c05565b60405180910390fd5b6111d36001600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546130ed90919063ffffffff16565b600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b87338860405161124993929190614c46565b60405180910390a16000803073ffffffffffffffffffffffffffffffffffffffff16888a60405160200161127e929190614d08565b60405160208183030381529060405260405161129a9190614d30565b6000604051808303816000865af19150503d80600081146112d7576040519150601f19603f3d011682016040523d82523d6000602084013e6112dc565b606091505b509150915081611321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131890614d93565b60405180910390fd5b80935050505095945050505050565b6060600061133d83611cbc565b905060008167ffffffffffffffff81111561135b5761135a6141ca565b5b6040519080825280602002602001820160405280156113895781602001602082028036833780820191505090505b509050600080600190505b600161139e61233e565b6113a89190614de2565b811015611457578573ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611444578083838151811061142957611428614e16565b5b602002602001018181525050818061144090614e45565b9250505b808061144f90614e45565b915050611394565b50819350505050919050565b600c60009054906101000a900460ff1681565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b6114b7612f1d565b73ffffffffffffffffffffffffffffffffffffffff166114d56120ef565b73ffffffffffffffffffffffffffffffffffffffff16148061154b57506114fa612f1d565b73ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61155457600080fd5b80600c60006101000a81548160ff02191690831515021790555050565b6000600a54905090565b6000600754905090565b600c60029054906101000a900460ff1681565b6115a96115a3612f1d565b82613103565b6115e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115df90614eff565b60405180910390fd5b6115f38383836131e1565b505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000804690508091505090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61167c612f1d565b73ffffffffffffffffffffffffffffffffffffffff1661169a6120ef565b73ffffffffffffffffffffffffffffffffffffffff16148061171057506116bf612f1d565b73ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61171957600080fd5b80600c60026101000a81548160ff02191690831515021790555050565b60011515600c60009054906101000a900460ff1615151461178c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178390614f6b565b60405180910390fd5b80600010801561179c5750600b81105b6117db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d290614fd7565b60405180910390fd5b34600b54826117ea9190614ff7565b146117f457600080fd5b600c60029054906101000a900460ff16156118d4576001151561181d611818612f1d565b61190d565b151514801561182c5750600481105b801561188a5750600481600d6000611842612f1d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118879190614de2565b11155b156118cf5760005b818110156118cd576118aa6118a5612f1d565b613447565b6118ba6118b5612f1d565b61355b565b80806118c590614e45565b915050611892565b505b611904565b60005b81811015611902576118ef6118ea612f1d565b61355b565b80806118fa90614e45565b9150506118d7565b505b50565b600a5481565b600080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054119050919050565b611960612f1d565b73ffffffffffffffffffffffffffffffffffffffff1661197e6120ef565b73ffffffffffffffffffffffffffffffffffffffff1614806119f457506119a3612f1d565b73ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6119fd57600080fd5b6001600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b611a60838383604051806020016040528060008152506124dd565b505050565b611a6d612f1d565b73ffffffffffffffffffffffffffffffffffffffff16611a8b6120ef565b73ffffffffffffffffffffffffffffffffffffffff1614611ae1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad89061509d565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bea9061512f565b60405180910390fd5b80915050919050565b611c04612f1d565b73ffffffffffffffffffffffffffffffffffffffff16611c226120ef565b73ffffffffffffffffffffffffffffffffffffffff1614611c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6f9061509d565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d23906151c1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611d7b612f1d565b73ffffffffffffffffffffffffffffffffffffffff16611d996120ef565b73ffffffffffffffffffffffffffffffffffffffff1614611def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de69061509d565b60405180910390fd5b611df960006135dd565b565b611e03612f1d565b73ffffffffffffffffffffffffffffffffffffffff16611e216120ef565b73ffffffffffffffffffffffffffffffffffffffff1614611e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6e9061509d565b60405180910390fd5b6000611e8360136136a3565b9050600081118015611ea257506001600a54611e9f9190614de2565b81105b611ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed89061522d565b60405180910390fd5b611eeb6013612d81565b611ef582826136b1565b5050565b611f01612f1d565b73ffffffffffffffffffffffffffffffffffffffff16611f1f6120ef565b73ffffffffffffffffffffffffffffffffffffffff161480611f955750611f44612f1d565b73ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611f9e57600080fd5b6000811015611fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd990615299565b60405180910390fd5b80600b8190555050565b611ff4612f1d565b73ffffffffffffffffffffffffffffffffffffffff166120126120ef565b73ffffffffffffffffffffffffffffffffffffffff1614612068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205f9061509d565b60405180910390fd5b80601590816120779190615465565b5050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166120bc612f1d565b73ffffffffffffffffffffffffffffffffffffffff16146120dc57600080fd5b80601590816120eb9190615465565b5050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054612128906149ac565b80601f0160208091040260200160405190810160405280929190818152602001828054612154906149ac565b80156121a15780601f10612176576101008083540402835291602001916121a1565b820191906000526020600020905b81548152906001019060200180831161218457829003601f168201915b5050505050905090565b6121b3612f1d565b73ffffffffffffffffffffffffffffffffffffffff166121d16120ef565b73ffffffffffffffffffffffffffffffffffffffff16148061224757506121f6612f1d565b73ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61225057600080fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600b54905090565b60026020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d6020528060005260406000206000915090505481565b600b5481565b6123016122fa612f1d565b83836136cf565b5050565b600c60019054906101000a900460ff1681565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600161234c60136136a3565b6123569190615537565b905090565b612363612f1d565b73ffffffffffffffffffffffffffffffffffffffff166123816120ef565b73ffffffffffffffffffffffffffffffffffffffff16146123d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ce9061509d565b60405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612423612f1d565b73ffffffffffffffffffffffffffffffffffffffff166124416120ef565b73ffffffffffffffffffffffffffffffffffffffff1614806124b75750612466612f1d565b73ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6124c057600080fd5b80600c60016101000a81548160ff02191690831515021790555050565b6124ee6124e8612f1d565b83613103565b61252d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252490614eff565b60405180910390fd5b6125398484848461383b565b50505050565b612547612f1d565b73ffffffffffffffffffffffffffffffffffffffff166125656120ef565b73ffffffffffffffffffffffffffffffffffffffff16146125bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b29061509d565b60405180910390fd5b60006064476125ca919061559a565b90506000600a476125db919061559a565b90506000818360026125ed9190614ff7565b476125f89190615537565b6126029190615537565b9050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505015801561266c573d6000803e3d6000fd5b50600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156126d5573d6000803e3d6000fd5b50601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561273e573d6000803e3d6000fd5b50601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156127a7573d6000803e3d6000fd5b50505050565b6127b5612f1d565b73ffffffffffffffffffffffffffffffffffffffff166127d36120ef565b73ffffffffffffffffffffffffffffffffffffffff16148061284957506127f8612f1d565b73ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61285257600080fd5b60008151905060005b818110156128995761288683828151811061287957612878614e16565b5b6020026020010151611958565b808061289190614e45565b91505061285b565b505050565b6060600c60019054906101000a900460ff16156128ed576128bd612960565b6128c683613897565b6040516020016128d792919061569f565b60405160208183030381529060405290506128f8565b6128f5612960565b90505b919050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600c60029054906101000a900460ff16905090565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606015805461296f906149ac565b80601f016020809104026020016040519081016040528092919081815260200182805461299b906149ac565b80156129e85780601f106129bd576101008083540402835291602001916129e8565b820191906000526020600020905b8154815290600101906020018083116129cb57829003601f168201915b5050505050905090565b6129fa612f1d565b73ffffffffffffffffffffffffffffffffffffffff16612a186120ef565b73ffffffffffffffffffffffffffffffffffffffff1614612a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a659061509d565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401612b2a9190614139565b602060405180830381865afa158015612b47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6b9190615717565b73ffffffffffffffffffffffffffffffffffffffff1603612b90576001915050612b9e565b612b9a84846139f7565b9150505b92915050565b612bac612f1d565b73ffffffffffffffffffffffffffffffffffffffff16612bca6120ef565b73ffffffffffffffffffffffffffffffffffffffff1614612c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c179061509d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c86906157b6565b60405180910390fd5b612c98816135dd565b50565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612cc9612f1d565b73ffffffffffffffffffffffffffffffffffffffff16612ce76120ef565b73ffffffffffffffffffffffffffffffffffffffff1614612d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d349061509d565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6001816000016000828254019250508190555050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603612e4057600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050612e44565b3390505b90565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000612f27612d97565b905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612f9f83611b4b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603613055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304c90615848565b60405180910390fd5b600161306861306387613a8b565b613af3565b838686604051600081526020016040526040516130889493929190615877565b6020604051602081039080840390855afa1580156130aa573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600081836130fb9190614de2565b905092915050565b600061310e82612eb1565b61314d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131449061592e565b60405180910390fd5b600061315883611b4b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806131c757508373ffffffffffffffffffffffffffffffffffffffff166131af84610f22565b73ffffffffffffffffffffffffffffffffffffffff16145b806131d857506131d78185612ab2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661320182611b4b565b73ffffffffffffffffffffffffffffffffffffffff1614613257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324e906159c0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036132c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132bd90615a52565b60405180910390fd5b6132d1838383613b2c565b6132dc600082612f2c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461332c9190615537565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133839190614de2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613442838383613b31565b505050565b6004600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106134c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134c090615ae4565b60405180910390fd5b6001600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135159190614de2565b600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b600061356760136136a3565b905060008111801561358657506001600a546135839190614de2565b81105b6135c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135bc9061522d565b60405180910390fd5b6135cf6013612d81565b6135d982826136b1565b5050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6136cb828260405180602001604052806000815250613b36565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361373d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161373490615b50565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161382e9190613fc8565b60405180910390a3505050565b6138468484846131e1565b61385284848484613b91565b613891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161388890615be2565b60405180910390fd5b50505050565b6060600082036138de576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506139f2565b600082905060005b600082146139105780806138f990614e45565b915050600a82613909919061559a565b91506138e6565b60008167ffffffffffffffff81111561392c5761392b6141ca565b5b6040519080825280601f01601f19166020018201604052801561395e5781602001600182028036833780820191505090505b5090505b600085146139eb576001826139779190615537565b9150600a856139869190615c02565b60306139929190614de2565b60f81b8183815181106139a8576139a7614e16565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856139e4919061559a565b9450613962565b8093505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000604051806080016040528060438152602001615e83604391398051906020012082600001518360200151846040015180519060200120604051602001613ad69493929190615c33565b604051602081830303815290604052805190602001209050919050565b6000613afd61157b565b82604051602001613b0f929190615ce5565b604051602081830303815290604052805190602001209050919050565b505050565b505050565b613b408383613d18565b613b4d6000848484613b91565b613b8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b8390615be2565b60405180910390fd5b505050565b6000613bb28473ffffffffffffffffffffffffffffffffffffffff16613ef1565b15613d0b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613bdb612f1d565b8786866040518563ffffffff1660e01b8152600401613bfd9493929190615d1c565b6020604051808303816000875af1925050508015613c3957506040513d601f19601f82011682018060405250810190613c369190615d7d565b60015b613cbb573d8060008114613c69576040519150601f19603f3d011682016040523d82523d6000602084013e613c6e565b606091505b506000815103613cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613caa90615be2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613d10565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d7e90615df6565b60405180910390fd5b613d9081612eb1565b15613dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dc790615e62565b60405180910390fd5b613ddc60008383613b2c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613e2c9190614de2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613eed60008383613b31565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613f5d81613f28565b8114613f6857600080fd5b50565b600081359050613f7a81613f54565b92915050565b600060208284031215613f9657613f95613f1e565b5b6000613fa484828501613f6b565b91505092915050565b60008115159050919050565b613fc281613fad565b82525050565b6000602082019050613fdd6000830184613fb9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561401d578082015181840152602081019050614002565b60008484015250505050565b6000601f19601f8301169050919050565b600061404582613fe3565b61404f8185613fee565b935061405f818560208601613fff565b61406881614029565b840191505092915050565b6000602082019050818103600083015261408d818461403a565b905092915050565b6000819050919050565b6140a881614095565b81146140b357600080fd5b50565b6000813590506140c58161409f565b92915050565b6000602082840312156140e1576140e0613f1e565b5b60006140ef848285016140b6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614123826140f8565b9050919050565b61413381614118565b82525050565b600060208201905061414e600083018461412a565b92915050565b61415d81614118565b811461416857600080fd5b50565b60008135905061417a81614154565b92915050565b6000806040838503121561419757614196613f1e565b5b60006141a58582860161416b565b92505060206141b6858286016140b6565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61420282614029565b810181811067ffffffffffffffff82111715614221576142206141ca565b5b80604052505050565b6000614234613f14565b905061424082826141f9565b919050565b600067ffffffffffffffff8211156142605761425f6141ca565b5b61426982614029565b9050602081019050919050565b82818337600083830152505050565b600061429861429384614245565b61422a565b9050828152602081018484840111156142b4576142b36141c5565b5b6142bf848285614276565b509392505050565b600082601f8301126142dc576142db6141c0565b5b81356142ec848260208601614285565b91505092915050565b6000819050919050565b614308816142f5565b811461431357600080fd5b50565b600081359050614325816142ff565b92915050565b600060ff82169050919050565b6143418161432b565b811461434c57600080fd5b50565b60008135905061435e81614338565b92915050565b600080600080600060a086880312156143805761437f613f1e565b5b600061438e8882890161416b565b955050602086013567ffffffffffffffff8111156143af576143ae613f23565b5b6143bb888289016142c7565b94505060406143cc88828901614316565b93505060606143dd88828901614316565b92505060806143ee8882890161434f565b9150509295509295909350565b600081519050919050565b600082825260208201905092915050565b6000614422826143fb565b61442c8185614406565b935061443c818560208601613fff565b61444581614029565b840191505092915050565b6000602082019050818103600083015261446a8184614417565b905092915050565b60006020828403121561448857614487613f1e565b5b60006144968482850161416b565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6144d481614095565b82525050565b60006144e683836144cb565b60208301905092915050565b6000602082019050919050565b600061450a8261449f565b61451481856144aa565b935061451f836144bb565b8060005b8381101561455057815161453788826144da565b9750614542836144f2565b925050600181019050614523565b5085935050505092915050565b6000602082019050818103600083015261457781846144ff565b905092915050565b61458881613fad565b811461459357600080fd5b50565b6000813590506145a58161457f565b92915050565b6000602082840312156145c1576145c0613f1e565b5b60006145cf84828501614596565b91505092915050565b6145e181614095565b82525050565b60006020820190506145fc60008301846145d8565b92915050565b61460b816142f5565b82525050565b60006020820190506146266000830184614602565b92915050565b60008060006060848603121561464557614644613f1e565b5b60006146538682870161416b565b93505060206146648682870161416b565b9250506040614675868287016140b6565b9150509250925092565b600067ffffffffffffffff82111561469a576146996141ca565b5b6146a382614029565b9050602081019050919050565b60006146c36146be8461467f565b61422a565b9050828152602081018484840111156146df576146de6141c5565b5b6146ea848285614276565b509392505050565b600082601f830112614707576147066141c0565b5b81356147178482602086016146b0565b91505092915050565b60006020828403121561473657614735613f1e565b5b600082013567ffffffffffffffff81111561475457614753613f23565b5b614760848285016146f2565b91505092915050565b600080604083850312156147805761477f613f1e565b5b600061478e8582860161416b565b925050602061479f85828601614596565b9150509250929050565b600080600080608085870312156147c3576147c2613f1e565b5b60006147d18782880161416b565b94505060206147e28782880161416b565b93505060406147f3878288016140b6565b925050606085013567ffffffffffffffff81111561481457614813613f23565b5b614820878288016142c7565b91505092959194509250565b600067ffffffffffffffff821115614847576148466141ca565b5b602082029050602081019050919050565b600080fd5b600061487061486b8461482c565b61422a565b9050808382526020820190506020840283018581111561489357614892614858565b5b835b818110156148bc57806148a8888261416b565b845260208401935050602081019050614895565b5050509392505050565b600082601f8301126148db576148da6141c0565b5b81356148eb84826020860161485d565b91505092915050565b60006020828403121561490a57614909613f1e565b5b600082013567ffffffffffffffff81111561492857614927613f23565b5b614934848285016148c6565b91505092915050565b6000806040838503121561495457614953613f1e565b5b60006149628582860161416b565b92505060206149738582860161416b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806149c457607f821691505b6020821081036149d7576149d661497d565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614a39602c83613fee565b9150614a44826149dd565b604082019050919050565b60006020820190508181036000830152614a6881614a2c565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614acb602183613fee565b9150614ad682614a6f565b604082019050919050565b60006020820190508181036000830152614afa81614abe565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614b5d603883613fee565b9150614b6882614b01565b604082019050919050565b60006020820190508181036000830152614b8c81614b50565b9050919050565b7f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b6000614bef602183613fee565b9150614bfa82614b93565b604082019050919050565b60006020820190508181036000830152614c1e81614be2565b9050919050565b6000614c30826140f8565b9050919050565b614c4081614c25565b82525050565b6000606082019050614c5b600083018661412a565b614c686020830185614c37565b8181036040830152614c7a8184614417565b9050949350505050565b600081905092915050565b6000614c9a826143fb565b614ca48185614c84565b9350614cb4818560208601613fff565b80840191505092915050565b60008160601b9050919050565b6000614cd882614cc0565b9050919050565b6000614cea82614ccd565b9050919050565b614d02614cfd82614118565b614cdf565b82525050565b6000614d148285614c8f565b9150614d208284614cf1565b6014820191508190509392505050565b6000614d3c8284614c8f565b915081905092915050565b7f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000600082015250565b6000614d7d601c83613fee565b9150614d8882614d47565b602082019050919050565b60006020820190508181036000830152614dac81614d70565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614ded82614095565b9150614df883614095565b9250828201905080821115614e1057614e0f614db3565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614e5082614095565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e8257614e81614db3565b5b600182019050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614ee9603183613fee565b9150614ef482614e8d565b604082019050919050565b60006020820190508181036000830152614f1881614edc565b9050919050565b7f436c61696d206973206f66663b00000000000000000000000000000000000000600082015250565b6000614f55600d83613fee565b9150614f6082614f1f565b602082019050919050565b60006020820190508181036000830152614f8481614f48565b9050919050565b7f4f6e6c79203130206d696e747320696e206f6e6520636c61696d000000000000600082015250565b6000614fc1601a83613fee565b9150614fcc82614f8b565b602082019050919050565b60006020820190508181036000830152614ff081614fb4565b9050919050565b600061500282614095565b915061500d83614095565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561504657615045614db3565b5b828202905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615087602083613fee565b915061509282615051565b602082019050919050565b600060208201905081810360008301526150b68161507a565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000615119602983613fee565b9150615124826150bd565b604082019050919050565b600060208201905081810360008301526151488161510c565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006151ab602a83613fee565b91506151b68261514f565b604082019050919050565b600060208201905081810360008301526151da8161519e565b9050919050565b7f4578636565647320746f6b656e20737570706c79000000000000000000000000600082015250565b6000615217601483613fee565b9150615222826151e1565b602082019050919050565b600060208201905081810360008301526152468161520a565b9050919050565b7f5072696365206d757374206265203e202d300000000000000000000000000000600082015250565b6000615283601283613fee565b915061528e8261524d565b602082019050919050565b600060208201905081810360008301526152b281615276565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261531b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826152de565b61532586836152de565b95508019841693508086168417925050509392505050565b6000819050919050565b600061536261535d61535884614095565b61533d565b614095565b9050919050565b6000819050919050565b61537c83615347565b61539061538882615369565b8484546152eb565b825550505050565b600090565b6153a5615398565b6153b0818484615373565b505050565b5b818110156153d4576153c960008261539d565b6001810190506153b6565b5050565b601f821115615419576153ea816152b9565b6153f3846152ce565b81016020851015615402578190505b61541661540e856152ce565b8301826153b5565b50505b505050565b600082821c905092915050565b600061543c6000198460080261541e565b1980831691505092915050565b6000615455838361542b565b9150826002028217905092915050565b61546e82613fe3565b67ffffffffffffffff811115615487576154866141ca565b5b61549182546149ac565b61549c8282856153d8565b600060209050601f8311600181146154cf57600084156154bd578287015190505b6154c78582615449565b86555061552f565b601f1984166154dd866152b9565b60005b82811015615505578489015182556001820191506020850194506020810190506154e0565b86831015615522578489015161551e601f89168261542b565b8355505b6001600288020188555050505b505050505050565b600061554282614095565b915061554d83614095565b925082820390508181111561556557615564614db3565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006155a582614095565b91506155b083614095565b9250826155c0576155bf61556b565b5b828204905092915050565b600081905092915050565b60006155e182613fe3565b6155eb81856155cb565b93506155fb818560208601613fff565b80840191505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b600061563d6001836155cb565b915061564882615607565b600182019050919050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006156896005836155cb565b915061569482615653565b600582019050919050565b60006156ab82856155d6565b91506156b682615630565b91506156c282846155d6565b91506156cd8261567c565b91508190509392505050565b60006156e482614118565b9050919050565b6156f4816156d9565b81146156ff57600080fd5b50565b600081519050615711816156eb565b92915050565b60006020828403121561572d5761572c613f1e565b5b600061573b84828501615702565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006157a0602683613fee565b91506157ab82615744565b604082019050919050565b600060208201905081810360008301526157cf81615793565b9050919050565b7f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360008201527f49474e4552000000000000000000000000000000000000000000000000000000602082015250565b6000615832602583613fee565b915061583d826157d6565b604082019050919050565b6000602082019050818103600083015261586181615825565b9050919050565b6158718161432b565b82525050565b600060808201905061588c6000830187614602565b6158996020830186615868565b6158a66040830185614602565b6158b36060830184614602565b95945050505050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000615918602c83613fee565b9150615923826158bc565b604082019050919050565b600060208201905081810360008301526159478161590b565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006159aa602583613fee565b91506159b58261594e565b604082019050919050565b600060208201905081810360008301526159d98161599d565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615a3c602483613fee565b9150615a47826159e0565b604082019050919050565b60006020820190508181036000830152615a6b81615a2f565b9050919050565b7f416464726573732069732066756c6c3b204f6e6c792033206d696e747320706560008201527f7220574c20416464726573730000000000000000000000000000000000000000602082015250565b6000615ace602c83613fee565b9150615ad982615a72565b604082019050919050565b60006020820190508181036000830152615afd81615ac1565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615b3a601983613fee565b9150615b4582615b04565b602082019050919050565b60006020820190508181036000830152615b6981615b2d565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615bcc603283613fee565b9150615bd782615b70565b604082019050919050565b60006020820190508181036000830152615bfb81615bbf565b9050919050565b6000615c0d82614095565b9150615c1883614095565b925082615c2857615c2761556b565b5b828206905092915050565b6000608082019050615c486000830187614602565b615c5560208301866145d8565b615c62604083018561412a565b615c6f6060830184614602565b95945050505050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000615cae6002836155cb565b9150615cb982615c78565b600282019050919050565b6000819050919050565b615cdf615cda826142f5565b615cc4565b82525050565b6000615cf082615ca1565b9150615cfc8285615cce565b602082019150615d0c8284615cce565b6020820191508190509392505050565b6000608082019050615d31600083018761412a565b615d3e602083018661412a565b615d4b60408301856145d8565b8181036060830152615d5d8184614417565b905095945050505050565b600081519050615d7781613f54565b92915050565b600060208284031215615d9357615d92613f1e565b5b6000615da184828501615d68565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615de0602083613fee565b9150615deb82615daa565b602082019050919050565b60006020820190508181036000830152615e0f81615dd3565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615e4c601c83613fee565b9150615e5782615e16565b602082019050919050565b60006020820190508181036000830152615e7b81615e3f565b905091905056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a2646970667358221220fedf5a67b47bb27b8fe13b5b773c499c0d47762519a5eef6fd1975875c8a576064736f6c63430008100033

Deployed Bytecode Sourcemap

53929:1002:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30931:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31876:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33442:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32965:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27518:1151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53427:402;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44838:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24781:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49929:141;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52100:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25790:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44970:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34192:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29095:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25899:161;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45129:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49485:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48353:700;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44643:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51576:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52769:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34602:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50684:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45160:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31570:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50833:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31300:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12701:103;;;;;;;;;;;;;:::i;:::-;;47615:259;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49188:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54570:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54765:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12050:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32045:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46012:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51771:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30238:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45047:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44684:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33735:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44904:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45098:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52280:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50330:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49728:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34858:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51010:476;;;;;;;;;;;;;:::i;:::-;;53013:332;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46283:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45591:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51928:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45192:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54387:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50506:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46689:445;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12959:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45226:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50155:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30931:305;31033:4;31085:25;31070:40;;;:11;:40;;;;:105;;;;31142:33;31127:48;;;:11;:48;;;;31070:105;:158;;;;31192:36;31216:11;31192:23;:36::i;:::-;31070:158;31050:178;;30931:305;;;:::o;31876:100::-;31930:13;31963:5;31956:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31876:100;:::o;33442:221::-;33518:7;33546:16;33554:7;33546;:16::i;:::-;33538:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33631:15;:24;33647:7;33631:24;;;;;;;;;;;;;;;;;;;;;33624:31;;33442:221;;;:::o;32965:411::-;33046:13;33062:23;33077:7;33062:14;:23::i;:::-;33046:39;;33110:5;33104:11;;:2;:11;;;33096:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;33204:5;33188:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;33213:37;33230:5;33237:12;:10;:12::i;:::-;33213:16;:37::i;:::-;33188:62;33166:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;33347:21;33356:2;33360:7;33347:8;:21::i;:::-;33035:341;32965:411;;:::o;27518:1151::-;27719:12;27744:29;27776:152;;;;;;;;27814:6;:19;27821:11;27814:19;;;;;;;;;;;;;;;;27776:152;;;;27854:11;27776:152;;;;;;27899:17;27776:152;;;27744:184;;27963:45;27970:11;27983:6;27991:4;27997;28003;27963:6;:45::i;:::-;27941:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;28158:26;28182:1;28158:6;:19;28165:11;28158:19;;;;;;;;;;;;;;;;:23;;:26;;;;:::i;:::-;28136:6;:19;28143:11;28136:19;;;;;;;;;;;;;;;:48;;;;28202:126;28240:11;28274:10;28300:17;28202:126;;;;;;;;:::i;:::-;;;;;;;;28439:12;28453:23;28488:4;28480:18;;28530:17;28549:11;28513:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28480:92;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28438:134;;;;28591:7;28583:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;28651:10;28644:17;;;;;27518:1151;;;;;;;:::o;53427:402::-;53486:13;53511:14;53528:17;53538:6;53528:9;:17::i;:::-;53511:34;;53556:22;53592:6;53581:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53556:43;;53610:9;53639:6;53646:1;53639:8;;53634:165;53663:1;53651:11;:9;:11::i;:::-;:13;;;;:::i;:::-;53649:1;:15;53634:165;;;53711:6;53690:27;;:14;:17;53705:1;53690:17;;;;;;;;;;;;;;;;;;;;;:27;;;53687:101;;53748:1;53737:5;53743:1;53737:8;;;;;;;;:::i;:::-;;;;;;;:12;;;;;53768:3;;;;;:::i;:::-;;;;53687:101;53666:3;;;;;:::i;:::-;;;;53634:165;;;;53816:5;53809:12;;;;;53427:402;;;:::o;44838:29::-;;;;;;;;;;;;;:::o;24781:43::-;;;;;;;;;;;;;;;;;;;:::o;49929:141::-;49996:12;:10;:12::i;:::-;49985:23;;:7;:5;:7::i;:::-;:23;;;:48;;;;50021:12;:10;:12::i;:::-;50012:21;;:5;;;;;;;;;;;:21;;;49985:48;49977:57;;;;;;50057:5;50045:9;;:17;;;;;;;;;;;;;;;;;;49929:141;:::o;52100:90::-;52143:7;52170:12;;52163:19;;52100:90;:::o;25790:101::-;25841:7;25868:15;;25861:22;;25790:101;:::o;44970:32::-;;;;;;;;;;;;;:::o;34192:339::-;34387:41;34406:12;:10;:12::i;:::-;34420:7;34387:18;:41::i;:::-;34379:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34495:28;34505:4;34511:2;34515:7;34495:9;:28::i;:::-;34192:339;;;:::o;29095:107::-;29148:13;29182:6;:12;29189:4;29182:12;;;;;;;;;;;;;;;;29174:20;;29095:107;;;:::o;25899:161::-;25942:7;25962:10;26013:9;26007:15;;26050:2;26043:9;;;25899:161;:::o;45129:24::-;;;;;;;;;;;;;:::o;49485:149::-;49556:12;:10;:12::i;:::-;49545:23;;:7;:5;:7::i;:::-;:23;;;:48;;;;49581:12;:10;:12::i;:::-;49572:21;;:5;;;;;;;;;;;:21;;;49545:48;49537:57;;;;;;49621:5;49605:13;;:21;;;;;;;;;;;;;;;;;;49485:149;:::o;48353:700::-;48428:4;48415:17;;:9;;;;;;;;;;;:17;;;48407:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;48473:6;48469:1;:10;:25;;;;;48492:2;48483:6;:11;48469:25;48461:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;48563:9;48554:5;;48545:6;:14;;;;:::i;:::-;:27;48537:36;;;;;;48589:13;;;;;;;;;;;48586:460;;;48656:4;48625:35;;:27;48639:12;:10;:12::i;:::-;48625:13;:27::i;:::-;:35;;;:49;;;;;48673:1;48664:6;:10;48625:49;:90;;;;;48714:1;48704:6;48678:9;:23;48688:12;:10;:12::i;:::-;48678:23;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;:37;;48625:90;48622:282;;;48741:6;48736:153;48753:6;48751:1;:8;48736:153;;;48793:28;48808:12;:10;:12::i;:::-;48793:14;:28::i;:::-;48848:21;48856:12;:10;:12::i;:::-;48848:7;:21::i;:::-;48761:3;;;;;:::i;:::-;;;;48736:153;;;;48622:282;48586:460;;;48939:6;48934:101;48951:6;48949:1;:8;48934:101;;;48983:21;48991:12;:10;:12::i;:::-;48983:7;:21::i;:::-;48959:3;;;;;:::i;:::-;;;;48934:101;;;;48586:460;48353:700;:::o;44643:34::-;;;;:::o;51576:112::-;51635:4;51679:1;51659:9;:17;51669:6;51659:17;;;;;;;;;;;;;;;;:21;51652:28;;51576:112;;;:::o;52769:161::-;52852:12;:10;:12::i;:::-;52841:23;;:7;:5;:7::i;:::-;:23;;;:48;;;;52877:12;:10;:12::i;:::-;52868:21;;:5;;;;;;;;;;;:21;;;52841:48;52833:57;;;;;;52921:1;52901:9;:17;52911:6;52901:17;;;;;;;;;;;;;;;:21;;;;52769:161;:::o;34602:185::-;34740:39;34757:4;34763:2;34767:7;34740:39;;;;;;;;;;;;:16;:39::i;:::-;34602:185;;;:::o;50684:92::-;12281:12;:10;:12::i;:::-;12270:23;;:7;:5;:7::i;:::-;:23;;;12262:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50762:6:::1;50749:10;;:19;;;;;;;;;;;;;;;;;;50684:92:::0;:::o;45160:25::-;;;;;;;;;;;;;:::o;31570:239::-;31642:7;31662:13;31678:7;:16;31686:7;31678:16;;;;;;;;;;;;;;;;;;;;;31662:32;;31730:1;31713:19;;:5;:19;;;31705:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31796:5;31789:12;;;31570:239;;;:::o;50833:84::-;12281:12;:10;:12::i;:::-;12270:23;;:7;:5;:7::i;:::-;:23;;;12262:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50903:6:::1;50895:5;;:14;;;;;;;;;;;;;;;;;;50833:84:::0;:::o;31300:208::-;31372:7;31417:1;31400:19;;:5;:19;;;31392:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;31484:9;:16;31494:5;31484:16;;;;;;;;;;;;;;;;31477:23;;31300:208;;;:::o;12701:103::-;12281:12;:10;:12::i;:::-;12270:23;;:7;:5;:7::i;:::-;:23;;;12262:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12766:30:::1;12793:1;12766:18;:30::i;:::-;12701:103::o:0;47615:259::-;12281:12;:10;:12::i;:::-;12270:23;;:7;:5;:7::i;:::-;:23;;;12262:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47672:15:::1;47690:22;:12;:20;:22::i;:::-;47672:40;;47741:1;47731:7;:11;:41;;;;;47771:1;47756:12;;:16;;;;:::i;:::-;47746:7;:26;47731:41;47723:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;47808:24;:12;:22;:24::i;:::-;47843:23;47853:3;47858:7;47843:9;:23::i;:::-;47661:213;47615:259:::0;:::o;49188:200::-;49264:12;:10;:12::i;:::-;49253:23;;:7;:5;:7::i;:::-;:23;;;:48;;;;49289:12;:10;:12::i;:::-;49280:21;;:5;;;;;;;;;;;:21;;;49253:48;49245:57;;;;;;49331:1;49321:6;:11;;49313:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;49374:6;49366:5;:14;;;;49188:200;:::o;54570:106::-;12281:12;:10;:12::i;:::-;12270:23;;:7;:5;:7::i;:::-;:23;;;12262:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54660:8:::1;54648:9;:20;;;;;;:::i;:::-;;54570:106:::0;:::o;54765:163::-;54864:20;;;;;;;;;;;54848:36;;:12;:10;:12::i;:::-;:36;;;54840:45;;;;;;54912:8;54900:9;:20;;;;;;:::i;:::-;;54765:163;:::o;12050:87::-;12096:7;12123:6;;;;;;;;;;;12116:13;;12050:87;:::o;32045:104::-;32101:13;32134:7;32127:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32045:104;:::o;46012:187::-;46098:12;:10;:12::i;:::-;46087:23;;:7;:5;:7::i;:::-;:23;;;:48;;;;46123:12;:10;:12::i;:::-;46114:21;;:5;;;;;;;;;;;:21;;;46087:48;46079:57;;;;;;46170:21;46147:20;;:44;;;;;;;;;;;;;;;;;;46012:187;:::o;51771:80::-;51811:7;51838:5;;51831:12;;51771:80;:::o;30238:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;45047:41::-;;;;;;;;;;;;;;;;;:::o;44684:31::-;;;;:::o;33735:155::-;33830:52;33849:12;:10;:12::i;:::-;33863:8;33873;33830:18;:52::i;:::-;33735:155;;:::o;44904:26::-;;;;;;;;;;;;;:::o;45098:24::-;;;;;;;;;;;;;:::o;52280:102::-;52321:7;52373:1;52348:22;:12;:20;:22::i;:::-;:26;;;;:::i;:::-;52341:33;;52280:102;:::o;50330:90::-;12281:12;:10;:12::i;:::-;12270:23;;:7;:5;:7::i;:::-;:23;;;12262:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50406:6:::1;50394:9;;:18;;;;;;;;;;;;;;;;;;50330:90:::0;:::o;49728:139::-;49796:12;:10;:12::i;:::-;49785:23;;:7;:5;:7::i;:::-;:23;;;:48;;;;49821:12;:10;:12::i;:::-;49812:21;;:5;;;;;;;;;;;:21;;;49785:48;49777:57;;;;;;49854:5;49845:6;;:14;;;;;;;;;;;;;;;;;;49728:139;:::o;34858:328::-;35033:41;35052:12;:10;:12::i;:::-;35066:7;35033:18;:41::i;:::-;35025:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;35139:39;35153:4;35159:2;35163:7;35172:5;35139:13;:39::i;:::-;34858:328;;;;:::o;51010:476::-;12281:12;:10;:12::i;:::-;12270:23;;:7;:5;:7::i;:::-;:23;;;12262:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51076:17:::1;51120:3;51096:21;:27;;;;:::i;:::-;51076:47;;51135:18;51180:2;51156:21;:26;;;;:::i;:::-;51135:47;;51194:18;51253:10;51241:9;51239:1;:11;;;;:::i;:::-;51215:21;:35;;;;:::i;:::-;:48;;;;:::i;:::-;51194:69;;51282:9;;;;;;;;;;;51274:27;;:38;51302:9;51274:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;51333:9;;;;;;;;;;;51325:27;;:38;51353:9;51325:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;51384:10;;;;;;;;;;;51376:28;;:40;51405:10;51376:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;51438:10;;;;;;;;;;;51430:28;;:40;51459:10;51430:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;51065:421;;;51010:476::o:0;53013:332::-;53107:12;:10;:12::i;:::-;53096:23;;:7;:5;:7::i;:::-;:23;;;:48;;;;53132:12;:10;:12::i;:::-;53123:21;;:5;;;;;;;;;;;:21;;;53096:48;53088:57;;;;;;53200:16;53219:7;:14;53200:33;;53249:6;53244:94;53261:11;53259:1;:13;53244:94;;;53294:32;53315:7;53323:1;53315:10;;;;;;;;:::i;:::-;;;;;;;;53294:20;:32::i;:::-;53274:3;;;;;:::i;:::-;;;;53244:94;;;;53077:268;53013:332;:::o;46283:274::-;46349:13;46378:6;;;;;;;;;;;46375:175;;;46431:14;:12;:14::i;:::-;46450:26;46467:8;46450:16;:26::i;:::-;46414:71;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46400:86;;;;46375:175;46524:14;:12;:14::i;:::-;46517:21;;46283:274;;;;:::o;45591:35::-;;;;;;;;;;;;;:::o;51928:89::-;51972:4;51996:13;;;;;;;;;;;51989:20;;51928:89;:::o;45192:25::-;;;;;;;;;;;;;:::o;54387:104::-;54441:13;54474:9;54467:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54387:104;:::o;50506:92::-;12281:12;:10;:12::i;:::-;12270:23;;:7;:5;:7::i;:::-;:23;;;12262:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50584:6:::1;50571:10;;:19;;;;;;;;;;;;;;;;;;50506:92:::0;:::o;46689:445::-;46814:4;46899:27;46943:20;;;;;;;;;;;46899:65;;47020:8;46979:49;;46987:13;:21;;;47009:5;46987:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46979:49;;;46975:93;;47052:4;47045:11;;;;;46975:93;47087:39;47110:5;47117:8;47087:22;:39::i;:::-;47080:46;;;46689:445;;;;;:::o;12959:201::-;12281:12;:10;:12::i;:::-;12270:23;;:7;:5;:7::i;:::-;:23;;;12262:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13068:1:::1;13048:22;;:8;:22;;::::0;13040:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;13124:28;13143:8;13124:18;:28::i;:::-;12959:201:::0;:::o;45226:20::-;;;;;;;;;;;;;:::o;50155:90::-;12281:12;:10;:12::i;:::-;12270:23;;:7;:5;:7::i;:::-;:23;;;12262:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50231:6:::1;50219:9;;:18;;;;;;;;;;;;;;;;;;50155:90:::0;:::o;14375:127::-;14482:1;14464:7;:14;;;:19;;;;;;;;;;;14375:127;:::o;16879:650::-;16950:22;17016:4;16994:27;;:10;:27;;;16990:508;;17038:18;17059:8;;17038:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17082:13;17098:8;;:15;;17082:31;;17350:42;17320:5;17313;17309:17;17303:24;17277:134;17267:144;;17137:289;;16990:508;;;17475:10;17458:28;;16990:508;16879:650;:::o;11227:157::-;11312:4;11351:25;11336:40;;;:11;:40;;;;11329:47;;11227:157;;;:::o;36696:127::-;36761:4;36813:1;36785:30;;:7;:16;36793:7;36785:16;;;;;;;;;;;;;;;;;;;;;:30;;;;36778:37;;36696:127;;;:::o;47278:189::-;47384:14;47431:24;:22;:24::i;:::-;47424:31;;47278:189;:::o;40842:174::-;40944:2;40917:15;:24;40933:7;40917:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41000:7;40996:2;40962:46;;40971:23;40986:7;40971:14;:23::i;:::-;40962:46;;;;;;;;;;;;40842:174;;:::o;29210:486::-;29388:4;29431:1;29413:20;;:6;:20;;;29405:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;29529:159;29557:47;29576:27;29596:6;29576:19;:27::i;:::-;29557:18;:47::i;:::-;29623:4;29646;29669;29529:159;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29506:182;;:6;:182;;;29486:202;;29210:486;;;;;;;:::o;20249:98::-;20307:7;20338:1;20334;:5;;;;:::i;:::-;20327:12;;20249:98;;;;:::o;36990:348::-;37083:4;37108:16;37116:7;37108;:16::i;:::-;37100:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37184:13;37200:23;37215:7;37200:14;:23::i;:::-;37184:39;;37253:5;37242:16;;:7;:16;;;:51;;;;37286:7;37262:31;;:20;37274:7;37262:11;:20::i;:::-;:31;;;37242:51;:87;;;;37297:32;37314:5;37321:7;37297:16;:32::i;:::-;37242:87;37234:96;;;36990:348;;;;:::o;40099:625::-;40258:4;40231:31;;:23;40246:7;40231:14;:23::i;:::-;:31;;;40223:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;40337:1;40323:16;;:2;:16;;;40315:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;40393:39;40414:4;40420:2;40424:7;40393:20;:39::i;:::-;40497:29;40514:1;40518:7;40497:8;:29::i;:::-;40558:1;40539:9;:15;40549:4;40539:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;40587:1;40570:9;:13;40580:2;40570:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;40618:2;40599:7;:16;40607:7;40599:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;40657:7;40653:2;40638:27;;40647:4;40638:27;;;;;;;;;;;;40678:38;40698:4;40704:2;40708:7;40678:19;:38::i;:::-;40099:625;;;:::o;52490:197::-;52577:1;52557:9;:17;52567:6;52557:17;;;;;;;;;;;;;;;;:21;52549:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;52678:1;52658:9;:17;52668:6;52658:17;;;;;;;;;;;;;;;;:21;;;;:::i;:::-;52638:9;:17;52648:6;52638:17;;;;;;;;;;;;;;;:41;;;;52490:197;:::o;48018:251::-;48067:15;48085:22;:12;:20;:22::i;:::-;48067:40;;48136:1;48126:7;:11;:41;;;;;48166:1;48151:12;;:16;;;;:::i;:::-;48141:7;:26;48126:41;48118:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;48203:24;:12;:22;:24::i;:::-;48238:23;48248:3;48253:7;48238:9;:23::i;:::-;48056:213;48018:251;:::o;13320:191::-;13394:16;13413:6;;;;;;;;;;;13394:25;;13439:8;13430:6;;:17;;;;;;;;;;;;;;;;;;13494:8;13463:40;;13484:8;13463:40;;;;;;;;;;;;13383:128;13320:191;:::o;14253:114::-;14318:7;14345;:14;;;14338:21;;14253:114;;;:::o;37680:110::-;37756:26;37766:2;37770:7;37756:26;;;;;;;;;;;;:9;:26::i;:::-;37680:110;;:::o;41158:315::-;41313:8;41304:17;;:5;:17;;;41296:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;41400:8;41362:18;:25;41381:5;41362:25;;;;;;;;;;;;;;;:35;41388:8;41362:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;41446:8;41424:41;;41439:5;41424:41;;;41456:8;41424:41;;;;;;:::i;:::-;;;;;;;;41158:315;;;:::o;36068:::-;36225:28;36235:4;36241:2;36245:7;36225:9;:28::i;:::-;36272:48;36295:4;36301:2;36305:7;36314:5;36272:22;:48::i;:::-;36264:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;36068:315;;;;:::o;15076:723::-;15132:13;15362:1;15353:5;:10;15349:53;;15380:10;;;;;;;;;;;;;;;;;;;;;15349:53;15412:12;15427:5;15412:20;;15443:14;15468:78;15483:1;15475:4;:9;15468:78;;15501:8;;;;;:::i;:::-;;;;15532:2;15524:10;;;;;:::i;:::-;;;15468:78;;;15556:19;15588:6;15578:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15556:39;;15606:154;15622:1;15613:5;:10;15606:154;;15650:1;15640:11;;;;;:::i;:::-;;;15717:2;15709:5;:10;;;;:::i;:::-;15696:2;:24;;;;:::i;:::-;15683:39;;15666:6;15673;15666:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;15746:2;15737:11;;;;;:::i;:::-;;;15606:154;;;15784:6;15770:21;;;;;15076:723;;;;:::o;33961:164::-;34058:4;34082:18;:25;34101:5;34082:25;;;;;;;;;;;;;;;:35;34108:8;34082:35;;;;;;;;;;;;;;;;;;;;;;;;;34075:42;;33961:164;;;;:::o;28677:410::-;28787:7;26854:100;;;;;;;;;;;;;;;;;26834:127;;;;;;28941:6;:12;;;28976:6;:11;;;29020:6;:24;;;29010:35;;;;;;28860:204;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28832:247;;;;;;28812:267;;28677:410;;;:::o;26429:258::-;26528:7;26630:20;:18;:20::i;:::-;26652:11;26601:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26573:106;;;;;;26553:126;;26429:258;;;:::o;43409:126::-;;;;:::o;43920:125::-;;;;:::o;38017:321::-;38147:18;38153:2;38157:7;38147:5;:18::i;:::-;38198:54;38229:1;38233:2;38237:7;38246:5;38198:22;:54::i;:::-;38176:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;38017:321;;;:::o;42038:799::-;42193:4;42214:15;:2;:13;;;:15::i;:::-;42210:620;;;42266:2;42250:36;;;42287:12;:10;:12::i;:::-;42301:4;42307:7;42316:5;42250:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42246:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42509:1;42492:6;:13;:18;42488:272;;42535:60;;;;;;;;;;:::i;:::-;;;;;;;;42488:272;42710:6;42704:13;42695:6;42691:2;42687:15;42680:38;42246:529;42383:41;;;42373:51;;;:6;:51;;;;42366:58;;;;;42210:620;42814:4;42807:11;;42038:799;;;;;;;:::o;38674:439::-;38768:1;38754:16;;:2;:16;;;38746:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;38827:16;38835:7;38827;:16::i;:::-;38826:17;38818:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;38889:45;38918:1;38922:2;38926:7;38889:20;:45::i;:::-;38964:1;38947:9;:13;38957:2;38947:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38995:2;38976:7;:16;38984:7;38976:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39040:7;39036:2;39015:33;;39032:1;39015:33;;;;;;;;;;;;39061:44;39089:1;39093:2;39097:7;39061:19;:44::i;:::-;38674:439;;:::o;7310:326::-;7370:4;7627:1;7605:7;:19;;;:23;7598:30;;7310:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:117::-;4999:1;4996;4989:12;5013:117;5122:1;5119;5112:12;5136:180;5184:77;5181:1;5174:88;5281:4;5278:1;5271:15;5305:4;5302:1;5295:15;5322:281;5405:27;5427:4;5405:27;:::i;:::-;5397:6;5393:40;5535:6;5523:10;5520:22;5499:18;5487:10;5484:34;5481:62;5478:88;;;5546:18;;:::i;:::-;5478:88;5586:10;5582:2;5575:22;5365:238;5322:281;;:::o;5609:129::-;5643:6;5670:20;;:::i;:::-;5660:30;;5699:33;5727:4;5719:6;5699:33;:::i;:::-;5609:129;;;:::o;5744:307::-;5805:4;5895:18;5887:6;5884:30;5881:56;;;5917:18;;:::i;:::-;5881:56;5955:29;5977:6;5955:29;:::i;:::-;5947:37;;6039:4;6033;6029:15;6021:23;;5744:307;;;:::o;6057:146::-;6154:6;6149:3;6144;6131:30;6195:1;6186:6;6181:3;6177:16;6170:27;6057:146;;;:::o;6209:423::-;6286:5;6311:65;6327:48;6368:6;6327:48;:::i;:::-;6311:65;:::i;:::-;6302:74;;6399:6;6392:5;6385:21;6437:4;6430:5;6426:16;6475:3;6466:6;6461:3;6457:16;6454:25;6451:112;;;6482:79;;:::i;:::-;6451:112;6572:54;6619:6;6614:3;6609;6572:54;:::i;:::-;6292:340;6209:423;;;;;:::o;6651:338::-;6706:5;6755:3;6748:4;6740:6;6736:17;6732:27;6722:122;;6763:79;;:::i;:::-;6722:122;6880:6;6867:20;6905:78;6979:3;6971:6;6964:4;6956:6;6952:17;6905:78;:::i;:::-;6896:87;;6712:277;6651:338;;;;:::o;6995:77::-;7032:7;7061:5;7050:16;;6995:77;;;:::o;7078:122::-;7151:24;7169:5;7151:24;:::i;:::-;7144:5;7141:35;7131:63;;7190:1;7187;7180:12;7131:63;7078:122;:::o;7206:139::-;7252:5;7290:6;7277:20;7268:29;;7306:33;7333:5;7306:33;:::i;:::-;7206:139;;;;:::o;7351:86::-;7386:7;7426:4;7419:5;7415:16;7404:27;;7351:86;;;:::o;7443:118::-;7514:22;7530:5;7514:22;:::i;:::-;7507:5;7504:33;7494:61;;7551:1;7548;7541:12;7494:61;7443:118;:::o;7567:135::-;7611:5;7649:6;7636:20;7627:29;;7665:31;7690:5;7665:31;:::i;:::-;7567:135;;;;:::o;7708:1085::-;7810:6;7818;7826;7834;7842;7891:3;7879:9;7870:7;7866:23;7862:33;7859:120;;;7898:79;;:::i;:::-;7859:120;8018:1;8043:53;8088:7;8079:6;8068:9;8064:22;8043:53;:::i;:::-;8033:63;;7989:117;8173:2;8162:9;8158:18;8145:32;8204:18;8196:6;8193:30;8190:117;;;8226:79;;:::i;:::-;8190:117;8331:62;8385:7;8376:6;8365:9;8361:22;8331:62;:::i;:::-;8321:72;;8116:287;8442:2;8468:53;8513:7;8504:6;8493:9;8489:22;8468:53;:::i;:::-;8458:63;;8413:118;8570:2;8596:53;8641:7;8632:6;8621:9;8617:22;8596:53;:::i;:::-;8586:63;;8541:118;8698:3;8725:51;8768:7;8759:6;8748:9;8744:22;8725:51;:::i;:::-;8715:61;;8669:117;7708:1085;;;;;;;;:::o;8799:98::-;8850:6;8884:5;8878:12;8868:22;;8799:98;;;:::o;8903:168::-;8986:11;9020:6;9015:3;9008:19;9060:4;9055:3;9051:14;9036:29;;8903:168;;;;:::o;9077:373::-;9163:3;9191:38;9223:5;9191:38;:::i;:::-;9245:70;9308:6;9303:3;9245:70;:::i;:::-;9238:77;;9324:65;9382:6;9377:3;9370:4;9363:5;9359:16;9324:65;:::i;:::-;9414:29;9436:6;9414:29;:::i;:::-;9409:3;9405:39;9398:46;;9167:283;9077:373;;;;:::o;9456:309::-;9567:4;9605:2;9594:9;9590:18;9582:26;;9654:9;9648:4;9644:20;9640:1;9629:9;9625:17;9618:47;9682:76;9753:4;9744:6;9682:76;:::i;:::-;9674:84;;9456:309;;;;:::o;9771:329::-;9830:6;9879:2;9867:9;9858:7;9854:23;9850:32;9847:119;;;9885:79;;:::i;:::-;9847:119;10005:1;10030:53;10075:7;10066:6;10055:9;10051:22;10030:53;:::i;:::-;10020:63;;9976:117;9771:329;;;;:::o;10106:114::-;10173:6;10207:5;10201:12;10191:22;;10106:114;;;:::o;10226:184::-;10325:11;10359:6;10354:3;10347:19;10399:4;10394:3;10390:14;10375:29;;10226:184;;;;:::o;10416:132::-;10483:4;10506:3;10498:11;;10536:4;10531:3;10527:14;10519:22;;10416:132;;;:::o;10554:108::-;10631:24;10649:5;10631:24;:::i;:::-;10626:3;10619:37;10554:108;;:::o;10668:179::-;10737:10;10758:46;10800:3;10792:6;10758:46;:::i;:::-;10836:4;10831:3;10827:14;10813:28;;10668:179;;;;:::o;10853:113::-;10923:4;10955;10950:3;10946:14;10938:22;;10853:113;;;:::o;11002:732::-;11121:3;11150:54;11198:5;11150:54;:::i;:::-;11220:86;11299:6;11294:3;11220:86;:::i;:::-;11213:93;;11330:56;11380:5;11330:56;:::i;:::-;11409:7;11440:1;11425:284;11450:6;11447:1;11444:13;11425:284;;;11526:6;11520:13;11553:63;11612:3;11597:13;11553:63;:::i;:::-;11546:70;;11639:60;11692:6;11639:60;:::i;:::-;11629:70;;11485:224;11472:1;11469;11465:9;11460:14;;11425:284;;;11429:14;11725:3;11718:10;;11126:608;;;11002:732;;;;:::o;11740:373::-;11883:4;11921:2;11910:9;11906:18;11898:26;;11970:9;11964:4;11960:20;11956:1;11945:9;11941:17;11934:47;11998:108;12101:4;12092:6;11998:108;:::i;:::-;11990:116;;11740:373;;;;:::o;12119:116::-;12189:21;12204:5;12189:21;:::i;:::-;12182:5;12179:32;12169:60;;12225:1;12222;12215:12;12169:60;12119:116;:::o;12241:133::-;12284:5;12322:6;12309:20;12300:29;;12338:30;12362:5;12338:30;:::i;:::-;12241:133;;;;:::o;12380:323::-;12436:6;12485:2;12473:9;12464:7;12460:23;12456:32;12453:119;;;12491:79;;:::i;:::-;12453:119;12611:1;12636:50;12678:7;12669:6;12658:9;12654:22;12636:50;:::i;:::-;12626:60;;12582:114;12380:323;;;;:::o;12709:118::-;12796:24;12814:5;12796:24;:::i;:::-;12791:3;12784:37;12709:118;;:::o;12833:222::-;12926:4;12964:2;12953:9;12949:18;12941:26;;12977:71;13045:1;13034:9;13030:17;13021:6;12977:71;:::i;:::-;12833:222;;;;:::o;13061:118::-;13148:24;13166:5;13148:24;:::i;:::-;13143:3;13136:37;13061:118;;:::o;13185:222::-;13278:4;13316:2;13305:9;13301:18;13293:26;;13329:71;13397:1;13386:9;13382:17;13373:6;13329:71;:::i;:::-;13185:222;;;;:::o;13413:619::-;13490:6;13498;13506;13555:2;13543:9;13534:7;13530:23;13526:32;13523:119;;;13561:79;;:::i;:::-;13523:119;13681:1;13706:53;13751:7;13742:6;13731:9;13727:22;13706:53;:::i;:::-;13696:63;;13652:117;13808:2;13834:53;13879:7;13870:6;13859:9;13855:22;13834:53;:::i;:::-;13824:63;;13779:118;13936:2;13962:53;14007:7;13998:6;13987:9;13983:22;13962:53;:::i;:::-;13952:63;;13907:118;13413:619;;;;;:::o;14038:308::-;14100:4;14190:18;14182:6;14179:30;14176:56;;;14212:18;;:::i;:::-;14176:56;14250:29;14272:6;14250:29;:::i;:::-;14242:37;;14334:4;14328;14324:15;14316:23;;14038:308;;;:::o;14352:425::-;14430:5;14455:66;14471:49;14513:6;14471:49;:::i;:::-;14455:66;:::i;:::-;14446:75;;14544:6;14537:5;14530:21;14582:4;14575:5;14571:16;14620:3;14611:6;14606:3;14602:16;14599:25;14596:112;;;14627:79;;:::i;:::-;14596:112;14717:54;14764:6;14759:3;14754;14717:54;:::i;:::-;14436:341;14352:425;;;;;:::o;14797:340::-;14853:5;14902:3;14895:4;14887:6;14883:17;14879:27;14869:122;;14910:79;;:::i;:::-;14869:122;15027:6;15014:20;15052:79;15127:3;15119:6;15112:4;15104:6;15100:17;15052:79;:::i;:::-;15043:88;;14859:278;14797:340;;;;:::o;15143:509::-;15212:6;15261:2;15249:9;15240:7;15236:23;15232:32;15229:119;;;15267:79;;:::i;:::-;15229:119;15415:1;15404:9;15400:17;15387:31;15445:18;15437:6;15434:30;15431:117;;;15467:79;;:::i;:::-;15431:117;15572:63;15627:7;15618:6;15607:9;15603:22;15572:63;:::i;:::-;15562:73;;15358:287;15143:509;;;;:::o;15658:468::-;15723:6;15731;15780:2;15768:9;15759:7;15755:23;15751:32;15748:119;;;15786:79;;:::i;:::-;15748:119;15906:1;15931:53;15976:7;15967:6;15956:9;15952:22;15931:53;:::i;:::-;15921:63;;15877:117;16033:2;16059:50;16101:7;16092:6;16081:9;16077:22;16059:50;:::i;:::-;16049:60;;16004:115;15658:468;;;;;:::o;16132:943::-;16227:6;16235;16243;16251;16300:3;16288:9;16279:7;16275:23;16271:33;16268:120;;;16307:79;;:::i;:::-;16268:120;16427:1;16452:53;16497:7;16488:6;16477:9;16473:22;16452:53;:::i;:::-;16442:63;;16398:117;16554:2;16580:53;16625:7;16616:6;16605:9;16601:22;16580:53;:::i;:::-;16570:63;;16525:118;16682:2;16708:53;16753:7;16744:6;16733:9;16729:22;16708:53;:::i;:::-;16698:63;;16653:118;16838:2;16827:9;16823:18;16810:32;16869:18;16861:6;16858:30;16855:117;;;16891:79;;:::i;:::-;16855:117;16996:62;17050:7;17041:6;17030:9;17026:22;16996:62;:::i;:::-;16986:72;;16781:287;16132:943;;;;;;;:::o;17081:311::-;17158:4;17248:18;17240:6;17237:30;17234:56;;;17270:18;;:::i;:::-;17234:56;17320:4;17312:6;17308:17;17300:25;;17380:4;17374;17370:15;17362:23;;17081:311;;;:::o;17398:117::-;17507:1;17504;17497:12;17538:710;17634:5;17659:81;17675:64;17732:6;17675:64;:::i;:::-;17659:81;:::i;:::-;17650:90;;17760:5;17789:6;17782:5;17775:21;17823:4;17816:5;17812:16;17805:23;;17876:4;17868:6;17864:17;17856:6;17852:30;17905:3;17897:6;17894:15;17891:122;;;17924:79;;:::i;:::-;17891:122;18039:6;18022:220;18056:6;18051:3;18048:15;18022:220;;;18131:3;18160:37;18193:3;18181:10;18160:37;:::i;:::-;18155:3;18148:50;18227:4;18222:3;18218:14;18211:21;;18098:144;18082:4;18077:3;18073:14;18066:21;;18022:220;;;18026:21;17640:608;;17538:710;;;;;:::o;18271:370::-;18342:5;18391:3;18384:4;18376:6;18372:17;18368:27;18358:122;;18399:79;;:::i;:::-;18358:122;18516:6;18503:20;18541:94;18631:3;18623:6;18616:4;18608:6;18604:17;18541:94;:::i;:::-;18532:103;;18348:293;18271:370;;;;:::o;18647:539::-;18731:6;18780:2;18768:9;18759:7;18755:23;18751:32;18748:119;;;18786:79;;:::i;:::-;18748:119;18934:1;18923:9;18919:17;18906:31;18964:18;18956:6;18953:30;18950:117;;;18986:79;;:::i;:::-;18950:117;19091:78;19161:7;19152:6;19141:9;19137:22;19091:78;:::i;:::-;19081:88;;18877:302;18647:539;;;;:::o;19192:474::-;19260:6;19268;19317:2;19305:9;19296:7;19292:23;19288:32;19285:119;;;19323:79;;:::i;:::-;19285:119;19443:1;19468:53;19513:7;19504:6;19493:9;19489:22;19468:53;:::i;:::-;19458:63;;19414:117;19570:2;19596:53;19641:7;19632:6;19621:9;19617:22;19596:53;:::i;:::-;19586:63;;19541:118;19192:474;;;;;:::o;19672:180::-;19720:77;19717:1;19710:88;19817:4;19814:1;19807:15;19841:4;19838:1;19831:15;19858:320;19902:6;19939:1;19933:4;19929:12;19919:22;;19986:1;19980:4;19976:12;20007:18;19997:81;;20063:4;20055:6;20051:17;20041:27;;19997:81;20125:2;20117:6;20114:14;20094:18;20091:38;20088:84;;20144:18;;:::i;:::-;20088:84;19909:269;19858:320;;;:::o;20184:231::-;20324:34;20320:1;20312:6;20308:14;20301:58;20393:14;20388:2;20380:6;20376:15;20369:39;20184:231;:::o;20421:366::-;20563:3;20584:67;20648:2;20643:3;20584:67;:::i;:::-;20577:74;;20660:93;20749:3;20660:93;:::i;:::-;20778:2;20773:3;20769:12;20762:19;;20421:366;;;:::o;20793:419::-;20959:4;20997:2;20986:9;20982:18;20974:26;;21046:9;21040:4;21036:20;21032:1;21021:9;21017:17;21010:47;21074:131;21200:4;21074:131;:::i;:::-;21066:139;;20793:419;;;:::o;21218:220::-;21358:34;21354:1;21346:6;21342:14;21335:58;21427:3;21422:2;21414:6;21410:15;21403:28;21218:220;:::o;21444:366::-;21586:3;21607:67;21671:2;21666:3;21607:67;:::i;:::-;21600:74;;21683:93;21772:3;21683:93;:::i;:::-;21801:2;21796:3;21792:12;21785:19;;21444:366;;;:::o;21816:419::-;21982:4;22020:2;22009:9;22005:18;21997:26;;22069:9;22063:4;22059:20;22055:1;22044:9;22040:17;22033:47;22097:131;22223:4;22097:131;:::i;:::-;22089:139;;21816:419;;;:::o;22241:243::-;22381:34;22377:1;22369:6;22365:14;22358:58;22450:26;22445:2;22437:6;22433:15;22426:51;22241:243;:::o;22490:366::-;22632:3;22653:67;22717:2;22712:3;22653:67;:::i;:::-;22646:74;;22729:93;22818:3;22729:93;:::i;:::-;22847:2;22842:3;22838:12;22831:19;;22490:366;;;:::o;22862:419::-;23028:4;23066:2;23055:9;23051:18;23043:26;;23115:9;23109:4;23105:20;23101:1;23090:9;23086:17;23079:47;23143:131;23269:4;23143:131;:::i;:::-;23135:139;;22862:419;;;:::o;23287:220::-;23427:34;23423:1;23415:6;23411:14;23404:58;23496:3;23491:2;23483:6;23479:15;23472:28;23287:220;:::o;23513:366::-;23655:3;23676:67;23740:2;23735:3;23676:67;:::i;:::-;23669:74;;23752:93;23841:3;23752:93;:::i;:::-;23870:2;23865:3;23861:12;23854:19;;23513:366;;;:::o;23885:419::-;24051:4;24089:2;24078:9;24074:18;24066:26;;24138:9;24132:4;24128:20;24124:1;24113:9;24109:17;24102:47;24166:131;24292:4;24166:131;:::i;:::-;24158:139;;23885:419;;;:::o;24310:104::-;24355:7;24384:24;24402:5;24384:24;:::i;:::-;24373:35;;24310:104;;;:::o;24420:142::-;24523:32;24549:5;24523:32;:::i;:::-;24518:3;24511:45;24420:142;;:::o;24568:561::-;24751:4;24789:2;24778:9;24774:18;24766:26;;24802:71;24870:1;24859:9;24855:17;24846:6;24802:71;:::i;:::-;24883:88;24967:2;24956:9;24952:18;24943:6;24883:88;:::i;:::-;25018:9;25012:4;25008:20;25003:2;24992:9;24988:18;24981:48;25046:76;25117:4;25108:6;25046:76;:::i;:::-;25038:84;;24568:561;;;;;;:::o;25135:147::-;25236:11;25273:3;25258:18;;25135:147;;;;:::o;25288:386::-;25392:3;25420:38;25452:5;25420:38;:::i;:::-;25474:88;25555:6;25550:3;25474:88;:::i;:::-;25467:95;;25571:65;25629:6;25624:3;25617:4;25610:5;25606:16;25571:65;:::i;:::-;25661:6;25656:3;25652:16;25645:23;;25396:278;25288:386;;;;:::o;25680:94::-;25713:8;25761:5;25757:2;25753:14;25732:35;;25680:94;;;:::o;25780:::-;25819:7;25848:20;25862:5;25848:20;:::i;:::-;25837:31;;25780:94;;;:::o;25880:100::-;25919:7;25948:26;25968:5;25948:26;:::i;:::-;25937:37;;25880:100;;;:::o;25986:157::-;26091:45;26111:24;26129:5;26111:24;:::i;:::-;26091:45;:::i;:::-;26086:3;26079:58;25986:157;;:::o;26149:412::-;26307:3;26329:93;26418:3;26409:6;26329:93;:::i;:::-;26322:100;;26432:75;26503:3;26494:6;26432:75;:::i;:::-;26532:2;26527:3;26523:12;26516:19;;26552:3;26545:10;;26149:412;;;;;:::o;26567:271::-;26697:3;26719:93;26808:3;26799:6;26719:93;:::i;:::-;26712:100;;26829:3;26822:10;;26567:271;;;;:::o;26844:178::-;26984:30;26980:1;26972:6;26968:14;26961:54;26844:178;:::o;27028:366::-;27170:3;27191:67;27255:2;27250:3;27191:67;:::i;:::-;27184:74;;27267:93;27356:3;27267:93;:::i;:::-;27385:2;27380:3;27376:12;27369:19;;27028:366;;;:::o;27400:419::-;27566:4;27604:2;27593:9;27589:18;27581:26;;27653:9;27647:4;27643:20;27639:1;27628:9;27624:17;27617:47;27681:131;27807:4;27681:131;:::i;:::-;27673:139;;27400:419;;;:::o;27825:180::-;27873:77;27870:1;27863:88;27970:4;27967:1;27960:15;27994:4;27991:1;27984:15;28011:191;28051:3;28070:20;28088:1;28070:20;:::i;:::-;28065:25;;28104:20;28122:1;28104:20;:::i;:::-;28099:25;;28147:1;28144;28140:9;28133:16;;28168:3;28165:1;28162:10;28159:36;;;28175:18;;:::i;:::-;28159:36;28011:191;;;;:::o;28208:180::-;28256:77;28253:1;28246:88;28353:4;28350:1;28343:15;28377:4;28374:1;28367:15;28394:233;28433:3;28456:24;28474:5;28456:24;:::i;:::-;28447:33;;28502:66;28495:5;28492:77;28489:103;;28572:18;;:::i;:::-;28489:103;28619:1;28612:5;28608:13;28601:20;;28394:233;;;:::o;28633:236::-;28773:34;28769:1;28761:6;28757:14;28750:58;28842:19;28837:2;28829:6;28825:15;28818:44;28633:236;:::o;28875:366::-;29017:3;29038:67;29102:2;29097:3;29038:67;:::i;:::-;29031:74;;29114:93;29203:3;29114:93;:::i;:::-;29232:2;29227:3;29223:12;29216:19;;28875:366;;;:::o;29247:419::-;29413:4;29451:2;29440:9;29436:18;29428:26;;29500:9;29494:4;29490:20;29486:1;29475:9;29471:17;29464:47;29528:131;29654:4;29528:131;:::i;:::-;29520:139;;29247:419;;;:::o;29672:163::-;29812:15;29808:1;29800:6;29796:14;29789:39;29672:163;:::o;29841:366::-;29983:3;30004:67;30068:2;30063:3;30004:67;:::i;:::-;29997:74;;30080:93;30169:3;30080:93;:::i;:::-;30198:2;30193:3;30189:12;30182:19;;29841:366;;;:::o;30213:419::-;30379:4;30417:2;30406:9;30402:18;30394:26;;30466:9;30460:4;30456:20;30452:1;30441:9;30437:17;30430:47;30494:131;30620:4;30494:131;:::i;:::-;30486:139;;30213:419;;;:::o;30638:176::-;30778:28;30774:1;30766:6;30762:14;30755:52;30638:176;:::o;30820:366::-;30962:3;30983:67;31047:2;31042:3;30983:67;:::i;:::-;30976:74;;31059:93;31148:3;31059:93;:::i;:::-;31177:2;31172:3;31168:12;31161:19;;30820:366;;;:::o;31192:419::-;31358:4;31396:2;31385:9;31381:18;31373:26;;31445:9;31439:4;31435:20;31431:1;31420:9;31416:17;31409:47;31473:131;31599:4;31473:131;:::i;:::-;31465:139;;31192:419;;;:::o;31617:348::-;31657:7;31680:20;31698:1;31680:20;:::i;:::-;31675:25;;31714:20;31732:1;31714:20;:::i;:::-;31709:25;;31902:1;31834:66;31830:74;31827:1;31824:81;31819:1;31812:9;31805:17;31801:105;31798:131;;;31909:18;;:::i;:::-;31798:131;31957:1;31954;31950:9;31939:20;;31617:348;;;;:::o;31971:182::-;32111:34;32107:1;32099:6;32095:14;32088:58;31971:182;:::o;32159:366::-;32301:3;32322:67;32386:2;32381:3;32322:67;:::i;:::-;32315:74;;32398:93;32487:3;32398:93;:::i;:::-;32516:2;32511:3;32507:12;32500:19;;32159:366;;;:::o;32531:419::-;32697:4;32735:2;32724:9;32720:18;32712:26;;32784:9;32778:4;32774:20;32770:1;32759:9;32755:17;32748:47;32812:131;32938:4;32812:131;:::i;:::-;32804:139;;32531:419;;;:::o;32956:228::-;33096:34;33092:1;33084:6;33080:14;33073:58;33165:11;33160:2;33152:6;33148:15;33141:36;32956:228;:::o;33190:366::-;33332:3;33353:67;33417:2;33412:3;33353:67;:::i;:::-;33346:74;;33429:93;33518:3;33429:93;:::i;:::-;33547:2;33542:3;33538:12;33531:19;;33190:366;;;:::o;33562:419::-;33728:4;33766:2;33755:9;33751:18;33743:26;;33815:9;33809:4;33805:20;33801:1;33790:9;33786:17;33779:47;33843:131;33969:4;33843:131;:::i;:::-;33835:139;;33562:419;;;:::o;33987:229::-;34127:34;34123:1;34115:6;34111:14;34104:58;34196:12;34191:2;34183:6;34179:15;34172:37;33987:229;:::o;34222:366::-;34364:3;34385:67;34449:2;34444:3;34385:67;:::i;:::-;34378:74;;34461:93;34550:3;34461:93;:::i;:::-;34579:2;34574:3;34570:12;34563:19;;34222:366;;;:::o;34594:419::-;34760:4;34798:2;34787:9;34783:18;34775:26;;34847:9;34841:4;34837:20;34833:1;34822:9;34818:17;34811:47;34875:131;35001:4;34875:131;:::i;:::-;34867:139;;34594:419;;;:::o;35019:170::-;35159:22;35155:1;35147:6;35143:14;35136:46;35019:170;:::o;35195:366::-;35337:3;35358:67;35422:2;35417:3;35358:67;:::i;:::-;35351:74;;35434:93;35523:3;35434:93;:::i;:::-;35552:2;35547:3;35543:12;35536:19;;35195:366;;;:::o;35567:419::-;35733:4;35771:2;35760:9;35756:18;35748:26;;35820:9;35814:4;35810:20;35806:1;35795:9;35791:17;35784:47;35848:131;35974:4;35848:131;:::i;:::-;35840:139;;35567:419;;;:::o;35992:168::-;36132:20;36128:1;36120:6;36116:14;36109:44;35992:168;:::o;36166:366::-;36308:3;36329:67;36393:2;36388:3;36329:67;:::i;:::-;36322:74;;36405:93;36494:3;36405:93;:::i;:::-;36523:2;36518:3;36514:12;36507:19;;36166:366;;;:::o;36538:419::-;36704:4;36742:2;36731:9;36727:18;36719:26;;36791:9;36785:4;36781:20;36777:1;36766:9;36762:17;36755:47;36819:131;36945:4;36819:131;:::i;:::-;36811:139;;36538:419;;;:::o;36963:141::-;37012:4;37035:3;37027:11;;37058:3;37055:1;37048:14;37092:4;37089:1;37079:18;37071:26;;36963:141;;;:::o;37110:93::-;37147:6;37194:2;37189;37182:5;37178:14;37174:23;37164:33;;37110:93;;;:::o;37209:107::-;37253:8;37303:5;37297:4;37293:16;37272:37;;37209:107;;;;:::o;37322:393::-;37391:6;37441:1;37429:10;37425:18;37464:97;37494:66;37483:9;37464:97;:::i;:::-;37582:39;37612:8;37601:9;37582:39;:::i;:::-;37570:51;;37654:4;37650:9;37643:5;37639:21;37630:30;;37703:4;37693:8;37689:19;37682:5;37679:30;37669:40;;37398:317;;37322:393;;;;;:::o;37721:60::-;37749:3;37770:5;37763:12;;37721:60;;;:::o;37787:142::-;37837:9;37870:53;37888:34;37897:24;37915:5;37897:24;:::i;:::-;37888:34;:::i;:::-;37870:53;:::i;:::-;37857:66;;37787:142;;;:::o;37935:75::-;37978:3;37999:5;37992:12;;37935:75;;;:::o;38016:269::-;38126:39;38157:7;38126:39;:::i;:::-;38187:91;38236:41;38260:16;38236:41;:::i;:::-;38228:6;38221:4;38215:11;38187:91;:::i;:::-;38181:4;38174:105;38092:193;38016:269;;;:::o;38291:73::-;38336:3;38291:73;:::o;38370:189::-;38447:32;;:::i;:::-;38488:65;38546:6;38538;38532:4;38488:65;:::i;:::-;38423:136;38370:189;;:::o;38565:186::-;38625:120;38642:3;38635:5;38632:14;38625:120;;;38696:39;38733:1;38726:5;38696:39;:::i;:::-;38669:1;38662:5;38658:13;38649:22;;38625:120;;;38565:186;;:::o;38757:543::-;38858:2;38853:3;38850:11;38847:446;;;38892:38;38924:5;38892:38;:::i;:::-;38976:29;38994:10;38976:29;:::i;:::-;38966:8;38962:44;39159:2;39147:10;39144:18;39141:49;;;39180:8;39165:23;;39141:49;39203:80;39259:22;39277:3;39259:22;:::i;:::-;39249:8;39245:37;39232:11;39203:80;:::i;:::-;38862:431;;38847:446;38757:543;;;:::o;39306:117::-;39360:8;39410:5;39404:4;39400:16;39379:37;;39306:117;;;;:::o;39429:169::-;39473:6;39506:51;39554:1;39550:6;39542:5;39539:1;39535:13;39506:51;:::i;:::-;39502:56;39587:4;39581;39577:15;39567:25;;39480:118;39429:169;;;;:::o;39603:295::-;39679:4;39825:29;39850:3;39844:4;39825:29;:::i;:::-;39817:37;;39887:3;39884:1;39880:11;39874:4;39871:21;39863:29;;39603:295;;;;:::o;39903:1395::-;40020:37;40053:3;40020:37;:::i;:::-;40122:18;40114:6;40111:30;40108:56;;;40144:18;;:::i;:::-;40108:56;40188:38;40220:4;40214:11;40188:38;:::i;:::-;40273:67;40333:6;40325;40319:4;40273:67;:::i;:::-;40367:1;40391:4;40378:17;;40423:2;40415:6;40412:14;40440:1;40435:618;;;;41097:1;41114:6;41111:77;;;41163:9;41158:3;41154:19;41148:26;41139:35;;41111:77;41214:67;41274:6;41267:5;41214:67;:::i;:::-;41208:4;41201:81;41070:222;40405:887;;40435:618;40487:4;40483:9;40475:6;40471:22;40521:37;40553:4;40521:37;:::i;:::-;40580:1;40594:208;40608:7;40605:1;40602:14;40594:208;;;40687:9;40682:3;40678:19;40672:26;40664:6;40657:42;40738:1;40730:6;40726:14;40716:24;;40785:2;40774:9;40770:18;40757:31;;40631:4;40628:1;40624:12;40619:17;;40594:208;;;40830:6;40821:7;40818:19;40815:179;;;40888:9;40883:3;40879:19;40873:26;40931:48;40973:4;40965:6;40961:17;40950:9;40931:48;:::i;:::-;40923:6;40916:64;40838:156;40815:179;41040:1;41036;41028:6;41024:14;41020:22;41014:4;41007:36;40442:611;;;40405:887;;39995:1303;;;39903:1395;;:::o;41304:194::-;41344:4;41364:20;41382:1;41364:20;:::i;:::-;41359:25;;41398:20;41416:1;41398:20;:::i;:::-;41393:25;;41442:1;41439;41435:9;41427:17;;41466:1;41460:4;41457:11;41454:37;;;41471:18;;:::i;:::-;41454:37;41304:194;;;;:::o;41504:180::-;41552:77;41549:1;41542:88;41649:4;41646:1;41639:15;41673:4;41670:1;41663:15;41690:185;41730:1;41747:20;41765:1;41747:20;:::i;:::-;41742:25;;41781:20;41799:1;41781:20;:::i;:::-;41776:25;;41820:1;41810:35;;41825:18;;:::i;:::-;41810:35;41867:1;41864;41860:9;41855:14;;41690:185;;;;:::o;41881:148::-;41983:11;42020:3;42005:18;;41881:148;;;;:::o;42035:390::-;42141:3;42169:39;42202:5;42169:39;:::i;:::-;42224:89;42306:6;42301:3;42224:89;:::i;:::-;42217:96;;42322:65;42380:6;42375:3;42368:4;42361:5;42357:16;42322:65;:::i;:::-;42412:6;42407:3;42403:16;42396:23;;42145:280;42035:390;;;;:::o;42431:151::-;42571:3;42567:1;42559:6;42555:14;42548:27;42431:151;:::o;42588:400::-;42748:3;42769:84;42851:1;42846:3;42769:84;:::i;:::-;42762:91;;42862:93;42951:3;42862:93;:::i;:::-;42980:1;42975:3;42971:11;42964:18;;42588:400;;;:::o;42994:155::-;43134:7;43130:1;43122:6;43118:14;43111:31;42994:155;:::o;43155:400::-;43315:3;43336:84;43418:1;43413:3;43336:84;:::i;:::-;43329:91;;43429:93;43518:3;43429:93;:::i;:::-;43547:1;43542:3;43538:11;43531:18;;43155:400;;;:::o;43561:967::-;43943:3;43965:95;44056:3;44047:6;43965:95;:::i;:::-;43958:102;;44077:148;44221:3;44077:148;:::i;:::-;44070:155;;44242:95;44333:3;44324:6;44242:95;:::i;:::-;44235:102;;44354:148;44498:3;44354:148;:::i;:::-;44347:155;;44519:3;44512:10;;43561:967;;;;;:::o;44534:125::-;44600:7;44629:24;44647:5;44629:24;:::i;:::-;44618:35;;44534:125;;;:::o;44665:180::-;44767:53;44814:5;44767:53;:::i;:::-;44760:5;44757:64;44747:92;;44835:1;44832;44825:12;44747:92;44665:180;:::o;44851:201::-;44937:5;44968:6;44962:13;44953:22;;44984:62;45040:5;44984:62;:::i;:::-;44851:201;;;;:::o;45058:409::-;45157:6;45206:2;45194:9;45185:7;45181:23;45177:32;45174:119;;;45212:79;;:::i;:::-;45174:119;45332:1;45357:93;45442:7;45433:6;45422:9;45418:22;45357:93;:::i;:::-;45347:103;;45303:157;45058:409;;;;:::o;45473:225::-;45613:34;45609:1;45601:6;45597:14;45590:58;45682:8;45677:2;45669:6;45665:15;45658:33;45473:225;:::o;45704:366::-;45846:3;45867:67;45931:2;45926:3;45867:67;:::i;:::-;45860:74;;45943:93;46032:3;45943:93;:::i;:::-;46061:2;46056:3;46052:12;46045:19;;45704:366;;;:::o;46076:419::-;46242:4;46280:2;46269:9;46265:18;46257:26;;46329:9;46323:4;46319:20;46315:1;46304:9;46300:17;46293:47;46357:131;46483:4;46357:131;:::i;:::-;46349:139;;46076:419;;;:::o;46501:224::-;46641:34;46637:1;46629:6;46625:14;46618:58;46710:7;46705:2;46697:6;46693:15;46686:32;46501:224;:::o;46731:366::-;46873:3;46894:67;46958:2;46953:3;46894:67;:::i;:::-;46887:74;;46970:93;47059:3;46970:93;:::i;:::-;47088:2;47083:3;47079:12;47072:19;;46731:366;;;:::o;47103:419::-;47269:4;47307:2;47296:9;47292:18;47284:26;;47356:9;47350:4;47346:20;47342:1;47331:9;47327:17;47320:47;47384:131;47510:4;47384:131;:::i;:::-;47376:139;;47103:419;;;:::o;47528:112::-;47611:22;47627:5;47611:22;:::i;:::-;47606:3;47599:35;47528:112;;:::o;47646:545::-;47819:4;47857:3;47846:9;47842:19;47834:27;;47871:71;47939:1;47928:9;47924:17;47915:6;47871:71;:::i;:::-;47952:68;48016:2;48005:9;48001:18;47992:6;47952:68;:::i;:::-;48030:72;48098:2;48087:9;48083:18;48074:6;48030:72;:::i;:::-;48112;48180:2;48169:9;48165:18;48156:6;48112:72;:::i;:::-;47646:545;;;;;;;:::o;48197:231::-;48337:34;48333:1;48325:6;48321:14;48314:58;48406:14;48401:2;48393:6;48389:15;48382:39;48197:231;:::o;48434:366::-;48576:3;48597:67;48661:2;48656:3;48597:67;:::i;:::-;48590:74;;48673:93;48762:3;48673:93;:::i;:::-;48791:2;48786:3;48782:12;48775:19;;48434:366;;;:::o;48806:419::-;48972:4;49010:2;48999:9;48995:18;48987:26;;49059:9;49053:4;49049:20;49045:1;49034:9;49030:17;49023:47;49087:131;49213:4;49087:131;:::i;:::-;49079:139;;48806:419;;;:::o;49231:224::-;49371:34;49367:1;49359:6;49355:14;49348:58;49440:7;49435:2;49427:6;49423:15;49416:32;49231:224;:::o;49461:366::-;49603:3;49624:67;49688:2;49683:3;49624:67;:::i;:::-;49617:74;;49700:93;49789:3;49700:93;:::i;:::-;49818:2;49813:3;49809:12;49802:19;;49461:366;;;:::o;49833:419::-;49999:4;50037:2;50026:9;50022:18;50014:26;;50086:9;50080:4;50076:20;50072:1;50061:9;50057:17;50050:47;50114:131;50240:4;50114:131;:::i;:::-;50106:139;;49833:419;;;:::o;50258:223::-;50398:34;50394:1;50386:6;50382:14;50375:58;50467:6;50462:2;50454:6;50450:15;50443:31;50258:223;:::o;50487:366::-;50629:3;50650:67;50714:2;50709:3;50650:67;:::i;:::-;50643:74;;50726:93;50815:3;50726:93;:::i;:::-;50844:2;50839:3;50835:12;50828:19;;50487:366;;;:::o;50859:419::-;51025:4;51063:2;51052:9;51048:18;51040:26;;51112:9;51106:4;51102:20;51098:1;51087:9;51083:17;51076:47;51140:131;51266:4;51140:131;:::i;:::-;51132:139;;50859:419;;;:::o;51284:231::-;51424:34;51420:1;51412:6;51408:14;51401:58;51493:14;51488:2;51480:6;51476:15;51469:39;51284:231;:::o;51521:366::-;51663:3;51684:67;51748:2;51743:3;51684:67;:::i;:::-;51677:74;;51760:93;51849:3;51760:93;:::i;:::-;51878:2;51873:3;51869:12;51862:19;;51521:366;;;:::o;51893:419::-;52059:4;52097:2;52086:9;52082:18;52074:26;;52146:9;52140:4;52136:20;52132:1;52121:9;52117:17;52110:47;52174:131;52300:4;52174:131;:::i;:::-;52166:139;;51893:419;;;:::o;52318:175::-;52458:27;52454:1;52446:6;52442:14;52435:51;52318:175;:::o;52499:366::-;52641:3;52662:67;52726:2;52721:3;52662:67;:::i;:::-;52655:74;;52738:93;52827:3;52738:93;:::i;:::-;52856:2;52851:3;52847:12;52840:19;;52499:366;;;:::o;52871:419::-;53037:4;53075:2;53064:9;53060:18;53052:26;;53124:9;53118:4;53114:20;53110:1;53099:9;53095:17;53088:47;53152:131;53278:4;53152:131;:::i;:::-;53144:139;;52871:419;;;:::o;53296:237::-;53436:34;53432:1;53424:6;53420:14;53413:58;53505:20;53500:2;53492:6;53488:15;53481:45;53296:237;:::o;53539:366::-;53681:3;53702:67;53766:2;53761:3;53702:67;:::i;:::-;53695:74;;53778:93;53867:3;53778:93;:::i;:::-;53896:2;53891:3;53887:12;53880:19;;53539:366;;;:::o;53911:419::-;54077:4;54115:2;54104:9;54100:18;54092:26;;54164:9;54158:4;54154:20;54150:1;54139:9;54135:17;54128:47;54192:131;54318:4;54192:131;:::i;:::-;54184:139;;53911:419;;;:::o;54336:176::-;54368:1;54385:20;54403:1;54385:20;:::i;:::-;54380:25;;54419:20;54437:1;54419:20;:::i;:::-;54414:25;;54458:1;54448:35;;54463:18;;:::i;:::-;54448:35;54504:1;54501;54497:9;54492:14;;54336:176;;;;:::o;54518:553::-;54695:4;54733:3;54722:9;54718:19;54710:27;;54747:71;54815:1;54804:9;54800:17;54791:6;54747:71;:::i;:::-;54828:72;54896:2;54885:9;54881:18;54872:6;54828:72;:::i;:::-;54910;54978:2;54967:9;54963:18;54954:6;54910:72;:::i;:::-;54992;55060:2;55049:9;55045:18;55036:6;54992:72;:::i;:::-;54518:553;;;;;;;:::o;55077:214::-;55217:66;55213:1;55205:6;55201:14;55194:90;55077:214;:::o;55297:400::-;55457:3;55478:84;55560:1;55555:3;55478:84;:::i;:::-;55471:91;;55571:93;55660:3;55571:93;:::i;:::-;55689:1;55684:3;55680:11;55673:18;;55297:400;;;:::o;55703:79::-;55742:7;55771:5;55760:16;;55703:79;;;:::o;55788:157::-;55893:45;55913:24;55931:5;55913:24;:::i;:::-;55893:45;:::i;:::-;55888:3;55881:58;55788:157;;:::o;55951:663::-;56192:3;56214:148;56358:3;56214:148;:::i;:::-;56207:155;;56372:75;56443:3;56434:6;56372:75;:::i;:::-;56472:2;56467:3;56463:12;56456:19;;56485:75;56556:3;56547:6;56485:75;:::i;:::-;56585:2;56580:3;56576:12;56569:19;;56605:3;56598:10;;55951:663;;;;;:::o;56620:640::-;56815:4;56853:3;56842:9;56838:19;56830:27;;56867:71;56935:1;56924:9;56920:17;56911:6;56867:71;:::i;:::-;56948:72;57016:2;57005:9;57001:18;56992:6;56948:72;:::i;:::-;57030;57098:2;57087:9;57083:18;57074:6;57030:72;:::i;:::-;57149:9;57143:4;57139:20;57134:2;57123:9;57119:18;57112:48;57177:76;57248:4;57239:6;57177:76;:::i;:::-;57169:84;;56620:640;;;;;;;:::o;57266:141::-;57322:5;57353:6;57347:13;57338:22;;57369:32;57395:5;57369:32;:::i;:::-;57266:141;;;;:::o;57413:349::-;57482:6;57531:2;57519:9;57510:7;57506:23;57502:32;57499:119;;;57537:79;;:::i;:::-;57499:119;57657:1;57682:63;57737:7;57728:6;57717:9;57713:22;57682:63;:::i;:::-;57672:73;;57628:127;57413:349;;;;:::o;57768:182::-;57908:34;57904:1;57896:6;57892:14;57885:58;57768:182;:::o;57956:366::-;58098:3;58119:67;58183:2;58178:3;58119:67;:::i;:::-;58112:74;;58195:93;58284:3;58195:93;:::i;:::-;58313:2;58308:3;58304:12;58297:19;;57956:366;;;:::o;58328:419::-;58494:4;58532:2;58521:9;58517:18;58509:26;;58581:9;58575:4;58571:20;58567:1;58556:9;58552:17;58545:47;58609:131;58735:4;58609:131;:::i;:::-;58601:139;;58328:419;;;:::o;58753:178::-;58893:30;58889:1;58881:6;58877:14;58870:54;58753:178;:::o;58937:366::-;59079:3;59100:67;59164:2;59159:3;59100:67;:::i;:::-;59093:74;;59176:93;59265:3;59176:93;:::i;:::-;59294:2;59289:3;59285:12;59278:19;;58937:366;;;:::o;59309:419::-;59475:4;59513:2;59502:9;59498:18;59490:26;;59562:9;59556:4;59552:20;59548:1;59537:9;59533:17;59526:47;59590:131;59716:4;59590:131;:::i;:::-;59582:139;;59309:419;;;:::o

Swarm Source

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