ETH Price: $2,268.51 (+1.98%)

Token

HBCBeer (HBCB)
 

Overview

Max Total Supply

64 HBCB

Holders

63

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
chewypixels.eth
Balance
1 HBCB
0x1DFa0DdFC2E523736d98CA7ca3C35d5Ce0b2CC70
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:
HBCBeer

Compiler Version
v0.8.2+commit.661d1103

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-07-25
*/

// File: @openzeppelin/[email protected]/utils/Context.sol



pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
// File: @openzeppelin/[email protected]/access/Ownable.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/[email protected]/utils/introspection/IERC165.sol



pragma solidity ^0.8.0;

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



// File: @openzeppelin/[email protected]/token/ERC721/IERC721.sol



pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, 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;
}


// File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Enumerable.sol



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/[email protected]/utils/introspection/ERC165.sol



pragma solidity ^0.8.0;


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

// File: @openzeppelin/[email protected]/utils/Strings.sol



pragma solidity ^0.8.0;

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

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

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

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

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



// File: @openzeppelin/[email protected]/utils/Address.sol



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

// File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Metadata.sol



pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/[email protected]/token/ERC721/IERC721Receiver.sol



pragma solidity ^0.8.0;

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


// File: @openzeppelin/[email protected]/token/ERC721/ERC721.sol



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: 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 overriden 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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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);
    }

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

    /**
     * @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 of token that is not own");
        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);
    }

    /**
     * @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 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(to).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 {}
}

// File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721Enumerable.sol



pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: hbcbeer.sol


pragma solidity ^0.8.2;

contract HBCBeer is ERC721Enumerable, Ownable {
    string private baseURI;
    string public BEER_PROVENANCE;
    bool public lockedSupply = false;
    
    constructor() ERC721("HBCBeer", "HBCB") {}
    
    function batchMint(address[] memory supporters) public onlyOwner {
        require(lockedSupply == false, "Max Supply");
        require(supporters.length > 0, "No Addresses");
        for (uint256 i = 0; i < supporters.length; i++) {
            _safeMint(supporters[i], totalSupply());
        }
    }
    
    function safeMint(address to) public onlyOwner {
        require(lockedSupply == false, "Max Supply");
        _safeMint(to, totalSupply());
    }
    
    function stopMint() public onlyOwner {
        lockedSupply = true;
    }
    
    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        BEER_PROVENANCE = provenanceHash;
    }
    
    function _baseURI() internal view override returns (string memory) {
      return baseURI;
    }
    
    function setBaseURI(string memory uri) public onlyOwner {
      baseURI = uri;
    }

}

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":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":"BEER_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"address[]","name":"supporters","type":"address[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedSupply","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","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":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopMint","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"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"}]

60806040526000600d60006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040518060400160405280600781526020017f48424342656572000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f48424342000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000b1929190620001c1565b508060019080519060200190620000ca929190620001c1565b505050620000ed620000e1620000f360201b60201c565b620000fb60201b60201c565b620002d6565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001cf9062000271565b90600052602060002090601f016020900481019282620001f357600085556200023f565b82601f106200020e57805160ff19168380011785556200023f565b828001600101855582156200023f579182015b828111156200023e57825182559160200191906001019062000221565b5b5090506200024e919062000252565b5090565b5b808211156200026d57600081600090555060010162000253565b5090565b600060028204905060018216806200028a57607f821691505b60208210811415620002a157620002a0620002a7565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613c8580620002e66000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c806370a08231116100de578063c87b56dd11610097578063d67b06c111610071578063d67b06c11461046d578063e985e9c514610489578063ecc448f8146104b9578063f2fde38b146104d75761018e565b8063c87b56dd14610415578063ca5c7b9114610445578063d5582965146104635761018e565b806370a0823114610367578063715018a6146103975780638da5cb5b146103a157806395d89b41146103bf578063a22cb465146103dd578063b88d4fde146103f95761018e565b806323b872dd1161014b57806342842e0e1161012557806342842e0e146102cf5780634f6ccce7146102eb57806355f804b31461031b5780636352211e146103375761018e565b806323b872dd146102675780632f745c591461028357806340d097c3146102b35761018e565b806301ffc9a71461019357806306fdde03146101c3578063081812fc146101e1578063095ea7b314610211578063109695231461022d57806318160ddd14610249575b600080fd5b6101ad60048036038101906101a89190612aef565b6104f3565b6040516101ba9190612fc2565b60405180910390f35b6101cb61056d565b6040516101d89190612fdd565b60405180910390f35b6101fb60048036038101906101f69190612b82565b6105ff565b6040516102089190612f5b565b60405180910390f35b61022b60048036038101906102269190612a72565b610684565b005b61024760048036038101906102429190612b41565b61079c565b005b610251610832565b60405161025e919061327f565b60405180910390f35b610281600480360381019061027c919061296c565b61083f565b005b61029d60048036038101906102989190612a72565b61089f565b6040516102aa919061327f565b60405180910390f35b6102cd60048036038101906102c89190612907565b610944565b005b6102e960048036038101906102e4919061296c565b610a2a565b005b61030560048036038101906103009190612b82565b610a4a565b604051610312919061327f565b60405180910390f35b61033560048036038101906103309190612b41565b610ae1565b005b610351600480360381019061034c9190612b82565b610b77565b60405161035e9190612f5b565b60405180910390f35b610381600480360381019061037c9190612907565b610c29565b60405161038e919061327f565b60405180910390f35b61039f610ce1565b005b6103a9610d69565b6040516103b69190612f5b565b60405180910390f35b6103c7610d93565b6040516103d49190612fdd565b60405180910390f35b6103f760048036038101906103f29190612a36565b610e25565b005b610413600480360381019061040e91906129bb565b610fa6565b005b61042f600480360381019061042a9190612b82565b611008565b60405161043c9190612fdd565b60405180910390f35b61044d6110af565b60405161045a9190612fc2565b60405180910390f35b61046b6110c2565b005b61048760048036038101906104829190612aae565b61115b565b005b6104a3600480360381019061049e9190612930565b6112e5565b6040516104b09190612fc2565b60405180910390f35b6104c1611379565b6040516104ce9190612fdd565b60405180910390f35b6104f160048036038101906104ec9190612907565b611407565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105665750610565826114ff565b5b9050919050565b60606000805461057c90613501565b80601f01602080910402602001604051908101604052809291908181526020018280546105a890613501565b80156105f55780601f106105ca576101008083540402835291602001916105f5565b820191906000526020600020905b8154815290600101906020018083116105d857829003601f168201915b5050505050905090565b600061060a826115e1565b610649576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106409061317f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061068f82610b77565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f7906131ff565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661071f61164d565b73ffffffffffffffffffffffffffffffffffffffff16148061074e575061074d8161074861164d565b6112e5565b5b61078d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610784906130df565b60405180910390fd5b6107978383611655565b505050565b6107a461164d565b73ffffffffffffffffffffffffffffffffffffffff166107c2610d69565b73ffffffffffffffffffffffffffffffffffffffff1614610818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080f9061319f565b60405180910390fd5b80600c908051906020019061082e929190612695565b5050565b6000600880549050905090565b61085061084a61164d565b8261170e565b61088f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108869061321f565b60405180910390fd5b61089a8383836117ec565b505050565b60006108aa83610c29565b82106108eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e290612fff565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61094c61164d565b73ffffffffffffffffffffffffffffffffffffffff1661096a610d69565b73ffffffffffffffffffffffffffffffffffffffff16146109c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b79061319f565b60405180910390fd5b60001515600d60009054906101000a900460ff16151514610a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0d9061325f565b60405180910390fd5b610a2781610a22610832565b611a48565b50565b610a4583838360405180602001604052806000815250610fa6565b505050565b6000610a54610832565b8210610a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8c9061323f565b60405180910390fd5b60088281548110610acf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610ae961164d565b73ffffffffffffffffffffffffffffffffffffffff16610b07610d69565b73ffffffffffffffffffffffffffffffffffffffff1614610b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b549061319f565b60405180910390fd5b80600b9080519060200190610b73929190612695565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c179061313f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c919061311f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ce961164d565b73ffffffffffffffffffffffffffffffffffffffff16610d07610d69565b73ffffffffffffffffffffffffffffffffffffffff1614610d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d549061319f565b60405180910390fd5b610d676000611a66565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610da290613501565b80601f0160208091040260200160405190810160405280929190818152602001828054610dce90613501565b8015610e1b5780601f10610df057610100808354040283529160200191610e1b565b820191906000526020600020905b815481529060010190602001808311610dfe57829003601f168201915b5050505050905090565b610e2d61164d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e929061309f565b60405180910390fd5b8060056000610ea861164d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610f5561164d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610f9a9190612fc2565b60405180910390a35050565b610fb7610fb161164d565b8361170e565b610ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fed9061321f565b60405180910390fd5b61100284848484611b2c565b50505050565b6060611013826115e1565b611052576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611049906131df565b60405180910390fd5b600061105c611b88565b9050600081511161107c57604051806020016040528060008152506110a7565b8061108684611c1a565b604051602001611097929190612f37565b6040516020818303038152906040525b915050919050565b600d60009054906101000a900460ff1681565b6110ca61164d565b73ffffffffffffffffffffffffffffffffffffffff166110e8610d69565b73ffffffffffffffffffffffffffffffffffffffff161461113e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111359061319f565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b61116361164d565b73ffffffffffffffffffffffffffffffffffffffff16611181610d69565b73ffffffffffffffffffffffffffffffffffffffff16146111d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce9061319f565b60405180910390fd5b60001515600d60009054906101000a900460ff1615151461122d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112249061325f565b60405180910390fd5b6000815111611271576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611268906130ff565b60405180910390fd5b60005b81518110156112e1576112ce8282815181106112b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516112c9610832565b611a48565b80806112d990613564565b915050611274565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c805461138690613501565b80601f01602080910402602001604051908101604052809291908181526020018280546113b290613501565b80156113ff5780601f106113d4576101008083540402835291602001916113ff565b820191906000526020600020905b8154815290600101906020018083116113e257829003601f168201915b505050505081565b61140f61164d565b73ffffffffffffffffffffffffffffffffffffffff1661142d610d69565b73ffffffffffffffffffffffffffffffffffffffff1614611483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147a9061319f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ea9061303f565b60405180910390fd5b6114fc81611a66565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806115ca57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806115da57506115d982611dc7565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166116c883610b77565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611719826115e1565b611758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174f906130bf565b60405180910390fd5b600061176383610b77565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806117d257508373ffffffffffffffffffffffffffffffffffffffff166117ba846105ff565b73ffffffffffffffffffffffffffffffffffffffff16145b806117e357506117e281856112e5565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661180c82610b77565b73ffffffffffffffffffffffffffffffffffffffff1614611862576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611859906131bf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c99061307f565b60405180910390fd5b6118dd838383611e31565b6118e8600082611655565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119389190613417565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461198f9190613390565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611a62828260405180602001604052806000815250611f45565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611b378484846117ec565b611b4384848484611fa0565b611b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b799061301f565b60405180910390fd5b50505050565b6060600b8054611b9790613501565b80601f0160208091040260200160405190810160405280929190818152602001828054611bc390613501565b8015611c105780601f10611be557610100808354040283529160200191611c10565b820191906000526020600020905b815481529060010190602001808311611bf357829003601f168201915b5050505050905090565b60606000821415611c62576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611dc2565b600082905060005b60008214611c94578080611c7d90613564565b915050600a82611c8d91906133e6565b9150611c6a565b60008167ffffffffffffffff811115611cd6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611d085781602001600182028036833780820191505090505b5090505b60008514611dbb57600182611d219190613417565b9150600a85611d3091906135ad565b6030611d3c9190613390565b60f81b818381518110611d78577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611db491906133e6565b9450611d0c565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611e3c838383612137565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e7f57611e7a8161213c565b611ebe565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611ebd57611ebc8382612185565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f0157611efc816122f2565b611f40565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611f3f57611f3e8282612435565b5b5b505050565b611f4f83836124b4565b611f5c6000848484611fa0565b611f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f929061301f565b60405180910390fd5b505050565b6000611fc18473ffffffffffffffffffffffffffffffffffffffff16612682565b1561212a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611fea61164d565b8786866040518563ffffffff1660e01b815260040161200c9493929190612f76565b602060405180830381600087803b15801561202657600080fd5b505af192505050801561205757506040513d601f19601f820116820180604052508101906120549190612b18565b60015b6120da573d8060008114612087576040519150601f19603f3d011682016040523d82523d6000602084013e61208c565b606091505b506000815114156120d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c99061301f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061212f565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161219284610c29565b61219c9190613417565b9050600060076000848152602001908152602001600020549050818114612281576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506123069190613417565b905060006009600084815260200190815260200160002054905060006008838154811061235c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106123a4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612419577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061244083610c29565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612524576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251b9061315f565b60405180910390fd5b61252d816115e1565b1561256d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125649061305f565b60405180910390fd5b61257960008383611e31565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125c99190613390565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546126a190613501565b90600052602060002090601f0160209004810192826126c3576000855561270a565b82601f106126dc57805160ff191683800117855561270a565b8280016001018555821561270a579182015b828111156127095782518255916020019190600101906126ee565b5b509050612717919061271b565b5090565b5b8082111561273457600081600090555060010161271c565b5090565b600061274b612746846132bf565b61329a565b9050808382526020820190508285602086028201111561276a57600080fd5b60005b8581101561279a57816127808882612820565b84526020840193506020830192505060018101905061276d565b5050509392505050565b60006127b76127b2846132eb565b61329a565b9050828152602081018484840111156127cf57600080fd5b6127da8482856134bf565b509392505050565b60006127f56127f08461331c565b61329a565b90508281526020810184848401111561280d57600080fd5b6128188482856134bf565b509392505050565b60008135905061282f81613bf3565b92915050565b600082601f83011261284657600080fd5b8135612856848260208601612738565b91505092915050565b60008135905061286e81613c0a565b92915050565b60008135905061288381613c21565b92915050565b60008151905061289881613c21565b92915050565b600082601f8301126128af57600080fd5b81356128bf8482602086016127a4565b91505092915050565b600082601f8301126128d957600080fd5b81356128e98482602086016127e2565b91505092915050565b60008135905061290181613c38565b92915050565b60006020828403121561291957600080fd5b600061292784828501612820565b91505092915050565b6000806040838503121561294357600080fd5b600061295185828601612820565b925050602061296285828601612820565b9150509250929050565b60008060006060848603121561298157600080fd5b600061298f86828701612820565b93505060206129a086828701612820565b92505060406129b1868287016128f2565b9150509250925092565b600080600080608085870312156129d157600080fd5b60006129df87828801612820565b94505060206129f087828801612820565b9350506040612a01878288016128f2565b925050606085013567ffffffffffffffff811115612a1e57600080fd5b612a2a8782880161289e565b91505092959194509250565b60008060408385031215612a4957600080fd5b6000612a5785828601612820565b9250506020612a688582860161285f565b9150509250929050565b60008060408385031215612a8557600080fd5b6000612a9385828601612820565b9250506020612aa4858286016128f2565b9150509250929050565b600060208284031215612ac057600080fd5b600082013567ffffffffffffffff811115612ada57600080fd5b612ae684828501612835565b91505092915050565b600060208284031215612b0157600080fd5b6000612b0f84828501612874565b91505092915050565b600060208284031215612b2a57600080fd5b6000612b3884828501612889565b91505092915050565b600060208284031215612b5357600080fd5b600082013567ffffffffffffffff811115612b6d57600080fd5b612b79848285016128c8565b91505092915050565b600060208284031215612b9457600080fd5b6000612ba2848285016128f2565b91505092915050565b612bb48161344b565b82525050565b612bc38161345d565b82525050565b6000612bd48261334d565b612bde8185613363565b9350612bee8185602086016134ce565b612bf78161369a565b840191505092915050565b6000612c0d82613358565b612c178185613374565b9350612c278185602086016134ce565b612c308161369a565b840191505092915050565b6000612c4682613358565b612c508185613385565b9350612c608185602086016134ce565b80840191505092915050565b6000612c79602b83613374565b9150612c84826136ab565b604082019050919050565b6000612c9c603283613374565b9150612ca7826136fa565b604082019050919050565b6000612cbf602683613374565b9150612cca82613749565b604082019050919050565b6000612ce2601c83613374565b9150612ced82613798565b602082019050919050565b6000612d05602483613374565b9150612d10826137c1565b604082019050919050565b6000612d28601983613374565b9150612d3382613810565b602082019050919050565b6000612d4b602c83613374565b9150612d5682613839565b604082019050919050565b6000612d6e603883613374565b9150612d7982613888565b604082019050919050565b6000612d91600c83613374565b9150612d9c826138d7565b602082019050919050565b6000612db4602a83613374565b9150612dbf82613900565b604082019050919050565b6000612dd7602983613374565b9150612de28261394f565b604082019050919050565b6000612dfa602083613374565b9150612e058261399e565b602082019050919050565b6000612e1d602c83613374565b9150612e28826139c7565b604082019050919050565b6000612e40602083613374565b9150612e4b82613a16565b602082019050919050565b6000612e63602983613374565b9150612e6e82613a3f565b604082019050919050565b6000612e86602f83613374565b9150612e9182613a8e565b604082019050919050565b6000612ea9602183613374565b9150612eb482613add565b604082019050919050565b6000612ecc603183613374565b9150612ed782613b2c565b604082019050919050565b6000612eef602c83613374565b9150612efa82613b7b565b604082019050919050565b6000612f12600a83613374565b9150612f1d82613bca565b602082019050919050565b612f31816134b5565b82525050565b6000612f438285612c3b565b9150612f4f8284612c3b565b91508190509392505050565b6000602082019050612f706000830184612bab565b92915050565b6000608082019050612f8b6000830187612bab565b612f986020830186612bab565b612fa56040830185612f28565b8181036060830152612fb78184612bc9565b905095945050505050565b6000602082019050612fd76000830184612bba565b92915050565b60006020820190508181036000830152612ff78184612c02565b905092915050565b6000602082019050818103600083015261301881612c6c565b9050919050565b6000602082019050818103600083015261303881612c8f565b9050919050565b6000602082019050818103600083015261305881612cb2565b9050919050565b6000602082019050818103600083015261307881612cd5565b9050919050565b6000602082019050818103600083015261309881612cf8565b9050919050565b600060208201905081810360008301526130b881612d1b565b9050919050565b600060208201905081810360008301526130d881612d3e565b9050919050565b600060208201905081810360008301526130f881612d61565b9050919050565b6000602082019050818103600083015261311881612d84565b9050919050565b6000602082019050818103600083015261313881612da7565b9050919050565b6000602082019050818103600083015261315881612dca565b9050919050565b6000602082019050818103600083015261317881612ded565b9050919050565b6000602082019050818103600083015261319881612e10565b9050919050565b600060208201905081810360008301526131b881612e33565b9050919050565b600060208201905081810360008301526131d881612e56565b9050919050565b600060208201905081810360008301526131f881612e79565b9050919050565b6000602082019050818103600083015261321881612e9c565b9050919050565b6000602082019050818103600083015261323881612ebf565b9050919050565b6000602082019050818103600083015261325881612ee2565b9050919050565b6000602082019050818103600083015261327881612f05565b9050919050565b60006020820190506132946000830184612f28565b92915050565b60006132a46132b5565b90506132b08282613533565b919050565b6000604051905090565b600067ffffffffffffffff8211156132da576132d961366b565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156133065761330561366b565b5b61330f8261369a565b9050602081019050919050565b600067ffffffffffffffff8211156133375761333661366b565b5b6133408261369a565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061339b826134b5565b91506133a6836134b5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156133db576133da6135de565b5b828201905092915050565b60006133f1826134b5565b91506133fc836134b5565b92508261340c5761340b61360d565b5b828204905092915050565b6000613422826134b5565b915061342d836134b5565b9250828210156134405761343f6135de565b5b828203905092915050565b600061345682613495565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156134ec5780820151818401526020810190506134d1565b838111156134fb576000848401525b50505050565b6000600282049050600182168061351957607f821691505b6020821081141561352d5761352c61363c565b5b50919050565b61353c8261369a565b810181811067ffffffffffffffff8211171561355b5761355a61366b565b5b80604052505050565b600061356f826134b5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156135a2576135a16135de565b5b600182019050919050565b60006135b8826134b5565b91506135c3836134b5565b9250826135d3576135d261360d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4e6f204164647265737365730000000000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4d617820537570706c7900000000000000000000000000000000000000000000600082015250565b613bfc8161344b565b8114613c0757600080fd5b50565b613c138161345d565b8114613c1e57600080fd5b50565b613c2a81613469565b8114613c3557600080fd5b50565b613c41816134b5565b8114613c4c57600080fd5b5056fea2646970667358221220063d313d3bdf24b08ae87e79857357216d2f72de815b1aad58b278a1beb5755464736f6c63430008020033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c806370a08231116100de578063c87b56dd11610097578063d67b06c111610071578063d67b06c11461046d578063e985e9c514610489578063ecc448f8146104b9578063f2fde38b146104d75761018e565b8063c87b56dd14610415578063ca5c7b9114610445578063d5582965146104635761018e565b806370a0823114610367578063715018a6146103975780638da5cb5b146103a157806395d89b41146103bf578063a22cb465146103dd578063b88d4fde146103f95761018e565b806323b872dd1161014b57806342842e0e1161012557806342842e0e146102cf5780634f6ccce7146102eb57806355f804b31461031b5780636352211e146103375761018e565b806323b872dd146102675780632f745c591461028357806340d097c3146102b35761018e565b806301ffc9a71461019357806306fdde03146101c3578063081812fc146101e1578063095ea7b314610211578063109695231461022d57806318160ddd14610249575b600080fd5b6101ad60048036038101906101a89190612aef565b6104f3565b6040516101ba9190612fc2565b60405180910390f35b6101cb61056d565b6040516101d89190612fdd565b60405180910390f35b6101fb60048036038101906101f69190612b82565b6105ff565b6040516102089190612f5b565b60405180910390f35b61022b60048036038101906102269190612a72565b610684565b005b61024760048036038101906102429190612b41565b61079c565b005b610251610832565b60405161025e919061327f565b60405180910390f35b610281600480360381019061027c919061296c565b61083f565b005b61029d60048036038101906102989190612a72565b61089f565b6040516102aa919061327f565b60405180910390f35b6102cd60048036038101906102c89190612907565b610944565b005b6102e960048036038101906102e4919061296c565b610a2a565b005b61030560048036038101906103009190612b82565b610a4a565b604051610312919061327f565b60405180910390f35b61033560048036038101906103309190612b41565b610ae1565b005b610351600480360381019061034c9190612b82565b610b77565b60405161035e9190612f5b565b60405180910390f35b610381600480360381019061037c9190612907565b610c29565b60405161038e919061327f565b60405180910390f35b61039f610ce1565b005b6103a9610d69565b6040516103b69190612f5b565b60405180910390f35b6103c7610d93565b6040516103d49190612fdd565b60405180910390f35b6103f760048036038101906103f29190612a36565b610e25565b005b610413600480360381019061040e91906129bb565b610fa6565b005b61042f600480360381019061042a9190612b82565b611008565b60405161043c9190612fdd565b60405180910390f35b61044d6110af565b60405161045a9190612fc2565b60405180910390f35b61046b6110c2565b005b61048760048036038101906104829190612aae565b61115b565b005b6104a3600480360381019061049e9190612930565b6112e5565b6040516104b09190612fc2565b60405180910390f35b6104c1611379565b6040516104ce9190612fdd565b60405180910390f35b6104f160048036038101906104ec9190612907565b611407565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105665750610565826114ff565b5b9050919050565b60606000805461057c90613501565b80601f01602080910402602001604051908101604052809291908181526020018280546105a890613501565b80156105f55780601f106105ca576101008083540402835291602001916105f5565b820191906000526020600020905b8154815290600101906020018083116105d857829003601f168201915b5050505050905090565b600061060a826115e1565b610649576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106409061317f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061068f82610b77565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f7906131ff565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661071f61164d565b73ffffffffffffffffffffffffffffffffffffffff16148061074e575061074d8161074861164d565b6112e5565b5b61078d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610784906130df565b60405180910390fd5b6107978383611655565b505050565b6107a461164d565b73ffffffffffffffffffffffffffffffffffffffff166107c2610d69565b73ffffffffffffffffffffffffffffffffffffffff1614610818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080f9061319f565b60405180910390fd5b80600c908051906020019061082e929190612695565b5050565b6000600880549050905090565b61085061084a61164d565b8261170e565b61088f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108869061321f565b60405180910390fd5b61089a8383836117ec565b505050565b60006108aa83610c29565b82106108eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e290612fff565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61094c61164d565b73ffffffffffffffffffffffffffffffffffffffff1661096a610d69565b73ffffffffffffffffffffffffffffffffffffffff16146109c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b79061319f565b60405180910390fd5b60001515600d60009054906101000a900460ff16151514610a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0d9061325f565b60405180910390fd5b610a2781610a22610832565b611a48565b50565b610a4583838360405180602001604052806000815250610fa6565b505050565b6000610a54610832565b8210610a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8c9061323f565b60405180910390fd5b60088281548110610acf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610ae961164d565b73ffffffffffffffffffffffffffffffffffffffff16610b07610d69565b73ffffffffffffffffffffffffffffffffffffffff1614610b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b549061319f565b60405180910390fd5b80600b9080519060200190610b73929190612695565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c179061313f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c919061311f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ce961164d565b73ffffffffffffffffffffffffffffffffffffffff16610d07610d69565b73ffffffffffffffffffffffffffffffffffffffff1614610d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d549061319f565b60405180910390fd5b610d676000611a66565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610da290613501565b80601f0160208091040260200160405190810160405280929190818152602001828054610dce90613501565b8015610e1b5780601f10610df057610100808354040283529160200191610e1b565b820191906000526020600020905b815481529060010190602001808311610dfe57829003601f168201915b5050505050905090565b610e2d61164d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e929061309f565b60405180910390fd5b8060056000610ea861164d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610f5561164d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610f9a9190612fc2565b60405180910390a35050565b610fb7610fb161164d565b8361170e565b610ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fed9061321f565b60405180910390fd5b61100284848484611b2c565b50505050565b6060611013826115e1565b611052576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611049906131df565b60405180910390fd5b600061105c611b88565b9050600081511161107c57604051806020016040528060008152506110a7565b8061108684611c1a565b604051602001611097929190612f37565b6040516020818303038152906040525b915050919050565b600d60009054906101000a900460ff1681565b6110ca61164d565b73ffffffffffffffffffffffffffffffffffffffff166110e8610d69565b73ffffffffffffffffffffffffffffffffffffffff161461113e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111359061319f565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b61116361164d565b73ffffffffffffffffffffffffffffffffffffffff16611181610d69565b73ffffffffffffffffffffffffffffffffffffffff16146111d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce9061319f565b60405180910390fd5b60001515600d60009054906101000a900460ff1615151461122d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112249061325f565b60405180910390fd5b6000815111611271576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611268906130ff565b60405180910390fd5b60005b81518110156112e1576112ce8282815181106112b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516112c9610832565b611a48565b80806112d990613564565b915050611274565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c805461138690613501565b80601f01602080910402602001604051908101604052809291908181526020018280546113b290613501565b80156113ff5780601f106113d4576101008083540402835291602001916113ff565b820191906000526020600020905b8154815290600101906020018083116113e257829003601f168201915b505050505081565b61140f61164d565b73ffffffffffffffffffffffffffffffffffffffff1661142d610d69565b73ffffffffffffffffffffffffffffffffffffffff1614611483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147a9061319f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ea9061303f565b60405180910390fd5b6114fc81611a66565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806115ca57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806115da57506115d982611dc7565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166116c883610b77565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611719826115e1565b611758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174f906130bf565b60405180910390fd5b600061176383610b77565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806117d257508373ffffffffffffffffffffffffffffffffffffffff166117ba846105ff565b73ffffffffffffffffffffffffffffffffffffffff16145b806117e357506117e281856112e5565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661180c82610b77565b73ffffffffffffffffffffffffffffffffffffffff1614611862576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611859906131bf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c99061307f565b60405180910390fd5b6118dd838383611e31565b6118e8600082611655565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119389190613417565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461198f9190613390565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611a62828260405180602001604052806000815250611f45565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611b378484846117ec565b611b4384848484611fa0565b611b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b799061301f565b60405180910390fd5b50505050565b6060600b8054611b9790613501565b80601f0160208091040260200160405190810160405280929190818152602001828054611bc390613501565b8015611c105780601f10611be557610100808354040283529160200191611c10565b820191906000526020600020905b815481529060010190602001808311611bf357829003601f168201915b5050505050905090565b60606000821415611c62576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611dc2565b600082905060005b60008214611c94578080611c7d90613564565b915050600a82611c8d91906133e6565b9150611c6a565b60008167ffffffffffffffff811115611cd6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611d085781602001600182028036833780820191505090505b5090505b60008514611dbb57600182611d219190613417565b9150600a85611d3091906135ad565b6030611d3c9190613390565b60f81b818381518110611d78577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611db491906133e6565b9450611d0c565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611e3c838383612137565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e7f57611e7a8161213c565b611ebe565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611ebd57611ebc8382612185565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f0157611efc816122f2565b611f40565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611f3f57611f3e8282612435565b5b5b505050565b611f4f83836124b4565b611f5c6000848484611fa0565b611f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f929061301f565b60405180910390fd5b505050565b6000611fc18473ffffffffffffffffffffffffffffffffffffffff16612682565b1561212a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611fea61164d565b8786866040518563ffffffff1660e01b815260040161200c9493929190612f76565b602060405180830381600087803b15801561202657600080fd5b505af192505050801561205757506040513d601f19601f820116820180604052508101906120549190612b18565b60015b6120da573d8060008114612087576040519150601f19603f3d011682016040523d82523d6000602084013e61208c565b606091505b506000815114156120d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c99061301f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061212f565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161219284610c29565b61219c9190613417565b9050600060076000848152602001908152602001600020549050818114612281576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506123069190613417565b905060006009600084815260200190815260200160002054905060006008838154811061235c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106123a4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612419577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061244083610c29565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612524576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251b9061315f565b60405180910390fd5b61252d816115e1565b1561256d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125649061305f565b60405180910390fd5b61257960008383611e31565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125c99190613390565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546126a190613501565b90600052602060002090601f0160209004810192826126c3576000855561270a565b82601f106126dc57805160ff191683800117855561270a565b8280016001018555821561270a579182015b828111156127095782518255916020019190600101906126ee565b5b509050612717919061271b565b5090565b5b8082111561273457600081600090555060010161271c565b5090565b600061274b612746846132bf565b61329a565b9050808382526020820190508285602086028201111561276a57600080fd5b60005b8581101561279a57816127808882612820565b84526020840193506020830192505060018101905061276d565b5050509392505050565b60006127b76127b2846132eb565b61329a565b9050828152602081018484840111156127cf57600080fd5b6127da8482856134bf565b509392505050565b60006127f56127f08461331c565b61329a565b90508281526020810184848401111561280d57600080fd5b6128188482856134bf565b509392505050565b60008135905061282f81613bf3565b92915050565b600082601f83011261284657600080fd5b8135612856848260208601612738565b91505092915050565b60008135905061286e81613c0a565b92915050565b60008135905061288381613c21565b92915050565b60008151905061289881613c21565b92915050565b600082601f8301126128af57600080fd5b81356128bf8482602086016127a4565b91505092915050565b600082601f8301126128d957600080fd5b81356128e98482602086016127e2565b91505092915050565b60008135905061290181613c38565b92915050565b60006020828403121561291957600080fd5b600061292784828501612820565b91505092915050565b6000806040838503121561294357600080fd5b600061295185828601612820565b925050602061296285828601612820565b9150509250929050565b60008060006060848603121561298157600080fd5b600061298f86828701612820565b93505060206129a086828701612820565b92505060406129b1868287016128f2565b9150509250925092565b600080600080608085870312156129d157600080fd5b60006129df87828801612820565b94505060206129f087828801612820565b9350506040612a01878288016128f2565b925050606085013567ffffffffffffffff811115612a1e57600080fd5b612a2a8782880161289e565b91505092959194509250565b60008060408385031215612a4957600080fd5b6000612a5785828601612820565b9250506020612a688582860161285f565b9150509250929050565b60008060408385031215612a8557600080fd5b6000612a9385828601612820565b9250506020612aa4858286016128f2565b9150509250929050565b600060208284031215612ac057600080fd5b600082013567ffffffffffffffff811115612ada57600080fd5b612ae684828501612835565b91505092915050565b600060208284031215612b0157600080fd5b6000612b0f84828501612874565b91505092915050565b600060208284031215612b2a57600080fd5b6000612b3884828501612889565b91505092915050565b600060208284031215612b5357600080fd5b600082013567ffffffffffffffff811115612b6d57600080fd5b612b79848285016128c8565b91505092915050565b600060208284031215612b9457600080fd5b6000612ba2848285016128f2565b91505092915050565b612bb48161344b565b82525050565b612bc38161345d565b82525050565b6000612bd48261334d565b612bde8185613363565b9350612bee8185602086016134ce565b612bf78161369a565b840191505092915050565b6000612c0d82613358565b612c178185613374565b9350612c278185602086016134ce565b612c308161369a565b840191505092915050565b6000612c4682613358565b612c508185613385565b9350612c608185602086016134ce565b80840191505092915050565b6000612c79602b83613374565b9150612c84826136ab565b604082019050919050565b6000612c9c603283613374565b9150612ca7826136fa565b604082019050919050565b6000612cbf602683613374565b9150612cca82613749565b604082019050919050565b6000612ce2601c83613374565b9150612ced82613798565b602082019050919050565b6000612d05602483613374565b9150612d10826137c1565b604082019050919050565b6000612d28601983613374565b9150612d3382613810565b602082019050919050565b6000612d4b602c83613374565b9150612d5682613839565b604082019050919050565b6000612d6e603883613374565b9150612d7982613888565b604082019050919050565b6000612d91600c83613374565b9150612d9c826138d7565b602082019050919050565b6000612db4602a83613374565b9150612dbf82613900565b604082019050919050565b6000612dd7602983613374565b9150612de28261394f565b604082019050919050565b6000612dfa602083613374565b9150612e058261399e565b602082019050919050565b6000612e1d602c83613374565b9150612e28826139c7565b604082019050919050565b6000612e40602083613374565b9150612e4b82613a16565b602082019050919050565b6000612e63602983613374565b9150612e6e82613a3f565b604082019050919050565b6000612e86602f83613374565b9150612e9182613a8e565b604082019050919050565b6000612ea9602183613374565b9150612eb482613add565b604082019050919050565b6000612ecc603183613374565b9150612ed782613b2c565b604082019050919050565b6000612eef602c83613374565b9150612efa82613b7b565b604082019050919050565b6000612f12600a83613374565b9150612f1d82613bca565b602082019050919050565b612f31816134b5565b82525050565b6000612f438285612c3b565b9150612f4f8284612c3b565b91508190509392505050565b6000602082019050612f706000830184612bab565b92915050565b6000608082019050612f8b6000830187612bab565b612f986020830186612bab565b612fa56040830185612f28565b8181036060830152612fb78184612bc9565b905095945050505050565b6000602082019050612fd76000830184612bba565b92915050565b60006020820190508181036000830152612ff78184612c02565b905092915050565b6000602082019050818103600083015261301881612c6c565b9050919050565b6000602082019050818103600083015261303881612c8f565b9050919050565b6000602082019050818103600083015261305881612cb2565b9050919050565b6000602082019050818103600083015261307881612cd5565b9050919050565b6000602082019050818103600083015261309881612cf8565b9050919050565b600060208201905081810360008301526130b881612d1b565b9050919050565b600060208201905081810360008301526130d881612d3e565b9050919050565b600060208201905081810360008301526130f881612d61565b9050919050565b6000602082019050818103600083015261311881612d84565b9050919050565b6000602082019050818103600083015261313881612da7565b9050919050565b6000602082019050818103600083015261315881612dca565b9050919050565b6000602082019050818103600083015261317881612ded565b9050919050565b6000602082019050818103600083015261319881612e10565b9050919050565b600060208201905081810360008301526131b881612e33565b9050919050565b600060208201905081810360008301526131d881612e56565b9050919050565b600060208201905081810360008301526131f881612e79565b9050919050565b6000602082019050818103600083015261321881612e9c565b9050919050565b6000602082019050818103600083015261323881612ebf565b9050919050565b6000602082019050818103600083015261325881612ee2565b9050919050565b6000602082019050818103600083015261327881612f05565b9050919050565b60006020820190506132946000830184612f28565b92915050565b60006132a46132b5565b90506132b08282613533565b919050565b6000604051905090565b600067ffffffffffffffff8211156132da576132d961366b565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156133065761330561366b565b5b61330f8261369a565b9050602081019050919050565b600067ffffffffffffffff8211156133375761333661366b565b5b6133408261369a565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061339b826134b5565b91506133a6836134b5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156133db576133da6135de565b5b828201905092915050565b60006133f1826134b5565b91506133fc836134b5565b92508261340c5761340b61360d565b5b828204905092915050565b6000613422826134b5565b915061342d836134b5565b9250828210156134405761343f6135de565b5b828203905092915050565b600061345682613495565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156134ec5780820151818401526020810190506134d1565b838111156134fb576000848401525b50505050565b6000600282049050600182168061351957607f821691505b6020821081141561352d5761352c61363c565b5b50919050565b61353c8261369a565b810181811067ffffffffffffffff8211171561355b5761355a61366b565b5b80604052505050565b600061356f826134b5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156135a2576135a16135de565b5b600182019050919050565b60006135b8826134b5565b91506135c3836134b5565b9250826135d3576135d261360d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4e6f204164647265737365730000000000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4d617820537570706c7900000000000000000000000000000000000000000000600082015250565b613bfc8161344b565b8114613c0757600080fd5b50565b613c138161345d565b8114613c1e57600080fd5b50565b613c2a81613469565b8114613c3557600080fd5b50565b613c41816134b5565b8114613c4c57600080fd5b5056fea2646970667358221220063d313d3bdf24b08ae87e79857357216d2f72de815b1aad58b278a1beb5755464736f6c63430008020033

Deployed Bytecode Sourcemap

43067:1124:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36866:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24748:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26307:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25830:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43853:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37506:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27197:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37174:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43605:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27607:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37696:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44100:86;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24442:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24172:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2528:94;;;:::i;:::-;;1877:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24917:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26600:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27863:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25092:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43185:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43766:75;;;:::i;:::-;;43284:309;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26966:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43149:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2777:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36866:224;36968:4;37007:35;36992:50;;;:11;:50;;;;:90;;;;37046:36;37070:11;37046:23;:36::i;:::-;36992:90;36985:97;;36866:224;;;:::o;24748:100::-;24802:13;24835:5;24828:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24748:100;:::o;26307:221::-;26383:7;26411:16;26419:7;26411;:16::i;:::-;26403:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26496:15;:24;26512:7;26496:24;;;;;;;;;;;;;;;;;;;;;26489:31;;26307:221;;;:::o;25830:411::-;25911:13;25927:23;25942:7;25927:14;:23::i;:::-;25911:39;;25975:5;25969:11;;:2;:11;;;;25961:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26069:5;26053:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26078:37;26095:5;26102:12;:10;:12::i;:::-;26078:16;:37::i;:::-;26053:62;26031:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26212:21;26221:2;26225:7;26212:8;:21::i;:::-;25830:411;;;:::o;43853:125::-;2108:12;:10;:12::i;:::-;2097:23;;:7;:5;:7::i;:::-;:23;;;2089:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43956:14:::1;43938:15;:32;;;;;;;;;;;;:::i;:::-;;43853:125:::0;:::o;37506:113::-;37567:7;37594:10;:17;;;;37587:24;;37506:113;:::o;27197:339::-;27392:41;27411:12;:10;:12::i;:::-;27425:7;27392:18;:41::i;:::-;27384:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27500:28;27510:4;27516:2;27520:7;27500:9;:28::i;:::-;27197:339;;;:::o;37174:256::-;37271:7;37307:23;37324:5;37307:16;:23::i;:::-;37299:5;:31;37291:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37396:12;:19;37409:5;37396:19;;;;;;;;;;;;;;;:26;37416:5;37396:26;;;;;;;;;;;;37389:33;;37174:256;;;;:::o;43605:149::-;2108:12;:10;:12::i;:::-;2097:23;;:7;:5;:7::i;:::-;:23;;;2089:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43687:5:::1;43671:21;;:12;;;;;;;;;;;:21;;;43663:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;43718:28;43728:2;43732:13;:11;:13::i;:::-;43718:9;:28::i;:::-;43605:149:::0;:::o;27607:185::-;27745:39;27762:4;27768:2;27772:7;27745:39;;;;;;;;;;;;:16;:39::i;:::-;27607:185;;;:::o;37696:233::-;37771:7;37807:30;:28;:30::i;:::-;37799:5;:38;37791:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;37904:10;37915:5;37904:17;;;;;;;;;;;;;;;;;;;;;;;;37897:24;;37696:233;;;:::o;44100:86::-;2108:12;:10;:12::i;:::-;2097:23;;:7;:5;:7::i;:::-;:23;;;2089:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44175:3:::1;44165:7;:13;;;;;;;;;;;;:::i;:::-;;44100:86:::0;:::o;24442:239::-;24514:7;24534:13;24550:7;:16;24558:7;24550:16;;;;;;;;;;;;;;;;;;;;;24534:32;;24602:1;24585:19;;:5;:19;;;;24577:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24668:5;24661:12;;;24442:239;;;:::o;24172:208::-;24244:7;24289:1;24272:19;;:5;:19;;;;24264:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24356:9;:16;24366:5;24356:16;;;;;;;;;;;;;;;;24349:23;;24172:208;;;:::o;2528:94::-;2108:12;:10;:12::i;:::-;2097:23;;:7;:5;:7::i;:::-;:23;;;2089:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2593:21:::1;2611:1;2593:9;:21::i;:::-;2528:94::o:0;1877:87::-;1923:7;1950:6;;;;;;;;;;;1943:13;;1877:87;:::o;24917:104::-;24973:13;25006:7;24999:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24917:104;:::o;26600:295::-;26715:12;:10;:12::i;:::-;26703:24;;:8;:24;;;;26695:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;26815:8;26770:18;:32;26789:12;:10;:12::i;:::-;26770:32;;;;;;;;;;;;;;;:42;26803:8;26770:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;26868:8;26839:48;;26854:12;:10;:12::i;:::-;26839:48;;;26878:8;26839:48;;;;;;:::i;:::-;;;;;;;;26600:295;;:::o;27863:328::-;28038:41;28057:12;:10;:12::i;:::-;28071:7;28038:18;:41::i;:::-;28030:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28144:39;28158:4;28164:2;28168:7;28177:5;28144:13;:39::i;:::-;27863:328;;;;:::o;25092:334::-;25165:13;25199:16;25207:7;25199;:16::i;:::-;25191:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;25280:21;25304:10;:8;:10::i;:::-;25280:34;;25356:1;25338:7;25332:21;:25;:86;;;;;;;;;;;;;;;;;25384:7;25393:18;:7;:16;:18::i;:::-;25367:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25332:86;25325:93;;;25092:334;;;:::o;43185:32::-;;;;;;;;;;;;;:::o;43766:75::-;2108:12;:10;:12::i;:::-;2097:23;;:7;:5;:7::i;:::-;:23;;;2089:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43829:4:::1;43814:12;;:19;;;;;;;;;;;;;;;;;;43766:75::o:0;43284:309::-;2108:12;:10;:12::i;:::-;2097:23;;:7;:5;:7::i;:::-;:23;;;2089:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43384:5:::1;43368:21;;:12;;;;;;;;;;;:21;;;43360:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;43443:1;43423:10;:17;:21;43415:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;43477:9;43472:114;43496:10;:17;43492:1;:21;43472:114;;;43535:39;43545:10;43556:1;43545:13;;;;;;;;;;;;;;;;;;;;;;43560;:11;:13::i;:::-;43535:9;:39::i;:::-;43515:3;;;;;:::i;:::-;;;;43472:114;;;;43284:309:::0;:::o;26966:164::-;27063:4;27087:18;:25;27106:5;27087:25;;;;;;;;;;;;;;;:35;27113:8;27087:35;;;;;;;;;;;;;;;;;;;;;;;;;27080:42;;26966:164;;;;:::o;43149:29::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2777:192::-;2108:12;:10;:12::i;:::-;2097:23;;:7;:5;:7::i;:::-;:23;;;2089:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2886:1:::1;2866:22;;:8;:22;;;;2858:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2942:19;2952:8;2942:9;:19::i;:::-;2777:192:::0;:::o;23803:305::-;23905:4;23957:25;23942:40;;;:11;:40;;;;:105;;;;24014:33;23999:48;;;:11;:48;;;;23942:105;:158;;;;24064:36;24088:11;24064:23;:36::i;:::-;23942:158;23922:178;;23803:305;;;:::o;29701:127::-;29766:4;29818:1;29790:30;;:7;:16;29798:7;29790:16;;;;;;;;;;;;;;;;;;;;;:30;;;;29783:37;;29701:127;;;:::o;630:98::-;683:7;710:10;703:17;;630:98;:::o;33683:174::-;33785:2;33758:15;:24;33774:7;33758:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33841:7;33837:2;33803:46;;33812:23;33827:7;33812:14;:23::i;:::-;33803:46;;;;;;;;;;;;33683:174;;:::o;29995:348::-;30088:4;30113:16;30121:7;30113;:16::i;:::-;30105:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30189:13;30205:23;30220:7;30205:14;:23::i;:::-;30189:39;;30258:5;30247:16;;:7;:16;;;:51;;;;30291:7;30267:31;;:20;30279:7;30267:11;:20::i;:::-;:31;;;30247:51;:87;;;;30302:32;30319:5;30326:7;30302:16;:32::i;:::-;30247:87;30239:96;;;29995:348;;;;:::o;32987:578::-;33146:4;33119:31;;:23;33134:7;33119:14;:23::i;:::-;:31;;;33111:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33229:1;33215:16;;:2;:16;;;;33207:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33285:39;33306:4;33312:2;33316:7;33285:20;:39::i;:::-;33389:29;33406:1;33410:7;33389:8;:29::i;:::-;33450:1;33431:9;:15;33441:4;33431:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33479:1;33462:9;:13;33472:2;33462:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33510:2;33491:7;:16;33499:7;33491:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33549:7;33545:2;33530:27;;33539:4;33530:27;;;;;;;;;;;;32987:578;;;:::o;30685:110::-;30761:26;30771:2;30775:7;30761:26;;;;;;;;;;;;:9;:26::i;:::-;30685:110;;:::o;2977:173::-;3033:16;3052:6;;;;;;;;;;;3033:25;;3078:8;3069:6;;:17;;;;;;;;;;;;;;;;;;3133:8;3102:40;;3123:8;3102:40;;;;;;;;;;;;2977:173;;:::o;29073:315::-;29230:28;29240:4;29246:2;29250:7;29230:9;:28::i;:::-;29277:48;29300:4;29306:2;29310:7;29319:5;29277:22;:48::i;:::-;29269:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29073:315;;;;:::o;43990:98::-;44042:13;44073:7;44066:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43990:98;:::o;11107:723::-;11163:13;11393:1;11384:5;:10;11380:53;;;11411:10;;;;;;;;;;;;;;;;;;;;;11380:53;11443:12;11458:5;11443:20;;11474:14;11499:78;11514:1;11506:4;:9;11499:78;;11532:8;;;;;:::i;:::-;;;;11563:2;11555:10;;;;;:::i;:::-;;;11499:78;;;11587:19;11619:6;11609:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11587:39;;11637:154;11653:1;11644:5;:10;11637:154;;11681:1;11671:11;;;;;:::i;:::-;;;11748:2;11740:5;:10;;;;:::i;:::-;11727:2;:24;;;;:::i;:::-;11714:39;;11697:6;11704;11697:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;11777:2;11768:11;;;;;:::i;:::-;;;11637:154;;;11815:6;11801:21;;;;;11107:723;;;;:::o;10626:157::-;10711:4;10750:25;10735:40;;;:11;:40;;;;10728:47;;10626:157;;;:::o;38542:589::-;38686:45;38713:4;38719:2;38723:7;38686:26;:45::i;:::-;38764:1;38748:18;;:4;:18;;;38744:187;;;38783:40;38815:7;38783:31;:40::i;:::-;38744:187;;;38853:2;38845:10;;:4;:10;;;38841:90;;38872:47;38905:4;38911:7;38872:32;:47::i;:::-;38841:90;38744:187;38959:1;38945:16;;:2;:16;;;38941:183;;;38978:45;39015:7;38978:36;:45::i;:::-;38941:183;;;39051:4;39045:10;;:2;:10;;;39041:83;;39072:40;39100:2;39104:7;39072:27;:40::i;:::-;39041:83;38941:183;38542:589;;;:::o;31022:321::-;31152:18;31158:2;31162:7;31152:5;:18::i;:::-;31203:54;31234:1;31238:2;31242:7;31251:5;31203:22;:54::i;:::-;31181:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31022:321;;;:::o;34422:803::-;34577:4;34598:15;:2;:13;;;:15::i;:::-;34594:624;;;34650:2;34634:36;;;34671:12;:10;:12::i;:::-;34685:4;34691:7;34700:5;34634:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34630:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34897:1;34880:6;:13;:18;34876:272;;;34923:60;;;;;;;;;;:::i;:::-;;;;;;;;34876:272;35098:6;35092:13;35083:6;35079:2;35075:15;35068:38;34630:533;34767:45;;;34757:55;;;:6;:55;;;;34750:62;;;;;34594:624;35202:4;35195:11;;34422:803;;;;;;;:::o;35797:126::-;;;;:::o;39854:164::-;39958:10;:17;;;;39931:15;:24;39947:7;39931:24;;;;;;;;;;;:44;;;;39986:10;40002:7;39986:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39854:164;:::o;40645:988::-;40911:22;40961:1;40936:22;40953:4;40936:16;:22::i;:::-;:26;;;;:::i;:::-;40911:51;;40973:18;40994:17;:26;41012:7;40994:26;;;;;;;;;;;;40973:47;;41141:14;41127:10;:28;41123:328;;41172:19;41194:12;:18;41207:4;41194:18;;;;;;;;;;;;;;;:34;41213:14;41194:34;;;;;;;;;;;;41172:56;;41278:11;41245:12;:18;41258:4;41245:18;;;;;;;;;;;;;;;:30;41264:10;41245:30;;;;;;;;;;;:44;;;;41395:10;41362:17;:30;41380:11;41362:30;;;;;;;;;;;:43;;;;41123:328;;41547:17;:26;41565:7;41547:26;;;;;;;;;;;41540:33;;;41591:12;:18;41604:4;41591:18;;;;;;;;;;;;;;;:34;41610:14;41591:34;;;;;;;;;;;41584:41;;;40645:988;;;;:::o;41928:1079::-;42181:22;42226:1;42206:10;:17;;;;:21;;;;:::i;:::-;42181:46;;42238:18;42259:15;:24;42275:7;42259:24;;;;;;;;;;;;42238:45;;42610:19;42632:10;42643:14;42632:26;;;;;;;;;;;;;;;;;;;;;;;;42610:48;;42696:11;42671:10;42682;42671:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;42807:10;42776:15;:28;42792:11;42776:28;;;;;;;;;;;:41;;;;42948:15;:24;42964:7;42948:24;;;;;;;;;;;42941:31;;;42983:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41928:1079;;;;:::o;39432:221::-;39517:14;39534:20;39551:2;39534:16;:20::i;:::-;39517:37;;39592:7;39565:12;:16;39578:2;39565:16;;;;;;;;;;;;;;;:24;39582:6;39565:24;;;;;;;;;;;:34;;;;39639:6;39610:17;:26;39628:7;39610:26;;;;;;;;;;;:35;;;;39432:221;;;:::o;31679:382::-;31773:1;31759:16;;:2;:16;;;;31751:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;31832:16;31840:7;31832;:16::i;:::-;31831:17;31823:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31894:45;31923:1;31927:2;31931:7;31894:20;:45::i;:::-;31969:1;31952:9;:13;31962:2;31952:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32000:2;31981:7;:16;31989:7;31981:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32045:7;32041:2;32020:33;;32037:1;32020:33;;;;;;;;;;;;31679:382;;:::o;13642:387::-;13702:4;13910:12;13977:7;13965:20;13957:28;;14020:1;14013:4;:8;14006:15;;;13642:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:623:1:-;;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;274:6;267:5;260:21;300:4;293:5;289:16;282:23;;325:6;375:3;367:4;359:6;355:17;350:3;346:27;343:36;340:2;;;392:1;389;382:12;340:2;420:1;405:236;430:6;427:1;424:13;405:236;;;497:3;525:37;558:3;546:10;525:37;:::i;:::-;520:3;513:50;592:4;587:3;583:14;576:21;;626:4;621:3;617:14;610:21;;465:176;452:1;449;445:9;440:14;;405:236;;;409:14;126:521;;;;;;;:::o;653:343::-;;755:65;771:48;812:6;771:48;:::i;:::-;755:65;:::i;:::-;746:74;;843:6;836:5;829:21;881:4;874:5;870:16;919:3;910:6;905:3;901:16;898:25;895:2;;;936:1;933;926:12;895:2;949:41;983:6;978:3;973;949:41;:::i;:::-;736:260;;;;;;:::o;1002:345::-;;1105:66;1121:49;1163:6;1121:49;:::i;:::-;1105:66;:::i;:::-;1096:75;;1194:6;1187:5;1180:21;1232:4;1225:5;1221:16;1270:3;1261:6;1256:3;1252:16;1249:25;1246:2;;;1287:1;1284;1277:12;1246:2;1300:41;1334:6;1329:3;1324;1300:41;:::i;:::-;1086:261;;;;;;:::o;1353:139::-;;1437:6;1424:20;1415:29;;1453:33;1480:5;1453:33;:::i;:::-;1405:87;;;;:::o;1515:303::-;;1635:3;1628:4;1620:6;1616:17;1612:27;1602:2;;1653:1;1650;1643:12;1602:2;1693:6;1680:20;1718:94;1808:3;1800:6;1793:4;1785:6;1781:17;1718:94;:::i;:::-;1709:103;;1592:226;;;;;:::o;1824:133::-;;1905:6;1892:20;1883:29;;1921:30;1945:5;1921:30;:::i;:::-;1873:84;;;;:::o;1963:137::-;;2046:6;2033:20;2024:29;;2062:32;2088:5;2062:32;:::i;:::-;2014:86;;;;:::o;2106:141::-;;2193:6;2187:13;2178:22;;2209:32;2235:5;2209:32;:::i;:::-;2168:79;;;;:::o;2266:271::-;;2370:3;2363:4;2355:6;2351:17;2347:27;2337:2;;2388:1;2385;2378:12;2337:2;2428:6;2415:20;2453:78;2527:3;2519:6;2512:4;2504:6;2500:17;2453:78;:::i;:::-;2444:87;;2327:210;;;;;:::o;2557:273::-;;2662:3;2655:4;2647:6;2643:17;2639:27;2629:2;;2680:1;2677;2670:12;2629:2;2720:6;2707:20;2745:79;2820:3;2812:6;2805:4;2797:6;2793:17;2745:79;:::i;:::-;2736:88;;2619:211;;;;;:::o;2836:139::-;;2920:6;2907:20;2898:29;;2936:33;2963:5;2936:33;:::i;:::-;2888:87;;;;:::o;2981:262::-;;3089:2;3077:9;3068:7;3064:23;3060:32;3057:2;;;3105:1;3102;3095:12;3057:2;3148:1;3173:53;3218:7;3209:6;3198:9;3194:22;3173:53;:::i;:::-;3163:63;;3119:117;3047:196;;;;:::o;3249:407::-;;;3374:2;3362:9;3353:7;3349:23;3345:32;3342:2;;;3390:1;3387;3380:12;3342:2;3433:1;3458:53;3503:7;3494:6;3483:9;3479:22;3458:53;:::i;:::-;3448:63;;3404:117;3560:2;3586:53;3631:7;3622:6;3611:9;3607:22;3586:53;:::i;:::-;3576:63;;3531:118;3332:324;;;;;:::o;3662:552::-;;;;3804:2;3792:9;3783:7;3779:23;3775:32;3772:2;;;3820:1;3817;3810:12;3772:2;3863:1;3888:53;3933:7;3924:6;3913:9;3909:22;3888:53;:::i;:::-;3878:63;;3834:117;3990:2;4016:53;4061:7;4052:6;4041:9;4037:22;4016:53;:::i;:::-;4006:63;;3961:118;4118:2;4144:53;4189:7;4180:6;4169:9;4165:22;4144:53;:::i;:::-;4134:63;;4089:118;3762:452;;;;;:::o;4220:809::-;;;;;4388:3;4376:9;4367:7;4363:23;4359:33;4356:2;;;4405:1;4402;4395:12;4356:2;4448:1;4473:53;4518:7;4509:6;4498:9;4494:22;4473:53;:::i;:::-;4463:63;;4419:117;4575:2;4601:53;4646:7;4637:6;4626:9;4622:22;4601:53;:::i;:::-;4591:63;;4546:118;4703:2;4729:53;4774:7;4765:6;4754:9;4750:22;4729:53;:::i;:::-;4719:63;;4674:118;4859:2;4848:9;4844:18;4831:32;4890:18;4882:6;4879:30;4876:2;;;4922:1;4919;4912:12;4876:2;4950:62;5004:7;4995:6;4984:9;4980:22;4950:62;:::i;:::-;4940:72;;4802:220;4346:683;;;;;;;:::o;5035:401::-;;;5157:2;5145:9;5136:7;5132:23;5128:32;5125:2;;;5173:1;5170;5163:12;5125:2;5216:1;5241:53;5286:7;5277:6;5266:9;5262:22;5241:53;:::i;:::-;5231:63;;5187:117;5343:2;5369:50;5411:7;5402:6;5391:9;5387:22;5369:50;:::i;:::-;5359:60;;5314:115;5115:321;;;;;:::o;5442:407::-;;;5567:2;5555:9;5546:7;5542:23;5538:32;5535:2;;;5583:1;5580;5573:12;5535:2;5626:1;5651:53;5696:7;5687:6;5676:9;5672:22;5651:53;:::i;:::-;5641:63;;5597:117;5753:2;5779:53;5824:7;5815:6;5804:9;5800:22;5779:53;:::i;:::-;5769:63;;5724:118;5525:324;;;;;:::o;5855:405::-;;5988:2;5976:9;5967:7;5963:23;5959:32;5956:2;;;6004:1;6001;5994:12;5956:2;6075:1;6064:9;6060:17;6047:31;6105:18;6097:6;6094:30;6091:2;;;6137:1;6134;6127:12;6091:2;6165:78;6235:7;6226:6;6215:9;6211:22;6165:78;:::i;:::-;6155:88;;6018:235;5946:314;;;;:::o;6266:260::-;;6373:2;6361:9;6352:7;6348:23;6344:32;6341:2;;;6389:1;6386;6379:12;6341:2;6432:1;6457:52;6501:7;6492:6;6481:9;6477:22;6457:52;:::i;:::-;6447:62;;6403:116;6331:195;;;;:::o;6532:282::-;;6650:2;6638:9;6629:7;6625:23;6621:32;6618:2;;;6666:1;6663;6656:12;6618:2;6709:1;6734:63;6789:7;6780:6;6769:9;6765:22;6734:63;:::i;:::-;6724:73;;6680:127;6608:206;;;;:::o;6820:375::-;;6938:2;6926:9;6917:7;6913:23;6909:32;6906:2;;;6954:1;6951;6944:12;6906:2;7025:1;7014:9;7010:17;6997:31;7055:18;7047:6;7044:30;7041:2;;;7087:1;7084;7077:12;7041:2;7115:63;7170:7;7161:6;7150:9;7146:22;7115:63;:::i;:::-;7105:73;;6968:220;6896:299;;;;:::o;7201:262::-;;7309:2;7297:9;7288:7;7284:23;7280:32;7277:2;;;7325:1;7322;7315:12;7277:2;7368:1;7393:53;7438:7;7429:6;7418:9;7414:22;7393:53;:::i;:::-;7383:63;;7339:117;7267:196;;;;:::o;7469:118::-;7556:24;7574:5;7556:24;:::i;:::-;7551:3;7544:37;7534:53;;:::o;7593:109::-;7674:21;7689:5;7674:21;:::i;:::-;7669:3;7662:34;7652:50;;:::o;7708:360::-;;7822:38;7854:5;7822:38;:::i;:::-;7876:70;7939:6;7934:3;7876:70;:::i;:::-;7869:77;;7955:52;8000:6;7995:3;7988:4;7981:5;7977:16;7955:52;:::i;:::-;8032:29;8054:6;8032:29;:::i;:::-;8027:3;8023:39;8016:46;;7798:270;;;;;:::o;8074:364::-;;8190:39;8223:5;8190:39;:::i;:::-;8245:71;8309:6;8304:3;8245:71;:::i;:::-;8238:78;;8325:52;8370:6;8365:3;8358:4;8351:5;8347:16;8325:52;:::i;:::-;8402:29;8424:6;8402:29;:::i;:::-;8397:3;8393:39;8386:46;;8166:272;;;;;:::o;8444:377::-;;8578:39;8611:5;8578:39;:::i;:::-;8633:89;8715:6;8710:3;8633:89;:::i;:::-;8626:96;;8731:52;8776:6;8771:3;8764:4;8757:5;8753:16;8731:52;:::i;:::-;8808:6;8803:3;8799:16;8792:23;;8554:267;;;;;:::o;8827:366::-;;8990:67;9054:2;9049:3;8990:67;:::i;:::-;8983:74;;9066:93;9155:3;9066:93;:::i;:::-;9184:2;9179:3;9175:12;9168:19;;8973:220;;;:::o;9199:366::-;;9362:67;9426:2;9421:3;9362:67;:::i;:::-;9355:74;;9438:93;9527:3;9438:93;:::i;:::-;9556:2;9551:3;9547:12;9540:19;;9345:220;;;:::o;9571:366::-;;9734:67;9798:2;9793:3;9734:67;:::i;:::-;9727:74;;9810:93;9899:3;9810:93;:::i;:::-;9928:2;9923:3;9919:12;9912:19;;9717:220;;;:::o;9943:366::-;;10106:67;10170:2;10165:3;10106:67;:::i;:::-;10099:74;;10182:93;10271:3;10182:93;:::i;:::-;10300:2;10295:3;10291:12;10284:19;;10089:220;;;:::o;10315:366::-;;10478:67;10542:2;10537:3;10478:67;:::i;:::-;10471:74;;10554:93;10643:3;10554:93;:::i;:::-;10672:2;10667:3;10663:12;10656:19;;10461:220;;;:::o;10687:366::-;;10850:67;10914:2;10909:3;10850:67;:::i;:::-;10843:74;;10926:93;11015:3;10926:93;:::i;:::-;11044:2;11039:3;11035:12;11028:19;;10833:220;;;:::o;11059:366::-;;11222:67;11286:2;11281:3;11222:67;:::i;:::-;11215:74;;11298:93;11387:3;11298:93;:::i;:::-;11416:2;11411:3;11407:12;11400:19;;11205:220;;;:::o;11431:366::-;;11594:67;11658:2;11653:3;11594:67;:::i;:::-;11587:74;;11670:93;11759:3;11670:93;:::i;:::-;11788:2;11783:3;11779:12;11772:19;;11577:220;;;:::o;11803:366::-;;11966:67;12030:2;12025:3;11966:67;:::i;:::-;11959:74;;12042:93;12131:3;12042:93;:::i;:::-;12160:2;12155:3;12151:12;12144:19;;11949:220;;;:::o;12175:366::-;;12338:67;12402:2;12397:3;12338:67;:::i;:::-;12331:74;;12414:93;12503:3;12414:93;:::i;:::-;12532:2;12527:3;12523:12;12516:19;;12321:220;;;:::o;12547:366::-;;12710:67;12774:2;12769:3;12710:67;:::i;:::-;12703:74;;12786:93;12875:3;12786:93;:::i;:::-;12904:2;12899:3;12895:12;12888:19;;12693:220;;;:::o;12919:366::-;;13082:67;13146:2;13141:3;13082:67;:::i;:::-;13075:74;;13158:93;13247:3;13158:93;:::i;:::-;13276:2;13271:3;13267:12;13260:19;;13065:220;;;:::o;13291:366::-;;13454:67;13518:2;13513:3;13454:67;:::i;:::-;13447:74;;13530:93;13619:3;13530:93;:::i;:::-;13648:2;13643:3;13639:12;13632:19;;13437:220;;;:::o;13663:366::-;;13826:67;13890:2;13885:3;13826:67;:::i;:::-;13819:74;;13902:93;13991:3;13902:93;:::i;:::-;14020:2;14015:3;14011:12;14004:19;;13809:220;;;:::o;14035:366::-;;14198:67;14262:2;14257:3;14198:67;:::i;:::-;14191:74;;14274:93;14363:3;14274:93;:::i;:::-;14392:2;14387:3;14383:12;14376:19;;14181:220;;;:::o;14407:366::-;;14570:67;14634:2;14629:3;14570:67;:::i;:::-;14563:74;;14646:93;14735:3;14646:93;:::i;:::-;14764:2;14759:3;14755:12;14748:19;;14553:220;;;:::o;14779:366::-;;14942:67;15006:2;15001:3;14942:67;:::i;:::-;14935:74;;15018:93;15107:3;15018:93;:::i;:::-;15136:2;15131:3;15127:12;15120:19;;14925:220;;;:::o;15151:366::-;;15314:67;15378:2;15373:3;15314:67;:::i;:::-;15307:74;;15390:93;15479:3;15390:93;:::i;:::-;15508:2;15503:3;15499:12;15492:19;;15297:220;;;:::o;15523:366::-;;15686:67;15750:2;15745:3;15686:67;:::i;:::-;15679:74;;15762:93;15851:3;15762:93;:::i;:::-;15880:2;15875:3;15871:12;15864:19;;15669:220;;;:::o;15895:366::-;;16058:67;16122:2;16117:3;16058:67;:::i;:::-;16051:74;;16134:93;16223:3;16134:93;:::i;:::-;16252:2;16247:3;16243:12;16236:19;;16041:220;;;:::o;16267:118::-;16354:24;16372:5;16354:24;:::i;:::-;16349:3;16342:37;16332:53;;:::o;16391:435::-;;16593:95;16684:3;16675:6;16593:95;:::i;:::-;16586:102;;16705:95;16796:3;16787:6;16705:95;:::i;:::-;16698:102;;16817:3;16810:10;;16575:251;;;;;:::o;16832:222::-;;16963:2;16952:9;16948:18;16940:26;;16976:71;17044:1;17033:9;17029:17;17020:6;16976:71;:::i;:::-;16930:124;;;;:::o;17060:640::-;;17293:3;17282:9;17278:19;17270:27;;17307:71;17375:1;17364:9;17360:17;17351:6;17307:71;:::i;:::-;17388:72;17456:2;17445:9;17441:18;17432:6;17388:72;:::i;:::-;17470;17538:2;17527:9;17523:18;17514:6;17470:72;:::i;:::-;17589:9;17583:4;17579:20;17574:2;17563:9;17559:18;17552:48;17617:76;17688:4;17679:6;17617:76;:::i;:::-;17609:84;;17260:440;;;;;;;:::o;17706:210::-;;17831:2;17820:9;17816:18;17808:26;;17844:65;17906:1;17895:9;17891:17;17882:6;17844:65;:::i;:::-;17798:118;;;;:::o;17922:313::-;;18073:2;18062:9;18058:18;18050:26;;18122:9;18116:4;18112:20;18108:1;18097:9;18093:17;18086:47;18150:78;18223:4;18214:6;18150:78;:::i;:::-;18142:86;;18040:195;;;;:::o;18241:419::-;;18445:2;18434:9;18430:18;18422:26;;18494:9;18488:4;18484:20;18480:1;18469:9;18465:17;18458:47;18522:131;18648:4;18522:131;:::i;:::-;18514:139;;18412:248;;;:::o;18666:419::-;;18870:2;18859:9;18855:18;18847:26;;18919:9;18913:4;18909:20;18905:1;18894:9;18890:17;18883:47;18947:131;19073:4;18947:131;:::i;:::-;18939:139;;18837:248;;;:::o;19091:419::-;;19295:2;19284:9;19280:18;19272:26;;19344:9;19338:4;19334:20;19330:1;19319:9;19315:17;19308:47;19372:131;19498:4;19372:131;:::i;:::-;19364:139;;19262:248;;;:::o;19516:419::-;;19720:2;19709:9;19705:18;19697:26;;19769:9;19763:4;19759:20;19755:1;19744:9;19740:17;19733:47;19797:131;19923:4;19797:131;:::i;:::-;19789:139;;19687:248;;;:::o;19941:419::-;;20145:2;20134:9;20130:18;20122:26;;20194:9;20188:4;20184:20;20180:1;20169:9;20165:17;20158:47;20222:131;20348:4;20222:131;:::i;:::-;20214:139;;20112:248;;;:::o;20366:419::-;;20570:2;20559:9;20555:18;20547:26;;20619:9;20613:4;20609:20;20605:1;20594:9;20590:17;20583:47;20647:131;20773:4;20647:131;:::i;:::-;20639:139;;20537:248;;;:::o;20791:419::-;;20995:2;20984:9;20980:18;20972:26;;21044:9;21038:4;21034:20;21030:1;21019:9;21015:17;21008:47;21072:131;21198:4;21072:131;:::i;:::-;21064:139;;20962:248;;;:::o;21216:419::-;;21420:2;21409:9;21405:18;21397:26;;21469:9;21463:4;21459:20;21455:1;21444:9;21440:17;21433:47;21497:131;21623:4;21497:131;:::i;:::-;21489:139;;21387:248;;;:::o;21641:419::-;;21845:2;21834:9;21830:18;21822:26;;21894:9;21888:4;21884:20;21880:1;21869:9;21865:17;21858:47;21922:131;22048:4;21922:131;:::i;:::-;21914:139;;21812:248;;;:::o;22066:419::-;;22270:2;22259:9;22255:18;22247:26;;22319:9;22313:4;22309:20;22305:1;22294:9;22290:17;22283:47;22347:131;22473:4;22347:131;:::i;:::-;22339:139;;22237:248;;;:::o;22491:419::-;;22695:2;22684:9;22680:18;22672:26;;22744:9;22738:4;22734:20;22730:1;22719:9;22715:17;22708:47;22772:131;22898:4;22772:131;:::i;:::-;22764:139;;22662:248;;;:::o;22916:419::-;;23120:2;23109:9;23105:18;23097:26;;23169:9;23163:4;23159:20;23155:1;23144:9;23140:17;23133:47;23197:131;23323:4;23197:131;:::i;:::-;23189:139;;23087:248;;;:::o;23341:419::-;;23545:2;23534:9;23530:18;23522:26;;23594:9;23588:4;23584:20;23580:1;23569:9;23565:17;23558:47;23622:131;23748:4;23622:131;:::i;:::-;23614:139;;23512:248;;;:::o;23766:419::-;;23970:2;23959:9;23955:18;23947:26;;24019:9;24013:4;24009:20;24005:1;23994:9;23990:17;23983:47;24047:131;24173:4;24047:131;:::i;:::-;24039:139;;23937:248;;;:::o;24191:419::-;;24395:2;24384:9;24380:18;24372:26;;24444:9;24438:4;24434:20;24430:1;24419:9;24415:17;24408:47;24472:131;24598:4;24472:131;:::i;:::-;24464:139;;24362:248;;;:::o;24616:419::-;;24820:2;24809:9;24805:18;24797:26;;24869:9;24863:4;24859:20;24855:1;24844:9;24840:17;24833:47;24897:131;25023:4;24897:131;:::i;:::-;24889:139;;24787:248;;;:::o;25041:419::-;;25245:2;25234:9;25230:18;25222:26;;25294:9;25288:4;25284:20;25280:1;25269:9;25265:17;25258:47;25322:131;25448:4;25322:131;:::i;:::-;25314:139;;25212:248;;;:::o;25466:419::-;;25670:2;25659:9;25655:18;25647:26;;25719:9;25713:4;25709:20;25705:1;25694:9;25690:17;25683:47;25747:131;25873:4;25747:131;:::i;:::-;25739:139;;25637:248;;;:::o;25891:419::-;;26095:2;26084:9;26080:18;26072:26;;26144:9;26138:4;26134:20;26130:1;26119:9;26115:17;26108:47;26172:131;26298:4;26172:131;:::i;:::-;26164:139;;26062:248;;;:::o;26316:419::-;;26520:2;26509:9;26505:18;26497:26;;26569:9;26563:4;26559:20;26555:1;26544:9;26540:17;26533:47;26597:131;26723:4;26597:131;:::i;:::-;26589:139;;26487:248;;;:::o;26741:222::-;;26872:2;26861:9;26857:18;26849:26;;26885:71;26953:1;26942:9;26938:17;26929:6;26885:71;:::i;:::-;26839:124;;;;:::o;26969:129::-;;27030:20;;:::i;:::-;27020:30;;27059:33;27087:4;27079:6;27059:33;:::i;:::-;27010:88;;;:::o;27104:75::-;;27170:2;27164:9;27154:19;;27144:35;:::o;27185:311::-;;27352:18;27344:6;27341:30;27338:2;;;27374:18;;:::i;:::-;27338:2;27424:4;27416:6;27412:17;27404:25;;27484:4;27478;27474:15;27466:23;;27267:229;;;:::o;27502:307::-;;27653:18;27645:6;27642:30;27639:2;;;27675:18;;:::i;:::-;27639:2;27713:29;27735:6;27713:29;:::i;:::-;27705:37;;27797:4;27791;27787:15;27779:23;;27568:241;;;:::o;27815:308::-;;27967:18;27959:6;27956:30;27953:2;;;27989:18;;:::i;:::-;27953:2;28027:29;28049:6;28027:29;:::i;:::-;28019:37;;28111:4;28105;28101:15;28093:23;;27882:241;;;:::o;28129:98::-;;28214:5;28208:12;28198:22;;28187:40;;;:::o;28233:99::-;;28319:5;28313:12;28303:22;;28292:40;;;:::o;28338:168::-;;28455:6;28450:3;28443:19;28495:4;28490:3;28486:14;28471:29;;28433:73;;;;:::o;28512:169::-;;28630:6;28625:3;28618:19;28670:4;28665:3;28661:14;28646:29;;28608:73;;;;:::o;28687:148::-;;28826:3;28811:18;;28801:34;;;;:::o;28841:305::-;;28900:20;28918:1;28900:20;:::i;:::-;28895:25;;28934:20;28952:1;28934:20;:::i;:::-;28929:25;;29088:1;29020:66;29016:74;29013:1;29010:81;29007:2;;;29094:18;;:::i;:::-;29007:2;29138:1;29135;29131:9;29124:16;;28885:261;;;;:::o;29152:185::-;;29209:20;29227:1;29209:20;:::i;:::-;29204:25;;29243:20;29261:1;29243:20;:::i;:::-;29238:25;;29282:1;29272:2;;29287:18;;:::i;:::-;29272:2;29329:1;29326;29322:9;29317:14;;29194:143;;;;:::o;29343:191::-;;29403:20;29421:1;29403:20;:::i;:::-;29398:25;;29437:20;29455:1;29437:20;:::i;:::-;29432:25;;29476:1;29473;29470:8;29467:2;;;29481:18;;:::i;:::-;29467:2;29526:1;29523;29519:9;29511:17;;29388:146;;;;:::o;29540:96::-;;29606:24;29624:5;29606:24;:::i;:::-;29595:35;;29585:51;;;:::o;29642:90::-;;29719:5;29712:13;29705:21;29694:32;;29684:48;;;:::o;29738:149::-;;29814:66;29807:5;29803:78;29792:89;;29782:105;;;:::o;29893:126::-;;29970:42;29963:5;29959:54;29948:65;;29938:81;;;:::o;30025:77::-;;30091:5;30080:16;;30070:32;;;:::o;30108:154::-;30192:6;30187:3;30182;30169:30;30254:1;30245:6;30240:3;30236:16;30229:27;30159:103;;;:::o;30268:307::-;30336:1;30346:113;30360:6;30357:1;30354:13;30346:113;;;30445:1;30440:3;30436:11;30430:18;30426:1;30421:3;30417:11;30410:39;30382:2;30379:1;30375:10;30370:15;;30346:113;;;30477:6;30474:1;30471:13;30468:2;;;30557:1;30548:6;30543:3;30539:16;30532:27;30468:2;30317:258;;;;:::o;30581:320::-;;30662:1;30656:4;30652:12;30642:22;;30709:1;30703:4;30699:12;30730:18;30720:2;;30786:4;30778:6;30774:17;30764:27;;30720:2;30848;30840:6;30837:14;30817:18;30814:38;30811:2;;;30867:18;;:::i;:::-;30811:2;30632:269;;;;:::o;30907:281::-;30990:27;31012:4;30990:27;:::i;:::-;30982:6;30978:40;31120:6;31108:10;31105:22;31084:18;31072:10;31069:34;31066:62;31063:2;;;31131:18;;:::i;:::-;31063:2;31171:10;31167:2;31160:22;30950:238;;;:::o;31194:233::-;;31256:24;31274:5;31256:24;:::i;:::-;31247:33;;31302:66;31295:5;31292:77;31289:2;;;31372:18;;:::i;:::-;31289:2;31419:1;31412:5;31408:13;31401:20;;31237:190;;;:::o;31433:176::-;;31482:20;31500:1;31482:20;:::i;:::-;31477:25;;31516:20;31534:1;31516:20;:::i;:::-;31511:25;;31555:1;31545:2;;31560:18;;:::i;:::-;31545:2;31601:1;31598;31594:9;31589:14;;31467:142;;;;:::o;31615:180::-;31663:77;31660:1;31653:88;31760:4;31757:1;31750:15;31784:4;31781:1;31774:15;31801:180;31849:77;31846:1;31839:88;31946:4;31943:1;31936:15;31970:4;31967:1;31960:15;31987:180;32035:77;32032:1;32025:88;32132:4;32129:1;32122:15;32156:4;32153:1;32146:15;32173:180;32221:77;32218:1;32211:88;32318:4;32315:1;32308:15;32342:4;32339:1;32332:15;32359:102;;32451:2;32447:7;32442:2;32435:5;32431:14;32427:28;32417:38;;32407:54;;;:::o;32467:230::-;32607:34;32603:1;32595:6;32591:14;32584:58;32676:13;32671:2;32663:6;32659:15;32652:38;32573:124;:::o;32703:237::-;32843:34;32839:1;32831:6;32827:14;32820:58;32912:20;32907:2;32899:6;32895:15;32888:45;32809:131;:::o;32946:225::-;33086:34;33082:1;33074:6;33070:14;33063:58;33155:8;33150:2;33142:6;33138:15;33131:33;33052:119;:::o;33177:178::-;33317:30;33313:1;33305:6;33301:14;33294:54;33283:72;:::o;33361:223::-;33501:34;33497:1;33489:6;33485:14;33478:58;33570:6;33565:2;33557:6;33553:15;33546:31;33467:117;:::o;33590:175::-;33730:27;33726:1;33718:6;33714:14;33707:51;33696:69;:::o;33771:231::-;33911:34;33907:1;33899:6;33895:14;33888:58;33980:14;33975:2;33967:6;33963:15;33956:39;33877:125;:::o;34008:243::-;34148:34;34144:1;34136:6;34132:14;34125:58;34217:26;34212:2;34204:6;34200:15;34193:51;34114:137;:::o;34257:162::-;34397:14;34393:1;34385:6;34381:14;34374:38;34363:56;:::o;34425:229::-;34565:34;34561:1;34553:6;34549:14;34542:58;34634:12;34629:2;34621:6;34617:15;34610:37;34531:123;:::o;34660:228::-;34800:34;34796:1;34788:6;34784:14;34777:58;34869:11;34864:2;34856:6;34852:15;34845:36;34766:122;:::o;34894:182::-;35034:34;35030:1;35022:6;35018:14;35011:58;35000:76;:::o;35082:231::-;35222:34;35218:1;35210:6;35206:14;35199:58;35291:14;35286:2;35278:6;35274:15;35267:39;35188:125;:::o;35319:182::-;35459:34;35455:1;35447:6;35443:14;35436:58;35425:76;:::o;35507:228::-;35647:34;35643:1;35635:6;35631:14;35624:58;35716:11;35711:2;35703:6;35699:15;35692:36;35613:122;:::o;35741:234::-;35881:34;35877:1;35869:6;35865:14;35858:58;35950:17;35945:2;35937:6;35933:15;35926:42;35847:128;:::o;35981:220::-;36121:34;36117:1;36109:6;36105:14;36098:58;36190:3;36185:2;36177:6;36173:15;36166:28;36087:114;:::o;36207:236::-;36347:34;36343:1;36335:6;36331:14;36324:58;36416:19;36411:2;36403:6;36399:15;36392:44;36313:130;:::o;36449:231::-;36589:34;36585:1;36577:6;36573:14;36566:58;36658:14;36653:2;36645:6;36641:15;36634:39;36555:125;:::o;36686:160::-;36826:12;36822:1;36814:6;36810:14;36803:36;36792:54;:::o;36852:122::-;36925:24;36943:5;36925:24;:::i;:::-;36918:5;36915:35;36905:2;;36964:1;36961;36954:12;36905:2;36895:79;:::o;36980:116::-;37050:21;37065:5;37050:21;:::i;:::-;37043:5;37040:32;37030:2;;37086:1;37083;37076:12;37030:2;37020:76;:::o;37102:120::-;37174:23;37191:5;37174:23;:::i;:::-;37167:5;37164:34;37154:2;;37212:1;37209;37202:12;37154:2;37144:78;:::o;37228:122::-;37301:24;37319:5;37301:24;:::i;:::-;37294:5;37291:35;37281:2;;37340:1;37337;37330:12;37281:2;37271:79;:::o

Swarm Source

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