ETH Price: $2,460.17 (+0.61%)

Token

CryptoGorfeld (CG)
 

Overview

Max Total Supply

281 CG

Holders

126

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
vols52bama49.eth
Balance
2 CG
0x55fc3E5EB344968BFb5A079628EdDE58b9e6eF71
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:
CryptoGorfeld

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-27
*/

/**
  _____                      __          
 / ___/  ____  __ __   ___  / /_ ___     
/ /__   / __/ / // /  / _ \/ __// _ \    
\___/  /_/    \_, /  / .__/\__/ \___/    
             /___/  /_/                  
  _____              ___        __     __
 / ___/ ___   ____  / _/ ___   / / ___/ /
/ (_ / / _ \ / __/ / _/ / -_) / / / _  / 
\___/  \___//_/   /_/   \__/ /_/  \_,_/  
                                         
 */

// SPDX-License-Identifier: MIT
// File: https://github.com/ProjectOpenSea/operator-filter-registry/blob/529cceeda9f5f8e28812c20042cc57626f784718/src/IOperatorFilterRegistry.sol


pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

// File: https://github.com/ProjectOpenSea/operator-filter-registry/blob/529cceeda9f5f8e28812c20042cc57626f784718/src/OperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
        _;
    }
}

// File: https://github.com/ProjectOpenSea/operator-filter-registry/blob/529cceeda9f5f8e28812c20042cc57626f784718/src/DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of ERC721A.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the
     * ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // =============================================================
    //                            IERC721
    // =============================================================

    /**
     * @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,
        bytes calldata data
    ) external payable;

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    /**
     * @dev Transfers `tokenId` 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 payable;

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

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

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

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

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

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

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev Interface of ERC721 token receiver.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant _BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view virtual returns (uint256) {
        // Counter underflow is impossible as `_currentIndex` does not decrement,
        // and it is initialized to `_startTokenId()`.
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

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

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }

    /**
     * @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, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @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) public payable virtual override {
        address owner = ownerOf(tokenId);

        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

    /**
     * @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. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @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 memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token IDs
     * are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token IDs
     * have been transferred. This includes minting.
     * And also called after one token has been burned.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns whether the call correctly returned the expected magic value.
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

            // Cache the end of the memory to calculate the length later.
            let end := str

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

// File: contracts/NFT.sol


pragma solidity ^0.8.15;


contract CryptoGorfeld is ERC721A, DefaultOperatorFilterer, Ownable {

    mapping (address => bool) public minterAddress;
    bool public mintIsOpen;
    string public baseURI = "ipfs://bafybeihjybff6yeiybfn4s6du3leiuoxly4m453ncgwfrvc6icjnnptftq/";  
    string public baseExtension = ".json";
    uint256 public price = 0.0025 ether;
    uint256 public maxSupply = 1000;
    uint256 public maxPerTransaction = 10; 
    uint256 public MAX_FREE = 800; 
    uint256 public MAX_FREE_PER_WALLET = 2; 

    constructor () ERC721A("CryptoGorfeld", "CG") {
        mintIsOpen = true;
    }

    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }

    // Mint
    function Mint(uint256 amount) external payable
    {
        require(mintIsOpen , "Minting Not Open Yet !");
        require(amount <= maxPerTransaction, "10 Max Per Transaction!");
        require(totalSupply() + amount <= maxSupply,"Soldout!");
        require(msg.value >= amount * price,"Insufficient Funds!");
        _safeMint(msg.sender, amount);
    }

    function freeMint() external{
        uint256 amount = 1;

        require(totalSupply() + amount <= MAX_FREE, "Freemint Sold Out");
        require(amount + _numberMinted(msg.sender) <= MAX_FREE_PER_WALLET, "Max 2 per Wallet");

        _mint(msg.sender, amount);
    }

    function airdropToken(uint256[] calldata amount, address[] calldata owners) public onlyOwner {
        for(uint256 i = 0; i < owners.length; ++i) {            
            _safeMint(owners[i], amount[i]); // Minting of the token
        }
    }

    /////////////////////////////
    // CONTRACT MANAGEMENT 
    /////////////////////////////

    function toggleMint() public onlyOwner {
        mintIsOpen = !mintIsOpen;
    }

    function setPrice(uint256 newPrice) public onlyOwner {
        price = newPrice;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    function withdrawFunds() public onlyOwner {
		payable(msg.sender).transfer(address(this).balance);
        
	}
    
    function setBaseURI(string memory baseURI_) external onlyOwner {
        baseURI = baseURI_;
    } 

    /////////////////////////////
    // OPENSEA FILTER REGISTRY 
    /////////////////////////////

    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public payable override onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
    }

    function transferFrom(address from, address to, uint256 tokenId) public payable override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public payable override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        payable
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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":"MAX_FREE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FREE_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"amount","type":"uint256[]"},{"internalType":"address[]","name":"owners","type":"address[]"}],"name":"airdropToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMint","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":"maxPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintIsOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minterAddress","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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","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":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","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":[],"name":"toggleMint","outputs":[],"stateMutability":"nonpayable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180608001604052806043815260200162003ff860439139600b90816200002e9190620006ed565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c9081620000759190620006ed565b506608e1bc9bf04000600d556103e8600e55600a600f556103206010556002601155348015620000a457600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600d81526020017f43727970746f476f7266656c64000000000000000000000000000000000000008152506040518060400160405280600281526020017f43470000000000000000000000000000000000000000000000000000000000008152508160029081620001399190620006ed565b5080600390816200014b9190620006ed565b506200015c6200039c60201b60201c565b600081905550505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003595780156200021f576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001e592919062000819565b600060405180830381600087803b1580156200020057600080fd5b505af115801562000215573d6000803e3d6000fd5b5050505062000358565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002d9576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200029f92919062000819565b600060405180830381600087803b158015620002ba57600080fd5b505af1158015620002cf573d6000803e3d6000fd5b5050505062000357565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000322919062000846565b600060405180830381600087803b1580156200033d57600080fd5b505af115801562000352573d6000803e3d6000fd5b505050505b5b5b50506200037b6200036f620003a560201b60201c565b620003ad60201b60201c565b6001600a60006101000a81548160ff02191690831515021790555062000863565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004f557607f821691505b6020821081036200050b576200050a620004ad565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005757fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000536565b62000581868362000536565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005ce620005c8620005c28462000599565b620005a3565b62000599565b9050919050565b6000819050919050565b620005ea83620005ad565b62000602620005f982620005d5565b84845462000543565b825550505050565b600090565b620006196200060a565b62000626818484620005df565b505050565b5b818110156200064e57620006426000826200060f565b6001810190506200062c565b5050565b601f8211156200069d57620006678162000511565b620006728462000526565b8101602085101562000682578190505b6200069a620006918562000526565b8301826200062b565b50505b505050565b600082821c905092915050565b6000620006c260001984600802620006a2565b1980831691505092915050565b6000620006dd8383620006af565b9150826002028217905092915050565b620006f88262000473565b67ffffffffffffffff8111156200071457620007136200047e565b5b620007208254620004dc565b6200072d82828562000652565b600060209050601f83116001811462000765576000841562000750578287015190505b6200075c8582620006cf565b865550620007cc565b601f198416620007758662000511565b60005b828110156200079f5784890151825560018201915060208501945060208101905062000778565b86831015620007bf5784890151620007bb601f891682620006af565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200080182620007d4565b9050919050565b6200081381620007f4565b82525050565b600060408201905062000830600083018562000808565b6200083f602083018462000808565b9392505050565b60006020820190506200085d600083018462000808565b92915050565b61378580620008736000396000f3fe6080604052600436106101f95760003560e01c8063715018a61161010d578063aa1152ab116100a0578063d3dd5fe01161006f578063d3dd5fe0146106ba578063d5abeb01146106d1578063e985e9c5146106fc578063ed6661c214610739578063f2fde38b14610764576101f9565b8063aa1152ab1461060b578063b88d4fde14610636578063c668286214610652578063c87b56dd1461067d576101f9565b806395d89b41116100dc57806395d89b411461056157806398710d1e1461058c578063a035b1fe146105b7578063a22cb465146105e2576101f9565b8063715018a6146104cd57806379ff6fee146104e45780638da5cb5b1461050d57806391b7f5ed14610538576101f9565b806324600fc31161019057806355f804b31161015f57806355f804b3146103e85780635b70ea9f146104115780636352211e146104285780636c0360eb1461046557806370a0823114610490576101f9565b806324600fc31461035f57806341f434341461037657806342842e0e146103a15780634b980d67146103bd576101f9565b8063095ea7b3116101cc578063095ea7b3146102bf57806318160ddd146102db57806322ae7f7b1461030657806323b872dd14610343576101f9565b806301ffc9a7146101fe57806306fdde031461023b5780630788370314610266578063081812fc14610282575b600080fd5b34801561020a57600080fd5b506102256004803603810190610220919061262a565b61078d565b6040516102329190612672565b60405180910390f35b34801561024757600080fd5b5061025061081f565b60405161025d919061271d565b60405180910390f35b610280600480360381019061027b9190612775565b6108b1565b005b34801561028e57600080fd5b506102a960048036038101906102a49190612775565b6109f9565b6040516102b691906127e3565b60405180910390f35b6102d960048036038101906102d4919061282a565b610a78565b005b3480156102e757600080fd5b506102f0610b82565b6040516102fd9190612879565b60405180910390f35b34801561031257600080fd5b5061032d60048036038101906103289190612894565b610b99565b60405161033a9190612672565b60405180910390f35b61035d600480360381019061035891906128c1565b610bb9565b005b34801561036b57600080fd5b50610374610d09565b005b34801561038257600080fd5b5061038b610d5a565b6040516103989190612973565b60405180910390f35b6103bb60048036038101906103b691906128c1565b610d6c565b005b3480156103c957600080fd5b506103d2610ebc565b6040516103df9190612879565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a9190612ac3565b610ec2565b005b34801561041d57600080fd5b50610426610edd565b005b34801561043457600080fd5b5061044f600480360381019061044a9190612775565b610f9f565b60405161045c91906127e3565b60405180910390f35b34801561047157600080fd5b5061047a610fb1565b604051610487919061271d565b60405180910390f35b34801561049c57600080fd5b506104b760048036038101906104b29190612894565b61103f565b6040516104c49190612879565b60405180910390f35b3480156104d957600080fd5b506104e26110f7565b005b3480156104f057600080fd5b5061050b60048036038101906105069190612bc2565b61110b565b005b34801561051957600080fd5b50610522611183565b60405161052f91906127e3565b60405180910390f35b34801561054457600080fd5b5061055f600480360381019061055a9190612775565b6111ad565b005b34801561056d57600080fd5b506105766111bf565b604051610583919061271d565b60405180910390f35b34801561059857600080fd5b506105a1611251565b6040516105ae9190612879565b60405180910390f35b3480156105c357600080fd5b506105cc611257565b6040516105d99190612879565b60405180910390f35b3480156105ee57600080fd5b5061060960048036038101906106049190612c6f565b61125d565b005b34801561061757600080fd5b50610620611367565b60405161062d9190612672565b60405180910390f35b610650600480360381019061064b9190612d50565b61137a565b005b34801561065e57600080fd5b506106676114cd565b604051610674919061271d565b60405180910390f35b34801561068957600080fd5b506106a4600480360381019061069f9190612775565b61155b565b6040516106b1919061271d565b60405180910390f35b3480156106c657600080fd5b506106cf6115f9565b005b3480156106dd57600080fd5b506106e661162d565b6040516106f39190612879565b60405180910390f35b34801561070857600080fd5b50610723600480360381019061071e9190612dd3565b611633565b6040516107309190612672565b60405180910390f35b34801561074557600080fd5b5061074e6116c7565b60405161075b9190612879565b60405180910390f35b34801561077057600080fd5b5061078b60048036038101906107869190612894565b6116cd565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107e857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108185750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461082e90612e42565b80601f016020809104026020016040519081016040528092919081815260200182805461085a90612e42565b80156108a75780601f1061087c576101008083540402835291602001916108a7565b820191906000526020600020905b81548152906001019060200180831161088a57829003601f168201915b5050505050905090565b600a60009054906101000a900460ff16610900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f790612ebf565b60405180910390fd5b600f54811115610945576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093c90612f2b565b60405180910390fd5b600e5481610951610b82565b61095b9190612f7a565b111561099c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099390612ffa565b60405180910390fd5b600d54816109aa919061301a565b3410156109ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e3906130c0565b60405180910390fd5b6109f63382611750565b50565b6000610a048261176e565b610a3a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610b73576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610af09291906130e0565b602060405180830381865afa158015610b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b31919061311e565b610b7257806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610b6991906127e3565b60405180910390fd5b5b610b7d83836117cd565b505050565b6000610b8c611911565b6001546000540303905090565b60096020528060005260406000206000915054906101000a900460ff1681565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610cf7573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c2b57610c2684848461191a565b610d03565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610c749291906130e0565b602060405180830381865afa158015610c91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb5919061311e565b610cf657336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610ced91906127e3565b60405180910390fd5b5b610d0284848461191a565b5b50505050565b610d11611c3c565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d57573d6000803e3d6000fd5b50565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610eaa573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610dde57610dd9848484611cba565b610eb6565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610e279291906130e0565b602060405180830381865afa158015610e44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e68919061311e565b610ea957336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610ea091906127e3565b60405180910390fd5b5b610eb5848484611cba565b5b50505050565b600f5481565b610eca611c3c565b80600b9081610ed991906132ed565b5050565b60006001905060105481610eef610b82565b610ef99190612f7a565b1115610f3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f319061340b565b60405180910390fd5b601154610f4633611cda565b82610f519190612f7a565b1115610f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8990613477565b60405180910390fd5b610f9c3382611d31565b50565b6000610faa82611eec565b9050919050565b600b8054610fbe90612e42565b80601f0160208091040260200160405190810160405280929190818152602001828054610fea90612e42565b80156110375780601f1061100c57610100808354040283529160200191611037565b820191906000526020600020905b81548152906001019060200180831161101a57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110a6576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6110ff611c3c565b6111096000611fb8565b565b611113611c3c565b60005b8282905081101561117c5761116b83838381811061113757611136613497565b5b905060200201602081019061114c9190612894565b86868481811061115f5761115e613497565b5b90506020020135611750565b80611175906134c6565b9050611116565b5050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6111b5611c3c565b80600d8190555050565b6060600380546111ce90612e42565b80601f01602080910402602001604051908101604052809291908181526020018280546111fa90612e42565b80156112475780601f1061121c57610100808354040283529160200191611247565b820191906000526020600020905b81548152906001019060200180831161122a57829003601f168201915b5050505050905090565b60115481565b600d5481565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611358576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016112d59291906130e0565b602060405180830381865afa1580156112f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611316919061311e565b61135757806040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161134e91906127e3565b60405180910390fd5b5b611362838361207e565b505050565b600a60009054906101000a900460ff1681565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156114b9573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113ed576113e885858585612189565b6114c6565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016114369291906130e0565b602060405180830381865afa158015611453573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611477919061311e565b6114b857336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016114af91906127e3565b60405180910390fd5b5b6114c585858585612189565b5b5050505050565b600c80546114da90612e42565b80601f016020809104026020016040519081016040528092919081815260200182805461150690612e42565b80156115535780601f1061152857610100808354040283529160200191611553565b820191906000526020600020905b81548152906001019060200180831161153657829003601f168201915b505050505081565b60606115668261176e565b61159c576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006115a66121fc565b905060008151036115c657604051806020016040528060008152506115f1565b806115d08461228e565b6040516020016115e192919061354a565b6040516020818303038152906040525b915050919050565b611601611c3c565b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b600e5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60105481565b6116d5611c3c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173b906135e0565b60405180910390fd5b61174d81611fb8565b50565b61176a8282604051806020016040528060008152506122de565b5050565b600081611779611911565b11158015611788575060005482105b80156117c6575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006117d882610f9f565b90508073ffffffffffffffffffffffffffffffffffffffff166117f961237b565b73ffffffffffffffffffffffffffffffffffffffff161461185c576118258161182061237b565b611633565b61185b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061192582611eec565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461198c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061199884612383565b915091506119ae81876119a961237b565b6123aa565b6119fa576119c3866119be61237b565b611633565b6119f9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611a60576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a6d86868660016123ee565b8015611a7857600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611b4685611b228888876123f4565b7c02000000000000000000000000000000000000000000000000000000001761241c565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611bcc5760006001850190506000600460008381526020019081526020016000205403611bca576000548114611bc9578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c348686866001612447565b505050505050565b611c4461244d565b73ffffffffffffffffffffffffffffffffffffffff16611c62611183565b73ffffffffffffffffffffffffffffffffffffffff1614611cb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611caf9061364c565b60405180910390fd5b565b611cd58383836040518060200160405280600081525061137a565b505050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60008054905060008203611d71576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d7e60008483856123ee565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611df583611de660008660006123f4565b611def85612455565b1761241c565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611e9657808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611e5b565b5060008203611ed1576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611ee76000848385612447565b505050565b60008082905080611efb611911565b11611f8157600054811015611f805760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611f7e575b60008103611f74576004600083600190039350838152602001908152602001600020549050611f4a565b8092505050611fb3565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b806007600061208b61237b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661213861237b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161217d9190612672565b60405180910390a35050565b612194848484610bb9565b60008373ffffffffffffffffffffffffffffffffffffffff163b146121f6576121bf84848484612465565b6121f5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600b805461220b90612e42565b80601f016020809104026020016040519081016040528092919081815260200182805461223790612e42565b80156122845780601f1061225957610100808354040283529160200191612284565b820191906000526020600020905b81548152906001019060200180831161226757829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b6001156122c957600184039350600a81066030018453600a81049050806122a7575b50828103602084039350808452505050919050565b6122e88383611d31565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461237657600080549050600083820390505b6123286000868380600101945086612465565b61235e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061231557816000541461237357600080fd5b50505b505050565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861240b8686846125b5565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b60006001821460e11b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261248b61237b565b8786866040518563ffffffff1660e01b81526004016124ad94939291906136c1565b6020604051808303816000875af19250505080156124e957506040513d601f19601f820116820180604052508101906124e69190613722565b60015b612562573d8060008114612519576040519150601f19603f3d011682016040523d82523d6000602084013e61251e565b606091505b50600081510361255a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612607816125d2565b811461261257600080fd5b50565b600081359050612624816125fe565b92915050565b6000602082840312156126405761263f6125c8565b5b600061264e84828501612615565b91505092915050565b60008115159050919050565b61266c81612657565b82525050565b60006020820190506126876000830184612663565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156126c75780820151818401526020810190506126ac565b60008484015250505050565b6000601f19601f8301169050919050565b60006126ef8261268d565b6126f98185612698565b93506127098185602086016126a9565b612712816126d3565b840191505092915050565b6000602082019050818103600083015261273781846126e4565b905092915050565b6000819050919050565b6127528161273f565b811461275d57600080fd5b50565b60008135905061276f81612749565b92915050565b60006020828403121561278b5761278a6125c8565b5b600061279984828501612760565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127cd826127a2565b9050919050565b6127dd816127c2565b82525050565b60006020820190506127f860008301846127d4565b92915050565b612807816127c2565b811461281257600080fd5b50565b600081359050612824816127fe565b92915050565b60008060408385031215612841576128406125c8565b5b600061284f85828601612815565b925050602061286085828601612760565b9150509250929050565b6128738161273f565b82525050565b600060208201905061288e600083018461286a565b92915050565b6000602082840312156128aa576128a96125c8565b5b60006128b884828501612815565b91505092915050565b6000806000606084860312156128da576128d96125c8565b5b60006128e886828701612815565b93505060206128f986828701612815565b925050604061290a86828701612760565b9150509250925092565b6000819050919050565b600061293961293461292f846127a2565b612914565b6127a2565b9050919050565b600061294b8261291e565b9050919050565b600061295d82612940565b9050919050565b61296d81612952565b82525050565b60006020820190506129886000830184612964565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6129d0826126d3565b810181811067ffffffffffffffff821117156129ef576129ee612998565b5b80604052505050565b6000612a026125be565b9050612a0e82826129c7565b919050565b600067ffffffffffffffff821115612a2e57612a2d612998565b5b612a37826126d3565b9050602081019050919050565b82818337600083830152505050565b6000612a66612a6184612a13565b6129f8565b905082815260208101848484011115612a8257612a81612993565b5b612a8d848285612a44565b509392505050565b600082601f830112612aaa57612aa961298e565b5b8135612aba848260208601612a53565b91505092915050565b600060208284031215612ad957612ad86125c8565b5b600082013567ffffffffffffffff811115612af757612af66125cd565b5b612b0384828501612a95565b91505092915050565b600080fd5b600080fd5b60008083601f840112612b2c57612b2b61298e565b5b8235905067ffffffffffffffff811115612b4957612b48612b0c565b5b602083019150836020820283011115612b6557612b64612b11565b5b9250929050565b60008083601f840112612b8257612b8161298e565b5b8235905067ffffffffffffffff811115612b9f57612b9e612b0c565b5b602083019150836020820283011115612bbb57612bba612b11565b5b9250929050565b60008060008060408587031215612bdc57612bdb6125c8565b5b600085013567ffffffffffffffff811115612bfa57612bf96125cd565b5b612c0687828801612b16565b9450945050602085013567ffffffffffffffff811115612c2957612c286125cd565b5b612c3587828801612b6c565b925092505092959194509250565b612c4c81612657565b8114612c5757600080fd5b50565b600081359050612c6981612c43565b92915050565b60008060408385031215612c8657612c856125c8565b5b6000612c9485828601612815565b9250506020612ca585828601612c5a565b9150509250929050565b600067ffffffffffffffff821115612cca57612cc9612998565b5b612cd3826126d3565b9050602081019050919050565b6000612cf3612cee84612caf565b6129f8565b905082815260208101848484011115612d0f57612d0e612993565b5b612d1a848285612a44565b509392505050565b600082601f830112612d3757612d3661298e565b5b8135612d47848260208601612ce0565b91505092915050565b60008060008060808587031215612d6a57612d696125c8565b5b6000612d7887828801612815565b9450506020612d8987828801612815565b9350506040612d9a87828801612760565b925050606085013567ffffffffffffffff811115612dbb57612dba6125cd565b5b612dc787828801612d22565b91505092959194509250565b60008060408385031215612dea57612de96125c8565b5b6000612df885828601612815565b9250506020612e0985828601612815565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612e5a57607f821691505b602082108103612e6d57612e6c612e13565b5b50919050565b7f4d696e74696e67204e6f74204f70656e20596574202100000000000000000000600082015250565b6000612ea9601683612698565b9150612eb482612e73565b602082019050919050565b60006020820190508181036000830152612ed881612e9c565b9050919050565b7f3130204d617820506572205472616e73616374696f6e21000000000000000000600082015250565b6000612f15601783612698565b9150612f2082612edf565b602082019050919050565b60006020820190508181036000830152612f4481612f08565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f858261273f565b9150612f908361273f565b9250828201905080821115612fa857612fa7612f4b565b5b92915050565b7f536f6c646f757421000000000000000000000000000000000000000000000000600082015250565b6000612fe4600883612698565b9150612fef82612fae565b602082019050919050565b6000602082019050818103600083015261301381612fd7565b9050919050565b60006130258261273f565b91506130308361273f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561306957613068612f4b565b5b828202905092915050565b7f496e73756666696369656e742046756e64732100000000000000000000000000600082015250565b60006130aa601383612698565b91506130b582613074565b602082019050919050565b600060208201905081810360008301526130d98161309d565b9050919050565b60006040820190506130f560008301856127d4565b61310260208301846127d4565b9392505050565b60008151905061311881612c43565b92915050565b600060208284031215613134576131336125c8565b5b600061314284828501613109565b91505092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026131ad7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613170565b6131b78683613170565b95508019841693508086168417925050509392505050565b60006131ea6131e56131e08461273f565b612914565b61273f565b9050919050565b6000819050919050565b613204836131cf565b613218613210826131f1565b84845461317d565b825550505050565b600090565b61322d613220565b6132388184846131fb565b505050565b5b8181101561325c57613251600082613225565b60018101905061323e565b5050565b601f8211156132a1576132728161314b565b61327b84613160565b8101602085101561328a578190505b61329e61329685613160565b83018261323d565b50505b505050565b600082821c905092915050565b60006132c4600019846008026132a6565b1980831691505092915050565b60006132dd83836132b3565b9150826002028217905092915050565b6132f68261268d565b67ffffffffffffffff81111561330f5761330e612998565b5b6133198254612e42565b613324828285613260565b600060209050601f8311600181146133575760008415613345578287015190505b61334f85826132d1565b8655506133b7565b601f1984166133658661314b565b60005b8281101561338d57848901518255600182019150602085019450602081019050613368565b868310156133aa57848901516133a6601f8916826132b3565b8355505b6001600288020188555050505b505050505050565b7f467265656d696e7420536f6c64204f7574000000000000000000000000000000600082015250565b60006133f5601183612698565b9150613400826133bf565b602082019050919050565b60006020820190508181036000830152613424816133e8565b9050919050565b7f4d61782032207065722057616c6c657400000000000000000000000000000000600082015250565b6000613461601083612698565b915061346c8261342b565b602082019050919050565b6000602082019050818103600083015261349081613454565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006134d18261273f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361350357613502612f4b565b5b600182019050919050565b600081905092915050565b60006135248261268d565b61352e818561350e565b935061353e8185602086016126a9565b80840191505092915050565b60006135568285613519565b91506135628284613519565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006135ca602683612698565b91506135d58261356e565b604082019050919050565b600060208201905081810360008301526135f9816135bd565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613636602083612698565b915061364182613600565b602082019050919050565b6000602082019050818103600083015261366581613629565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006136938261366c565b61369d8185613677565b93506136ad8185602086016126a9565b6136b6816126d3565b840191505092915050565b60006080820190506136d660008301876127d4565b6136e360208301866127d4565b6136f0604083018561286a565b81810360608301526137028184613688565b905095945050505050565b60008151905061371c816125fe565b92915050565b600060208284031215613738576137376125c8565b5b60006137468482850161370d565b9150509291505056fea2646970667358221220056b75658a25bf19596c889f2704559fd006a4fe2b0329b6437f1b1d010844c764736f6c63430008100033697066733a2f2f62616679626569686a79626666367965697962666e3473366475336c6569756f786c79346d3435336e636777667276633669636a6e6e70746674712f

Deployed Bytecode

0x6080604052600436106101f95760003560e01c8063715018a61161010d578063aa1152ab116100a0578063d3dd5fe01161006f578063d3dd5fe0146106ba578063d5abeb01146106d1578063e985e9c5146106fc578063ed6661c214610739578063f2fde38b14610764576101f9565b8063aa1152ab1461060b578063b88d4fde14610636578063c668286214610652578063c87b56dd1461067d576101f9565b806395d89b41116100dc57806395d89b411461056157806398710d1e1461058c578063a035b1fe146105b7578063a22cb465146105e2576101f9565b8063715018a6146104cd57806379ff6fee146104e45780638da5cb5b1461050d57806391b7f5ed14610538576101f9565b806324600fc31161019057806355f804b31161015f57806355f804b3146103e85780635b70ea9f146104115780636352211e146104285780636c0360eb1461046557806370a0823114610490576101f9565b806324600fc31461035f57806341f434341461037657806342842e0e146103a15780634b980d67146103bd576101f9565b8063095ea7b3116101cc578063095ea7b3146102bf57806318160ddd146102db57806322ae7f7b1461030657806323b872dd14610343576101f9565b806301ffc9a7146101fe57806306fdde031461023b5780630788370314610266578063081812fc14610282575b600080fd5b34801561020a57600080fd5b506102256004803603810190610220919061262a565b61078d565b6040516102329190612672565b60405180910390f35b34801561024757600080fd5b5061025061081f565b60405161025d919061271d565b60405180910390f35b610280600480360381019061027b9190612775565b6108b1565b005b34801561028e57600080fd5b506102a960048036038101906102a49190612775565b6109f9565b6040516102b691906127e3565b60405180910390f35b6102d960048036038101906102d4919061282a565b610a78565b005b3480156102e757600080fd5b506102f0610b82565b6040516102fd9190612879565b60405180910390f35b34801561031257600080fd5b5061032d60048036038101906103289190612894565b610b99565b60405161033a9190612672565b60405180910390f35b61035d600480360381019061035891906128c1565b610bb9565b005b34801561036b57600080fd5b50610374610d09565b005b34801561038257600080fd5b5061038b610d5a565b6040516103989190612973565b60405180910390f35b6103bb60048036038101906103b691906128c1565b610d6c565b005b3480156103c957600080fd5b506103d2610ebc565b6040516103df9190612879565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a9190612ac3565b610ec2565b005b34801561041d57600080fd5b50610426610edd565b005b34801561043457600080fd5b5061044f600480360381019061044a9190612775565b610f9f565b60405161045c91906127e3565b60405180910390f35b34801561047157600080fd5b5061047a610fb1565b604051610487919061271d565b60405180910390f35b34801561049c57600080fd5b506104b760048036038101906104b29190612894565b61103f565b6040516104c49190612879565b60405180910390f35b3480156104d957600080fd5b506104e26110f7565b005b3480156104f057600080fd5b5061050b60048036038101906105069190612bc2565b61110b565b005b34801561051957600080fd5b50610522611183565b60405161052f91906127e3565b60405180910390f35b34801561054457600080fd5b5061055f600480360381019061055a9190612775565b6111ad565b005b34801561056d57600080fd5b506105766111bf565b604051610583919061271d565b60405180910390f35b34801561059857600080fd5b506105a1611251565b6040516105ae9190612879565b60405180910390f35b3480156105c357600080fd5b506105cc611257565b6040516105d99190612879565b60405180910390f35b3480156105ee57600080fd5b5061060960048036038101906106049190612c6f565b61125d565b005b34801561061757600080fd5b50610620611367565b60405161062d9190612672565b60405180910390f35b610650600480360381019061064b9190612d50565b61137a565b005b34801561065e57600080fd5b506106676114cd565b604051610674919061271d565b60405180910390f35b34801561068957600080fd5b506106a4600480360381019061069f9190612775565b61155b565b6040516106b1919061271d565b60405180910390f35b3480156106c657600080fd5b506106cf6115f9565b005b3480156106dd57600080fd5b506106e661162d565b6040516106f39190612879565b60405180910390f35b34801561070857600080fd5b50610723600480360381019061071e9190612dd3565b611633565b6040516107309190612672565b60405180910390f35b34801561074557600080fd5b5061074e6116c7565b60405161075b9190612879565b60405180910390f35b34801561077057600080fd5b5061078b60048036038101906107869190612894565b6116cd565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107e857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108185750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461082e90612e42565b80601f016020809104026020016040519081016040528092919081815260200182805461085a90612e42565b80156108a75780601f1061087c576101008083540402835291602001916108a7565b820191906000526020600020905b81548152906001019060200180831161088a57829003601f168201915b5050505050905090565b600a60009054906101000a900460ff16610900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f790612ebf565b60405180910390fd5b600f54811115610945576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093c90612f2b565b60405180910390fd5b600e5481610951610b82565b61095b9190612f7a565b111561099c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099390612ffa565b60405180910390fd5b600d54816109aa919061301a565b3410156109ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e3906130c0565b60405180910390fd5b6109f63382611750565b50565b6000610a048261176e565b610a3a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610b73576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610af09291906130e0565b602060405180830381865afa158015610b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b31919061311e565b610b7257806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610b6991906127e3565b60405180910390fd5b5b610b7d83836117cd565b505050565b6000610b8c611911565b6001546000540303905090565b60096020528060005260406000206000915054906101000a900460ff1681565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610cf7573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c2b57610c2684848461191a565b610d03565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610c749291906130e0565b602060405180830381865afa158015610c91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb5919061311e565b610cf657336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610ced91906127e3565b60405180910390fd5b5b610d0284848461191a565b5b50505050565b610d11611c3c565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d57573d6000803e3d6000fd5b50565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610eaa573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610dde57610dd9848484611cba565b610eb6565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610e279291906130e0565b602060405180830381865afa158015610e44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e68919061311e565b610ea957336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610ea091906127e3565b60405180910390fd5b5b610eb5848484611cba565b5b50505050565b600f5481565b610eca611c3c565b80600b9081610ed991906132ed565b5050565b60006001905060105481610eef610b82565b610ef99190612f7a565b1115610f3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f319061340b565b60405180910390fd5b601154610f4633611cda565b82610f519190612f7a565b1115610f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8990613477565b60405180910390fd5b610f9c3382611d31565b50565b6000610faa82611eec565b9050919050565b600b8054610fbe90612e42565b80601f0160208091040260200160405190810160405280929190818152602001828054610fea90612e42565b80156110375780601f1061100c57610100808354040283529160200191611037565b820191906000526020600020905b81548152906001019060200180831161101a57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110a6576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6110ff611c3c565b6111096000611fb8565b565b611113611c3c565b60005b8282905081101561117c5761116b83838381811061113757611136613497565b5b905060200201602081019061114c9190612894565b86868481811061115f5761115e613497565b5b90506020020135611750565b80611175906134c6565b9050611116565b5050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6111b5611c3c565b80600d8190555050565b6060600380546111ce90612e42565b80601f01602080910402602001604051908101604052809291908181526020018280546111fa90612e42565b80156112475780601f1061121c57610100808354040283529160200191611247565b820191906000526020600020905b81548152906001019060200180831161122a57829003601f168201915b5050505050905090565b60115481565b600d5481565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611358576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016112d59291906130e0565b602060405180830381865afa1580156112f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611316919061311e565b61135757806040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161134e91906127e3565b60405180910390fd5b5b611362838361207e565b505050565b600a60009054906101000a900460ff1681565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156114b9573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113ed576113e885858585612189565b6114c6565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016114369291906130e0565b602060405180830381865afa158015611453573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611477919061311e565b6114b857336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016114af91906127e3565b60405180910390fd5b5b6114c585858585612189565b5b5050505050565b600c80546114da90612e42565b80601f016020809104026020016040519081016040528092919081815260200182805461150690612e42565b80156115535780601f1061152857610100808354040283529160200191611553565b820191906000526020600020905b81548152906001019060200180831161153657829003601f168201915b505050505081565b60606115668261176e565b61159c576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006115a66121fc565b905060008151036115c657604051806020016040528060008152506115f1565b806115d08461228e565b6040516020016115e192919061354a565b6040516020818303038152906040525b915050919050565b611601611c3c565b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b600e5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60105481565b6116d5611c3c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173b906135e0565b60405180910390fd5b61174d81611fb8565b50565b61176a8282604051806020016040528060008152506122de565b5050565b600081611779611911565b11158015611788575060005482105b80156117c6575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006117d882610f9f565b90508073ffffffffffffffffffffffffffffffffffffffff166117f961237b565b73ffffffffffffffffffffffffffffffffffffffff161461185c576118258161182061237b565b611633565b61185b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061192582611eec565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461198c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061199884612383565b915091506119ae81876119a961237b565b6123aa565b6119fa576119c3866119be61237b565b611633565b6119f9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611a60576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a6d86868660016123ee565b8015611a7857600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611b4685611b228888876123f4565b7c02000000000000000000000000000000000000000000000000000000001761241c565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611bcc5760006001850190506000600460008381526020019081526020016000205403611bca576000548114611bc9578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c348686866001612447565b505050505050565b611c4461244d565b73ffffffffffffffffffffffffffffffffffffffff16611c62611183565b73ffffffffffffffffffffffffffffffffffffffff1614611cb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611caf9061364c565b60405180910390fd5b565b611cd58383836040518060200160405280600081525061137a565b505050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60008054905060008203611d71576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d7e60008483856123ee565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611df583611de660008660006123f4565b611def85612455565b1761241c565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611e9657808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611e5b565b5060008203611ed1576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611ee76000848385612447565b505050565b60008082905080611efb611911565b11611f8157600054811015611f805760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611f7e575b60008103611f74576004600083600190039350838152602001908152602001600020549050611f4a565b8092505050611fb3565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b806007600061208b61237b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661213861237b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161217d9190612672565b60405180910390a35050565b612194848484610bb9565b60008373ffffffffffffffffffffffffffffffffffffffff163b146121f6576121bf84848484612465565b6121f5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600b805461220b90612e42565b80601f016020809104026020016040519081016040528092919081815260200182805461223790612e42565b80156122845780601f1061225957610100808354040283529160200191612284565b820191906000526020600020905b81548152906001019060200180831161226757829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b6001156122c957600184039350600a81066030018453600a81049050806122a7575b50828103602084039350808452505050919050565b6122e88383611d31565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461237657600080549050600083820390505b6123286000868380600101945086612465565b61235e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061231557816000541461237357600080fd5b50505b505050565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861240b8686846125b5565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b60006001821460e11b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261248b61237b565b8786866040518563ffffffff1660e01b81526004016124ad94939291906136c1565b6020604051808303816000875af19250505080156124e957506040513d601f19601f820116820180604052508101906124e69190613722565b60015b612562573d8060008114612519576040519150601f19603f3d011682016040523d82523d6000602084013e61251e565b606091505b50600081510361255a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612607816125d2565b811461261257600080fd5b50565b600081359050612624816125fe565b92915050565b6000602082840312156126405761263f6125c8565b5b600061264e84828501612615565b91505092915050565b60008115159050919050565b61266c81612657565b82525050565b60006020820190506126876000830184612663565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156126c75780820151818401526020810190506126ac565b60008484015250505050565b6000601f19601f8301169050919050565b60006126ef8261268d565b6126f98185612698565b93506127098185602086016126a9565b612712816126d3565b840191505092915050565b6000602082019050818103600083015261273781846126e4565b905092915050565b6000819050919050565b6127528161273f565b811461275d57600080fd5b50565b60008135905061276f81612749565b92915050565b60006020828403121561278b5761278a6125c8565b5b600061279984828501612760565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127cd826127a2565b9050919050565b6127dd816127c2565b82525050565b60006020820190506127f860008301846127d4565b92915050565b612807816127c2565b811461281257600080fd5b50565b600081359050612824816127fe565b92915050565b60008060408385031215612841576128406125c8565b5b600061284f85828601612815565b925050602061286085828601612760565b9150509250929050565b6128738161273f565b82525050565b600060208201905061288e600083018461286a565b92915050565b6000602082840312156128aa576128a96125c8565b5b60006128b884828501612815565b91505092915050565b6000806000606084860312156128da576128d96125c8565b5b60006128e886828701612815565b93505060206128f986828701612815565b925050604061290a86828701612760565b9150509250925092565b6000819050919050565b600061293961293461292f846127a2565b612914565b6127a2565b9050919050565b600061294b8261291e565b9050919050565b600061295d82612940565b9050919050565b61296d81612952565b82525050565b60006020820190506129886000830184612964565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6129d0826126d3565b810181811067ffffffffffffffff821117156129ef576129ee612998565b5b80604052505050565b6000612a026125be565b9050612a0e82826129c7565b919050565b600067ffffffffffffffff821115612a2e57612a2d612998565b5b612a37826126d3565b9050602081019050919050565b82818337600083830152505050565b6000612a66612a6184612a13565b6129f8565b905082815260208101848484011115612a8257612a81612993565b5b612a8d848285612a44565b509392505050565b600082601f830112612aaa57612aa961298e565b5b8135612aba848260208601612a53565b91505092915050565b600060208284031215612ad957612ad86125c8565b5b600082013567ffffffffffffffff811115612af757612af66125cd565b5b612b0384828501612a95565b91505092915050565b600080fd5b600080fd5b60008083601f840112612b2c57612b2b61298e565b5b8235905067ffffffffffffffff811115612b4957612b48612b0c565b5b602083019150836020820283011115612b6557612b64612b11565b5b9250929050565b60008083601f840112612b8257612b8161298e565b5b8235905067ffffffffffffffff811115612b9f57612b9e612b0c565b5b602083019150836020820283011115612bbb57612bba612b11565b5b9250929050565b60008060008060408587031215612bdc57612bdb6125c8565b5b600085013567ffffffffffffffff811115612bfa57612bf96125cd565b5b612c0687828801612b16565b9450945050602085013567ffffffffffffffff811115612c2957612c286125cd565b5b612c3587828801612b6c565b925092505092959194509250565b612c4c81612657565b8114612c5757600080fd5b50565b600081359050612c6981612c43565b92915050565b60008060408385031215612c8657612c856125c8565b5b6000612c9485828601612815565b9250506020612ca585828601612c5a565b9150509250929050565b600067ffffffffffffffff821115612cca57612cc9612998565b5b612cd3826126d3565b9050602081019050919050565b6000612cf3612cee84612caf565b6129f8565b905082815260208101848484011115612d0f57612d0e612993565b5b612d1a848285612a44565b509392505050565b600082601f830112612d3757612d3661298e565b5b8135612d47848260208601612ce0565b91505092915050565b60008060008060808587031215612d6a57612d696125c8565b5b6000612d7887828801612815565b9450506020612d8987828801612815565b9350506040612d9a87828801612760565b925050606085013567ffffffffffffffff811115612dbb57612dba6125cd565b5b612dc787828801612d22565b91505092959194509250565b60008060408385031215612dea57612de96125c8565b5b6000612df885828601612815565b9250506020612e0985828601612815565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612e5a57607f821691505b602082108103612e6d57612e6c612e13565b5b50919050565b7f4d696e74696e67204e6f74204f70656e20596574202100000000000000000000600082015250565b6000612ea9601683612698565b9150612eb482612e73565b602082019050919050565b60006020820190508181036000830152612ed881612e9c565b9050919050565b7f3130204d617820506572205472616e73616374696f6e21000000000000000000600082015250565b6000612f15601783612698565b9150612f2082612edf565b602082019050919050565b60006020820190508181036000830152612f4481612f08565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f858261273f565b9150612f908361273f565b9250828201905080821115612fa857612fa7612f4b565b5b92915050565b7f536f6c646f757421000000000000000000000000000000000000000000000000600082015250565b6000612fe4600883612698565b9150612fef82612fae565b602082019050919050565b6000602082019050818103600083015261301381612fd7565b9050919050565b60006130258261273f565b91506130308361273f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561306957613068612f4b565b5b828202905092915050565b7f496e73756666696369656e742046756e64732100000000000000000000000000600082015250565b60006130aa601383612698565b91506130b582613074565b602082019050919050565b600060208201905081810360008301526130d98161309d565b9050919050565b60006040820190506130f560008301856127d4565b61310260208301846127d4565b9392505050565b60008151905061311881612c43565b92915050565b600060208284031215613134576131336125c8565b5b600061314284828501613109565b91505092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026131ad7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613170565b6131b78683613170565b95508019841693508086168417925050509392505050565b60006131ea6131e56131e08461273f565b612914565b61273f565b9050919050565b6000819050919050565b613204836131cf565b613218613210826131f1565b84845461317d565b825550505050565b600090565b61322d613220565b6132388184846131fb565b505050565b5b8181101561325c57613251600082613225565b60018101905061323e565b5050565b601f8211156132a1576132728161314b565b61327b84613160565b8101602085101561328a578190505b61329e61329685613160565b83018261323d565b50505b505050565b600082821c905092915050565b60006132c4600019846008026132a6565b1980831691505092915050565b60006132dd83836132b3565b9150826002028217905092915050565b6132f68261268d565b67ffffffffffffffff81111561330f5761330e612998565b5b6133198254612e42565b613324828285613260565b600060209050601f8311600181146133575760008415613345578287015190505b61334f85826132d1565b8655506133b7565b601f1984166133658661314b565b60005b8281101561338d57848901518255600182019150602085019450602081019050613368565b868310156133aa57848901516133a6601f8916826132b3565b8355505b6001600288020188555050505b505050505050565b7f467265656d696e7420536f6c64204f7574000000000000000000000000000000600082015250565b60006133f5601183612698565b9150613400826133bf565b602082019050919050565b60006020820190508181036000830152613424816133e8565b9050919050565b7f4d61782032207065722057616c6c657400000000000000000000000000000000600082015250565b6000613461601083612698565b915061346c8261342b565b602082019050919050565b6000602082019050818103600083015261349081613454565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006134d18261273f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361350357613502612f4b565b5b600182019050919050565b600081905092915050565b60006135248261268d565b61352e818561350e565b935061353e8185602086016126a9565b80840191505092915050565b60006135568285613519565b91506135628284613519565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006135ca602683612698565b91506135d58261356e565b604082019050919050565b600060208201905081810360008301526135f9816135bd565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613636602083612698565b915061364182613600565b602082019050919050565b6000602082019050818103600083015261366581613629565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006136938261366c565b61369d8185613677565b93506136ad8185602086016126a9565b6136b6816126d3565b840191505092915050565b60006080820190506136d660008301876127d4565b6136e360208301866127d4565b6136f0604083018561286a565b81810360608301526137028184613688565b905095945050505050565b60008151905061371c816125fe565b92915050565b600060208284031215613738576137376125c8565b5b60006137468482850161370d565b9150509291505056fea2646970667358221220056b75658a25bf19596c889f2704559fd006a4fe2b0329b6437f1b1d010844c764736f6c63430008100033

Deployed Bytecode Sourcemap

64412:3355:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24780:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25682:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65139:366;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32173:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66980:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21433:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64489:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67153:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66457:113;;;;;;;;;;;;;:::i;:::-;;3562:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67332:179;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64797:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66582:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65513:277;;;;;;;;;;;;;:::i;:::-;;27075:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64571:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22617:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63533:103;;;;;;;;;;;;;:::i;:::-;;65798:248;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62885:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66245:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25858:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64879:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64717:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66796:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64542:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67519:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64673:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26068:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66155:82;;;;;;;;;;;;;:::i;:::-;;64759:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33122:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64842:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63791:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24780:639;24865:4;25204:10;25189:25;;:11;:25;;;;:102;;;;25281:10;25266:25;;:11;:25;;;;25189:102;:179;;;;25358:10;25343:25;;:11;:25;;;;25189:179;25169:199;;24780:639;;;:::o;25682:100::-;25736:13;25769:5;25762:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25682:100;:::o;65139:366::-;65210:10;;;;;;;;;;;65202:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;65277:17;;65267:6;:27;;65259:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;65367:9;;65357:6;65341:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;65333:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;65429:5;;65420:6;:14;;;;:::i;:::-;65407:9;:27;;65399:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;65468:29;65478:10;65490:6;65468:9;:29::i;:::-;65139:366;:::o;32173:218::-;32249:7;32274:16;32282:7;32274;:16::i;:::-;32269:64;;32299:34;;;;;;;;;;;;;;32269:64;32353:15;:24;32369:7;32353:24;;;;;;;;;;;:30;;;;;;;;;;;;32346:37;;32173:218;;;:::o;66980:165::-;67084:8;5604:1;3662:42;5556:45;;;:49;5552:225;;;3662:42;5627;;;5678:4;5685:8;5627:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5622:144;;5741:8;5722:28;;;;;;;;;;;:::i;:::-;;;;;;;;5622:144;5552:225;67105:32:::1;67119:8;67129:7;67105:13;:32::i;:::-;66980:165:::0;;;:::o;21433:323::-;21494:7;21722:15;:13;:15::i;:::-;21707:12;;21691:13;;:28;:46;21684:53;;21433:323;:::o;64489:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;67153:171::-;67262:4;4858:1;3662:42;4810:45;;;:49;4806:539;;;5099:10;5091:18;;:4;:18;;;5087:85;;67279:37:::1;67298:4;67304:2;67308:7;67279:18;:37::i;:::-;5150:7:::0;;5087:85;3662:42;5191;;;5242:4;5249:10;5191:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5186:148;;5307:10;5288:30;;;;;;;;;;;:::i;:::-;;;;;;;;5186:148;4806:539;67279:37:::1;67298:4;67304:2;67308:7;67279:18;:37::i;:::-;67153:171:::0;;;;;:::o;66457:113::-;62771:13;:11;:13::i;:::-;66512:10:::1;66504:28;;:51;66533:21;66504:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;66457:113::o:0;3562:143::-;3662:42;3562:143;:::o;67332:179::-;67445:4;4858:1;3662:42;4810:45;;;:49;4806:539;;;5099:10;5091:18;;:4;:18;;;5087:85;;67462:41:::1;67485:4;67491:2;67495:7;67462:22;:41::i;:::-;5150:7:::0;;5087:85;3662:42;5191;;;5242:4;5249:10;5191:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5186:148;;5307:10;5288:30;;;;;;;;;;;:::i;:::-;;;;;;;;5186:148;4806:539;67462:41:::1;67485:4;67491:2;67495:7;67462:22;:41::i;:::-;67332:179:::0;;;;;:::o;64797:37::-;;;;:::o;66582:100::-;62771:13;:11;:13::i;:::-;66666:8:::1;66656:7;:18;;;;;;:::i;:::-;;66582:100:::0;:::o;65513:277::-;65552:14;65569:1;65552:18;;65617:8;;65607:6;65591:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:34;;65583:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;65704:19;;65675:25;65689:10;65675:13;:25::i;:::-;65666:6;:34;;;;:::i;:::-;:57;;65658:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;65757:25;65763:10;65775:6;65757:5;:25::i;:::-;65541:249;65513:277::o;27075:152::-;27147:7;27190:27;27209:7;27190:18;:27::i;:::-;27167:52;;27075:152;;;:::o;64571:93::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22617:233::-;22689:7;22730:1;22713:19;;:5;:19;;;22709:60;;22741:28;;;;;;;;;;;;;;22709:60;16776:13;22787:18;:25;22806:5;22787:25;;;;;;;;;;;;;;;;:55;22780:62;;22617:233;;;:::o;63533:103::-;62771:13;:11;:13::i;:::-;63598:30:::1;63625:1;63598:18;:30::i;:::-;63533:103::o:0;65798:248::-;62771:13;:11;:13::i;:::-;65906:9:::1;65902:137;65925:6;;:13;;65921:1;:17;65902:137;;;65972:31;65982:6;;65989:1;65982:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;65993:6;;66000:1;65993:9;;;;;;;:::i;:::-;;;;;;;;65972;:31::i;:::-;65940:3;;;;:::i;:::-;;;65902:137;;;;65798:248:::0;;;;:::o;62885:87::-;62931:7;62958:6;;;;;;;;;;;62951:13;;62885:87;:::o;66245:88::-;62771:13;:11;:13::i;:::-;66317:8:::1;66309:5;:16;;;;66245:88:::0;:::o;25858:104::-;25914:13;25947:7;25940:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25858:104;:::o;64879:38::-;;;;:::o;64717:35::-;;;;:::o;66796:176::-;66900:8;5604:1;3662:42;5556:45;;;:49;5552:225;;;3662:42;5627;;;5678:4;5685:8;5627:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5622:144;;5741:8;5722:28;;;;;;;;;;;:::i;:::-;;;;;;;;5622:144;5552:225;66921:43:::1;66945:8;66955;66921:23;:43::i;:::-;66796:176:::0;;;:::o;64542:22::-;;;;;;;;;;;;;:::o;67519:245::-;67687:4;4858:1;3662:42;4810:45;;;:49;4806:539;;;5099:10;5091:18;;:4;:18;;;5087:85;;67709:47:::1;67732:4;67738:2;67742:7;67751:4;67709:22;:47::i;:::-;5150:7:::0;;5087:85;3662:42;5191;;;5242:4;5249:10;5191:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5186:148;;5307:10;5288:30;;;;;;;;;;;:::i;:::-;;;;;;;;5186:148;4806:539;67709:47:::1;67732:4;67738:2;67742:7;67751:4;67709:22;:47::i;:::-;67519:245:::0;;;;;;:::o;64673:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26068:318::-;26141:13;26172:16;26180:7;26172;:16::i;:::-;26167:59;;26197:29;;;;;;;;;;;;;;26167:59;26239:21;26263:10;:8;:10::i;:::-;26239:34;;26316:1;26297:7;26291:21;:26;:87;;;;;;;;;;;;;;;;;26344:7;26353:18;26363:7;26353:9;:18::i;:::-;26327:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26291:87;26284:94;;;26068:318;;;:::o;66155:82::-;62771:13;:11;:13::i;:::-;66219:10:::1;;;;;;;;;;;66218:11;66205:10;;:24;;;;;;;;;;;;;;;;;;66155:82::o:0;64759:31::-;;;;:::o;33122:164::-;33219:4;33243:18;:25;33262:5;33243:25;;;;;;;;;;;;;;;:35;33269:8;33243:35;;;;;;;;;;;;;;;;;;;;;;;;;33236:42;;33122:164;;;;:::o;64842:29::-;;;;:::o;63791:201::-;62771:13;:11;:13::i;:::-;63900:1:::1;63880:22;;:8;:22;;::::0;63872:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;63956:28;63975:8;63956:18;:28::i;:::-;63791:201:::0;:::o;49684:112::-;49761:27;49771:2;49775:8;49761:27;;;;;;;;;;;;:9;:27::i;:::-;49684:112;;:::o;33544:282::-;33609:4;33665:7;33646:15;:13;:15::i;:::-;:26;;:66;;;;;33699:13;;33689:7;:23;33646:66;:153;;;;;33798:1;17552:8;33750:17;:26;33768:7;33750:26;;;;;;;;;;;;:44;:49;33646:153;33626:173;;33544:282;;;:::o;31606:408::-;31695:13;31711:16;31719:7;31711;:16::i;:::-;31695:32;;31767:5;31744:28;;:19;:17;:19::i;:::-;:28;;;31740:175;;31792:44;31809:5;31816:19;:17;:19::i;:::-;31792:16;:44::i;:::-;31787:128;;31864:35;;;;;;;;;;;;;;31787:128;31740:175;31960:2;31927:15;:24;31943:7;31927:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;31998:7;31994:2;31978:28;;31987:5;31978:28;;;;;;;;;;;;31684:330;31606:408;;:::o;65017:101::-;65082:7;65109:1;65102:8;;65017:101;:::o;35812:2825::-;35954:27;35984;36003:7;35984:18;:27::i;:::-;35954:57;;36069:4;36028:45;;36044:19;36028:45;;;36024:86;;36082:28;;;;;;;;;;;;;;36024:86;36124:27;36153:23;36180:35;36207:7;36180:26;:35::i;:::-;36123:92;;;;36315:68;36340:15;36357:4;36363:19;:17;:19::i;:::-;36315:24;:68::i;:::-;36310:180;;36403:43;36420:4;36426:19;:17;:19::i;:::-;36403:16;:43::i;:::-;36398:92;;36455:35;;;;;;;;;;;;;;36398:92;36310:180;36521:1;36507:16;;:2;:16;;;36503:52;;36532:23;;;;;;;;;;;;;;36503:52;36568:43;36590:4;36596:2;36600:7;36609:1;36568:21;:43::i;:::-;36704:15;36701:160;;;36844:1;36823:19;36816:30;36701:160;37241:18;:24;37260:4;37241:24;;;;;;;;;;;;;;;;37239:26;;;;;;;;;;;;37310:18;:22;37329:2;37310:22;;;;;;;;;;;;;;;;37308:24;;;;;;;;;;;37632:146;37669:2;37718:45;37733:4;37739:2;37743:19;37718:14;:45::i;:::-;17832:8;37690:73;37632:18;:146::i;:::-;37603:17;:26;37621:7;37603:26;;;;;;;;;;;:175;;;;37949:1;17832:8;37898:19;:47;:52;37894:627;;37971:19;38003:1;37993:7;:11;37971:33;;38160:1;38126:17;:30;38144:11;38126:30;;;;;;;;;;;;:35;38122:384;;38264:13;;38249:11;:28;38245:242;;38444:19;38411:17;:30;38429:11;38411:30;;;;;;;;;;;:52;;;;38245:242;38122:384;37952:569;37894:627;38568:7;38564:2;38549:27;;38558:4;38549:27;;;;;;;;;;;;38587:42;38608:4;38614:2;38618:7;38627:1;38587:20;:42::i;:::-;35943:2694;;;35812:2825;;;:::o;63050:132::-;63125:12;:10;:12::i;:::-;63114:23;;:7;:5;:7::i;:::-;:23;;;63106:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63050:132::o;38733:193::-;38879:39;38896:4;38902:2;38906:7;38879:39;;;;;;;;;;;;:16;:39::i;:::-;38733:193;;;:::o;22932:178::-;22993:7;16776:13;16914:2;23021:18;:25;23040:5;23021:25;;;;;;;;;;;;;;;;:50;;23020:82;23013:89;;22932:178;;;:::o;43193:2966::-;43266:20;43289:13;;43266:36;;43329:1;43317:8;:13;43313:44;;43339:18;;;;;;;;;;;;;;43313:44;43370:61;43400:1;43404:2;43408:12;43422:8;43370:21;:61::i;:::-;43914:1;16914:2;43884:1;:26;;43883:32;43871:8;:45;43845:18;:22;43864:2;43845:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;44193:139;44230:2;44284:33;44307:1;44311:2;44315:1;44284:14;:33::i;:::-;44251:30;44272:8;44251:20;:30::i;:::-;:66;44193:18;:139::i;:::-;44159:17;:31;44177:12;44159:31;;;;;;;;;;;:173;;;;44349:16;44380:11;44409:8;44394:12;:23;44380:37;;44930:16;44926:2;44922:25;44910:37;;45302:12;45262:8;45221:1;45159:25;45100:1;45039;45012:335;45673:1;45659:12;45655:20;45613:346;45714:3;45705:7;45702:16;45613:346;;45932:7;45922:8;45919:1;45892:25;45889:1;45886;45881:59;45767:1;45758:7;45754:15;45743:26;;45613:346;;;45617:77;46004:1;45992:8;:13;45988:45;;46014:19;;;;;;;;;;;;;;45988:45;46066:3;46050:13;:19;;;;43619:2462;;46091:60;46120:1;46124:2;46128:12;46142:8;46091:20;:60::i;:::-;43255:2904;43193:2966;;:::o;28230:1275::-;28297:7;28317:12;28332:7;28317:22;;28400:4;28381:15;:13;:15::i;:::-;:23;28377:1061;;28434:13;;28427:4;:20;28423:1015;;;28472:14;28489:17;:23;28507:4;28489:23;;;;;;;;;;;;28472:40;;28606:1;17552:8;28578:6;:24;:29;28574:845;;29243:113;29260:1;29250:6;:11;29243:113;;29303:17;:25;29321:6;;;;;;;29303:25;;;;;;;;;;;;29294:34;;29243:113;;;29389:6;29382:13;;;;;;28574:845;28449:989;28423:1015;28377:1061;29466:31;;;;;;;;;;;;;;28230:1275;;;;:::o;64152:191::-;64226:16;64245:6;;;;;;;;;;;64226:25;;64271:8;64262:6;;:17;;;;;;;;;;;;;;;;;;64326:8;64295:40;;64316:8;64295:40;;;;;;;;;;;;64215:128;64152:191;:::o;32731:234::-;32878:8;32826:18;:39;32845:19;:17;:19::i;:::-;32826:39;;;;;;;;;;;;;;;:49;32866:8;32826:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;32938:8;32902:55;;32917:19;:17;:19::i;:::-;32902:55;;;32948:8;32902:55;;;;;;:::i;:::-;;;;;;;;32731:234;;:::o;39524:407::-;39699:31;39712:4;39718:2;39722:7;39699:12;:31::i;:::-;39763:1;39745:2;:14;;;:19;39741:183;;39784:56;39815:4;39821:2;39825:7;39834:5;39784:30;:56::i;:::-;39779:145;;39868:40;;;;;;;;;;;;;;39779:145;39741:183;39524:407;;;;:::o;66341:108::-;66401:13;66434:7;66427:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66341:108;:::o;56059:1745::-;56124:17;56558:4;56551;56545:11;56541:22;56650:1;56644:4;56637:15;56725:4;56722:1;56718:12;56711:19;;56807:1;56802:3;56795:14;56911:3;57150:5;57132:428;57158:1;57132:428;;;57198:1;57193:3;57189:11;57182:18;;57369:2;57363:4;57359:13;57355:2;57351:22;57346:3;57338:36;57463:2;57457:4;57453:13;57445:21;;57530:4;57132:428;57520:25;57132:428;57136:21;57599:3;57594;57590:13;57714:4;57709:3;57705:14;57698:21;;57779:6;57774:3;57767:19;56163:1634;;;56059:1745;;;:::o;48911:689::-;49042:19;49048:2;49052:8;49042:5;:19::i;:::-;49121:1;49103:2;:14;;;:19;49099:483;;49143:11;49157:13;;49143:27;;49189:13;49211:8;49205:3;:14;49189:30;;49238:233;49269:62;49308:1;49312:2;49316:7;;;;;;49325:5;49269:30;:62::i;:::-;49264:167;;49367:40;;;;;;;;;;;;;;49264:167;49466:3;49458:5;:11;49238:233;;49553:3;49536:13;;:20;49532:34;;49558:8;;;49532:34;49124:458;;49099:483;48911:689;;;:::o;55852:105::-;55912:7;55939:10;55932:17;;55852:105;:::o;34707:485::-;34809:27;34838:23;34879:38;34920:15;:24;34936:7;34920:24;;;;;;;;;;;34879:65;;35097:18;35074:41;;35154:19;35148:26;35129:45;;35059:126;34707:485;;;:::o;33935:659::-;34084:11;34249:16;34242:5;34238:28;34229:37;;34409:16;34398:9;34394:32;34381:45;;34559:15;34548:9;34545:30;34537:5;34526:9;34523:20;34520:56;34510:66;;33935:659;;;;;:::o;40593:159::-;;;;;:::o;55161:311::-;55296:7;55316:16;17956:3;55342:19;:41;;55316:68;;17956:3;55410:31;55421:4;55427:2;55431:9;55410:10;:31::i;:::-;55402:40;;:62;;55395:69;;;55161:311;;;;;:::o;30053:450::-;30133:14;30301:16;30294:5;30290:28;30281:37;;30478:5;30464:11;30439:23;30435:41;30432:52;30425:5;30422:63;30412:73;;30053:450;;;;:::o;41417:158::-;;;;;:::o;61436:98::-;61489:7;61516:10;61509:17;;61436:98;:::o;30605:324::-;30675:14;30908:1;30898:8;30895:15;30869:24;30865:46;30855:56;;30605:324;;;:::o;42015:716::-;42178:4;42224:2;42199:45;;;42245:19;:17;:19::i;:::-;42266:4;42272:7;42281:5;42199:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42195:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42499:1;42482:6;:13;:18;42478:235;;42528:40;;;;;;;;;;;;;;42478:235;42671:6;42665:13;42656:6;42652:2;42648:15;42641:38;42195:529;42368:54;;;42358:64;;;:6;:64;;;;42351:71;;;42015:716;;;;;;:::o;54862:147::-;54999:6;54862:147;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:329::-;5301:6;5350:2;5338:9;5329:7;5325:23;5321:32;5318:119;;;5356:79;;:::i;:::-;5318:119;5476:1;5501:53;5546:7;5537:6;5526:9;5522:22;5501:53;:::i;:::-;5491:63;;5447:117;5242:329;;;;:::o;5577:619::-;5654:6;5662;5670;5719:2;5707:9;5698:7;5694:23;5690:32;5687:119;;;5725:79;;:::i;:::-;5687:119;5845:1;5870:53;5915:7;5906:6;5895:9;5891:22;5870:53;:::i;:::-;5860:63;;5816:117;5972:2;5998:53;6043:7;6034:6;6023:9;6019:22;5998:53;:::i;:::-;5988:63;;5943:118;6100:2;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6071:118;5577:619;;;;;:::o;6202:60::-;6230:3;6251:5;6244:12;;6202:60;;;:::o;6268:142::-;6318:9;6351:53;6369:34;6378:24;6396:5;6378:24;:::i;:::-;6369:34;:::i;:::-;6351:53;:::i;:::-;6338:66;;6268:142;;;:::o;6416:126::-;6466:9;6499:37;6530:5;6499:37;:::i;:::-;6486:50;;6416:126;;;:::o;6548:157::-;6629:9;6662:37;6693:5;6662:37;:::i;:::-;6649:50;;6548:157;;;:::o;6711:193::-;6829:68;6891:5;6829:68;:::i;:::-;6824:3;6817:81;6711:193;;:::o;6910:284::-;7034:4;7072:2;7061:9;7057:18;7049:26;;7085:102;7184:1;7173:9;7169:17;7160:6;7085:102;:::i;:::-;6910:284;;;;:::o;7200:117::-;7309:1;7306;7299:12;7323:117;7432:1;7429;7422:12;7446:180;7494:77;7491:1;7484:88;7591:4;7588:1;7581:15;7615:4;7612:1;7605:15;7632:281;7715:27;7737:4;7715:27;:::i;:::-;7707:6;7703:40;7845:6;7833:10;7830:22;7809:18;7797:10;7794:34;7791:62;7788:88;;;7856:18;;:::i;:::-;7788:88;7896:10;7892:2;7885:22;7675:238;7632:281;;:::o;7919:129::-;7953:6;7980:20;;:::i;:::-;7970:30;;8009:33;8037:4;8029:6;8009:33;:::i;:::-;7919:129;;;:::o;8054:308::-;8116:4;8206:18;8198:6;8195:30;8192:56;;;8228:18;;:::i;:::-;8192:56;8266:29;8288:6;8266:29;:::i;:::-;8258:37;;8350:4;8344;8340:15;8332:23;;8054:308;;;:::o;8368:146::-;8465:6;8460:3;8455;8442:30;8506:1;8497:6;8492:3;8488:16;8481:27;8368:146;;;:::o;8520:425::-;8598:5;8623:66;8639:49;8681:6;8639:49;:::i;:::-;8623:66;:::i;:::-;8614:75;;8712:6;8705:5;8698:21;8750:4;8743:5;8739:16;8788:3;8779:6;8774:3;8770:16;8767:25;8764:112;;;8795:79;;:::i;:::-;8764:112;8885:54;8932:6;8927:3;8922;8885:54;:::i;:::-;8604:341;8520:425;;;;;:::o;8965:340::-;9021:5;9070:3;9063:4;9055:6;9051:17;9047:27;9037:122;;9078:79;;:::i;:::-;9037:122;9195:6;9182:20;9220:79;9295:3;9287:6;9280:4;9272:6;9268:17;9220:79;:::i;:::-;9211:88;;9027:278;8965:340;;;;:::o;9311:509::-;9380:6;9429:2;9417:9;9408:7;9404:23;9400:32;9397:119;;;9435:79;;:::i;:::-;9397:119;9583:1;9572:9;9568:17;9555:31;9613:18;9605:6;9602:30;9599:117;;;9635:79;;:::i;:::-;9599:117;9740:63;9795:7;9786:6;9775:9;9771:22;9740:63;:::i;:::-;9730:73;;9526:287;9311:509;;;;:::o;9826:117::-;9935:1;9932;9925:12;9949:117;10058:1;10055;10048:12;10089:568;10162:8;10172:6;10222:3;10215:4;10207:6;10203:17;10199:27;10189:122;;10230:79;;:::i;:::-;10189:122;10343:6;10330:20;10320:30;;10373:18;10365:6;10362:30;10359:117;;;10395:79;;:::i;:::-;10359:117;10509:4;10501:6;10497:17;10485:29;;10563:3;10555:4;10547:6;10543:17;10533:8;10529:32;10526:41;10523:128;;;10570:79;;:::i;:::-;10523:128;10089:568;;;;;:::o;10680:::-;10753:8;10763:6;10813:3;10806:4;10798:6;10794:17;10790:27;10780:122;;10821:79;;:::i;:::-;10780:122;10934:6;10921:20;10911:30;;10964:18;10956:6;10953:30;10950:117;;;10986:79;;:::i;:::-;10950:117;11100:4;11092:6;11088:17;11076:29;;11154:3;11146:4;11138:6;11134:17;11124:8;11120:32;11117:41;11114:128;;;11161:79;;:::i;:::-;11114:128;10680:568;;;;;:::o;11254:934::-;11376:6;11384;11392;11400;11449:2;11437:9;11428:7;11424:23;11420:32;11417:119;;;11455:79;;:::i;:::-;11417:119;11603:1;11592:9;11588:17;11575:31;11633:18;11625:6;11622:30;11619:117;;;11655:79;;:::i;:::-;11619:117;11768:80;11840:7;11831:6;11820:9;11816:22;11768:80;:::i;:::-;11750:98;;;;11546:312;11925:2;11914:9;11910:18;11897:32;11956:18;11948:6;11945:30;11942:117;;;11978:79;;:::i;:::-;11942:117;12091:80;12163:7;12154:6;12143:9;12139:22;12091:80;:::i;:::-;12073:98;;;;11868:313;11254:934;;;;;;;:::o;12194:116::-;12264:21;12279:5;12264:21;:::i;:::-;12257:5;12254:32;12244:60;;12300:1;12297;12290:12;12244:60;12194:116;:::o;12316:133::-;12359:5;12397:6;12384:20;12375:29;;12413:30;12437:5;12413:30;:::i;:::-;12316:133;;;;:::o;12455:468::-;12520:6;12528;12577:2;12565:9;12556:7;12552:23;12548:32;12545:119;;;12583:79;;:::i;:::-;12545:119;12703:1;12728:53;12773:7;12764:6;12753:9;12749:22;12728:53;:::i;:::-;12718:63;;12674:117;12830:2;12856:50;12898:7;12889:6;12878:9;12874:22;12856:50;:::i;:::-;12846:60;;12801:115;12455:468;;;;;:::o;12929:307::-;12990:4;13080:18;13072:6;13069:30;13066:56;;;13102:18;;:::i;:::-;13066:56;13140:29;13162:6;13140:29;:::i;:::-;13132:37;;13224:4;13218;13214:15;13206:23;;12929:307;;;:::o;13242:423::-;13319:5;13344:65;13360:48;13401:6;13360:48;:::i;:::-;13344:65;:::i;:::-;13335:74;;13432:6;13425:5;13418:21;13470:4;13463:5;13459:16;13508:3;13499:6;13494:3;13490:16;13487:25;13484:112;;;13515:79;;:::i;:::-;13484:112;13605:54;13652:6;13647:3;13642;13605:54;:::i;:::-;13325:340;13242:423;;;;;:::o;13684:338::-;13739:5;13788:3;13781:4;13773:6;13769:17;13765:27;13755:122;;13796:79;;:::i;:::-;13755:122;13913:6;13900:20;13938:78;14012:3;14004:6;13997:4;13989:6;13985:17;13938:78;:::i;:::-;13929:87;;13745:277;13684:338;;;;:::o;14028:943::-;14123:6;14131;14139;14147;14196:3;14184:9;14175:7;14171:23;14167:33;14164:120;;;14203:79;;:::i;:::-;14164:120;14323:1;14348:53;14393:7;14384:6;14373:9;14369:22;14348:53;:::i;:::-;14338:63;;14294:117;14450:2;14476:53;14521:7;14512:6;14501:9;14497:22;14476:53;:::i;:::-;14466:63;;14421:118;14578:2;14604:53;14649:7;14640:6;14629:9;14625:22;14604:53;:::i;:::-;14594:63;;14549:118;14734:2;14723:9;14719:18;14706:32;14765:18;14757:6;14754:30;14751:117;;;14787:79;;:::i;:::-;14751:117;14892:62;14946:7;14937:6;14926:9;14922:22;14892:62;:::i;:::-;14882:72;;14677:287;14028:943;;;;;;;:::o;14977:474::-;15045:6;15053;15102:2;15090:9;15081:7;15077:23;15073:32;15070:119;;;15108:79;;:::i;:::-;15070:119;15228:1;15253:53;15298:7;15289:6;15278:9;15274:22;15253:53;:::i;:::-;15243:63;;15199:117;15355:2;15381:53;15426:7;15417:6;15406:9;15402:22;15381:53;:::i;:::-;15371:63;;15326:118;14977:474;;;;;:::o;15457:180::-;15505:77;15502:1;15495:88;15602:4;15599:1;15592:15;15626:4;15623:1;15616:15;15643:320;15687:6;15724:1;15718:4;15714:12;15704:22;;15771:1;15765:4;15761:12;15792:18;15782:81;;15848:4;15840:6;15836:17;15826:27;;15782:81;15910:2;15902:6;15899:14;15879:18;15876:38;15873:84;;15929:18;;:::i;:::-;15873:84;15694:269;15643:320;;;:::o;15969:172::-;16109:24;16105:1;16097:6;16093:14;16086:48;15969:172;:::o;16147:366::-;16289:3;16310:67;16374:2;16369:3;16310:67;:::i;:::-;16303:74;;16386:93;16475:3;16386:93;:::i;:::-;16504:2;16499:3;16495:12;16488:19;;16147:366;;;:::o;16519:419::-;16685:4;16723:2;16712:9;16708:18;16700:26;;16772:9;16766:4;16762:20;16758:1;16747:9;16743:17;16736:47;16800:131;16926:4;16800:131;:::i;:::-;16792:139;;16519:419;;;:::o;16944:173::-;17084:25;17080:1;17072:6;17068:14;17061:49;16944:173;:::o;17123:366::-;17265:3;17286:67;17350:2;17345:3;17286:67;:::i;:::-;17279:74;;17362:93;17451:3;17362:93;:::i;:::-;17480:2;17475:3;17471:12;17464:19;;17123:366;;;:::o;17495:419::-;17661:4;17699:2;17688:9;17684:18;17676:26;;17748:9;17742:4;17738:20;17734:1;17723:9;17719:17;17712:47;17776:131;17902:4;17776:131;:::i;:::-;17768:139;;17495:419;;;:::o;17920:180::-;17968:77;17965:1;17958:88;18065:4;18062:1;18055:15;18089:4;18086:1;18079:15;18106:191;18146:3;18165:20;18183:1;18165:20;:::i;:::-;18160:25;;18199:20;18217:1;18199:20;:::i;:::-;18194:25;;18242:1;18239;18235:9;18228:16;;18263:3;18260:1;18257:10;18254:36;;;18270:18;;:::i;:::-;18254:36;18106:191;;;;:::o;18303:158::-;18443:10;18439:1;18431:6;18427:14;18420:34;18303:158;:::o;18467:365::-;18609:3;18630:66;18694:1;18689:3;18630:66;:::i;:::-;18623:73;;18705:93;18794:3;18705:93;:::i;:::-;18823:2;18818:3;18814:12;18807:19;;18467:365;;;:::o;18838:419::-;19004:4;19042:2;19031:9;19027:18;19019:26;;19091:9;19085:4;19081:20;19077:1;19066:9;19062:17;19055:47;19119:131;19245:4;19119:131;:::i;:::-;19111:139;;18838:419;;;:::o;19263:348::-;19303:7;19326:20;19344:1;19326:20;:::i;:::-;19321:25;;19360:20;19378:1;19360:20;:::i;:::-;19355:25;;19548:1;19480:66;19476:74;19473:1;19470:81;19465:1;19458:9;19451:17;19447:105;19444:131;;;19555:18;;:::i;:::-;19444:131;19603:1;19600;19596:9;19585:20;;19263:348;;;;:::o;19617:169::-;19757:21;19753:1;19745:6;19741:14;19734:45;19617:169;:::o;19792:366::-;19934:3;19955:67;20019:2;20014:3;19955:67;:::i;:::-;19948:74;;20031:93;20120:3;20031:93;:::i;:::-;20149:2;20144:3;20140:12;20133:19;;19792:366;;;:::o;20164:419::-;20330:4;20368:2;20357:9;20353:18;20345:26;;20417:9;20411:4;20407:20;20403:1;20392:9;20388:17;20381:47;20445:131;20571:4;20445:131;:::i;:::-;20437:139;;20164:419;;;:::o;20589:332::-;20710:4;20748:2;20737:9;20733:18;20725:26;;20761:71;20829:1;20818:9;20814:17;20805:6;20761:71;:::i;:::-;20842:72;20910:2;20899:9;20895:18;20886:6;20842:72;:::i;:::-;20589:332;;;;;:::o;20927:137::-;20981:5;21012:6;21006:13;20997:22;;21028:30;21052:5;21028:30;:::i;:::-;20927:137;;;;:::o;21070:345::-;21137:6;21186:2;21174:9;21165:7;21161:23;21157:32;21154:119;;;21192:79;;:::i;:::-;21154:119;21312:1;21337:61;21390:7;21381:6;21370:9;21366:22;21337:61;:::i;:::-;21327:71;;21283:125;21070:345;;;;:::o;21421:141::-;21470:4;21493:3;21485:11;;21516:3;21513:1;21506:14;21550:4;21547:1;21537:18;21529:26;;21421:141;;;:::o;21568:93::-;21605:6;21652:2;21647;21640:5;21636:14;21632:23;21622:33;;21568:93;;;:::o;21667:107::-;21711:8;21761:5;21755:4;21751:16;21730:37;;21667:107;;;;:::o;21780:393::-;21849:6;21899:1;21887:10;21883:18;21922:97;21952:66;21941:9;21922:97;:::i;:::-;22040:39;22070:8;22059:9;22040:39;:::i;:::-;22028:51;;22112:4;22108:9;22101:5;22097:21;22088:30;;22161:4;22151:8;22147:19;22140:5;22137:30;22127:40;;21856:317;;21780:393;;;;;:::o;22179:142::-;22229:9;22262:53;22280:34;22289:24;22307:5;22289:24;:::i;:::-;22280:34;:::i;:::-;22262:53;:::i;:::-;22249:66;;22179:142;;;:::o;22327:75::-;22370:3;22391:5;22384:12;;22327:75;;;:::o;22408:269::-;22518:39;22549:7;22518:39;:::i;:::-;22579:91;22628:41;22652:16;22628:41;:::i;:::-;22620:6;22613:4;22607:11;22579:91;:::i;:::-;22573:4;22566:105;22484:193;22408:269;;;:::o;22683:73::-;22728:3;22683:73;:::o;22762:189::-;22839:32;;:::i;:::-;22880:65;22938:6;22930;22924:4;22880:65;:::i;:::-;22815:136;22762:189;;:::o;22957:186::-;23017:120;23034:3;23027:5;23024:14;23017:120;;;23088:39;23125:1;23118:5;23088:39;:::i;:::-;23061:1;23054:5;23050:13;23041:22;;23017:120;;;22957:186;;:::o;23149:543::-;23250:2;23245:3;23242:11;23239:446;;;23284:38;23316:5;23284:38;:::i;:::-;23368:29;23386:10;23368:29;:::i;:::-;23358:8;23354:44;23551:2;23539:10;23536:18;23533:49;;;23572:8;23557:23;;23533:49;23595:80;23651:22;23669:3;23651:22;:::i;:::-;23641:8;23637:37;23624:11;23595:80;:::i;:::-;23254:431;;23239:446;23149:543;;;:::o;23698:117::-;23752:8;23802:5;23796:4;23792:16;23771:37;;23698:117;;;;:::o;23821:169::-;23865:6;23898:51;23946:1;23942:6;23934:5;23931:1;23927:13;23898:51;:::i;:::-;23894:56;23979:4;23973;23969:15;23959:25;;23872:118;23821:169;;;;:::o;23995:295::-;24071:4;24217:29;24242:3;24236:4;24217:29;:::i;:::-;24209:37;;24279:3;24276:1;24272:11;24266:4;24263:21;24255:29;;23995:295;;;;:::o;24295:1395::-;24412:37;24445:3;24412:37;:::i;:::-;24514:18;24506:6;24503:30;24500:56;;;24536:18;;:::i;:::-;24500:56;24580:38;24612:4;24606:11;24580:38;:::i;:::-;24665:67;24725:6;24717;24711:4;24665:67;:::i;:::-;24759:1;24783:4;24770:17;;24815:2;24807:6;24804:14;24832:1;24827:618;;;;25489:1;25506:6;25503:77;;;25555:9;25550:3;25546:19;25540:26;25531:35;;25503:77;25606:67;25666:6;25659:5;25606:67;:::i;:::-;25600:4;25593:81;25462:222;24797:887;;24827:618;24879:4;24875:9;24867:6;24863:22;24913:37;24945:4;24913:37;:::i;:::-;24972:1;24986:208;25000:7;24997:1;24994:14;24986:208;;;25079:9;25074:3;25070:19;25064:26;25056:6;25049:42;25130:1;25122:6;25118:14;25108:24;;25177:2;25166:9;25162:18;25149:31;;25023:4;25020:1;25016:12;25011:17;;24986:208;;;25222:6;25213:7;25210:19;25207:179;;;25280:9;25275:3;25271:19;25265:26;25323:48;25365:4;25357:6;25353:17;25342:9;25323:48;:::i;:::-;25315:6;25308:64;25230:156;25207:179;25432:1;25428;25420:6;25416:14;25412:22;25406:4;25399:36;24834:611;;;24797:887;;24387:1303;;;24295:1395;;:::o;25696:167::-;25836:19;25832:1;25824:6;25820:14;25813:43;25696:167;:::o;25869:366::-;26011:3;26032:67;26096:2;26091:3;26032:67;:::i;:::-;26025:74;;26108:93;26197:3;26108:93;:::i;:::-;26226:2;26221:3;26217:12;26210:19;;25869:366;;;:::o;26241:419::-;26407:4;26445:2;26434:9;26430:18;26422:26;;26494:9;26488:4;26484:20;26480:1;26469:9;26465:17;26458:47;26522:131;26648:4;26522:131;:::i;:::-;26514:139;;26241:419;;;:::o;26666:166::-;26806:18;26802:1;26794:6;26790:14;26783:42;26666:166;:::o;26838:366::-;26980:3;27001:67;27065:2;27060:3;27001:67;:::i;:::-;26994:74;;27077:93;27166:3;27077:93;:::i;:::-;27195:2;27190:3;27186:12;27179:19;;26838:366;;;:::o;27210:419::-;27376:4;27414:2;27403:9;27399:18;27391:26;;27463:9;27457:4;27453:20;27449:1;27438:9;27434:17;27427:47;27491:131;27617:4;27491:131;:::i;:::-;27483:139;;27210:419;;;:::o;27635:180::-;27683:77;27680:1;27673:88;27780:4;27777:1;27770:15;27804:4;27801:1;27794:15;27821:233;27860:3;27883:24;27901:5;27883:24;:::i;:::-;27874:33;;27929:66;27922:5;27919:77;27916:103;;27999:18;;:::i;:::-;27916:103;28046:1;28039:5;28035:13;28028:20;;27821:233;;;:::o;28060:148::-;28162:11;28199:3;28184:18;;28060:148;;;;:::o;28214:390::-;28320:3;28348:39;28381:5;28348:39;:::i;:::-;28403:89;28485:6;28480:3;28403:89;:::i;:::-;28396:96;;28501:65;28559:6;28554:3;28547:4;28540:5;28536:16;28501:65;:::i;:::-;28591:6;28586:3;28582:16;28575:23;;28324:280;28214:390;;;;:::o;28610:435::-;28790:3;28812:95;28903:3;28894:6;28812:95;:::i;:::-;28805:102;;28924:95;29015:3;29006:6;28924:95;:::i;:::-;28917:102;;29036:3;29029:10;;28610:435;;;;;:::o;29051:225::-;29191:34;29187:1;29179:6;29175:14;29168:58;29260:8;29255:2;29247:6;29243:15;29236:33;29051:225;:::o;29282:366::-;29424:3;29445:67;29509:2;29504:3;29445:67;:::i;:::-;29438:74;;29521:93;29610:3;29521:93;:::i;:::-;29639:2;29634:3;29630:12;29623:19;;29282:366;;;:::o;29654:419::-;29820:4;29858:2;29847:9;29843:18;29835:26;;29907:9;29901:4;29897:20;29893:1;29882:9;29878:17;29871:47;29935:131;30061:4;29935:131;:::i;:::-;29927:139;;29654:419;;;:::o;30079:182::-;30219:34;30215:1;30207:6;30203:14;30196:58;30079:182;:::o;30267:366::-;30409:3;30430:67;30494:2;30489:3;30430:67;:::i;:::-;30423:74;;30506:93;30595:3;30506:93;:::i;:::-;30624:2;30619:3;30615:12;30608:19;;30267:366;;;:::o;30639:419::-;30805:4;30843:2;30832:9;30828:18;30820:26;;30892:9;30886:4;30882:20;30878:1;30867:9;30863:17;30856:47;30920:131;31046:4;30920:131;:::i;:::-;30912:139;;30639:419;;;:::o;31064:98::-;31115:6;31149:5;31143:12;31133:22;;31064:98;;;:::o;31168:168::-;31251:11;31285:6;31280:3;31273:19;31325:4;31320:3;31316:14;31301:29;;31168:168;;;;:::o;31342:373::-;31428:3;31456:38;31488:5;31456:38;:::i;:::-;31510:70;31573:6;31568:3;31510:70;:::i;:::-;31503:77;;31589:65;31647:6;31642:3;31635:4;31628:5;31624:16;31589:65;:::i;:::-;31679:29;31701:6;31679:29;:::i;:::-;31674:3;31670:39;31663:46;;31432:283;31342:373;;;;:::o;31721:640::-;31916:4;31954:3;31943:9;31939:19;31931:27;;31968:71;32036:1;32025:9;32021:17;32012:6;31968:71;:::i;:::-;32049:72;32117:2;32106:9;32102:18;32093:6;32049:72;:::i;:::-;32131;32199:2;32188:9;32184:18;32175:6;32131:72;:::i;:::-;32250:9;32244:4;32240:20;32235:2;32224:9;32220:18;32213:48;32278:76;32349:4;32340:6;32278:76;:::i;:::-;32270:84;;31721:640;;;;;;;:::o;32367:141::-;32423:5;32454:6;32448:13;32439:22;;32470:32;32496:5;32470:32;:::i;:::-;32367:141;;;;:::o;32514:349::-;32583:6;32632:2;32620:9;32611:7;32607:23;32603:32;32600:119;;;32638:79;;:::i;:::-;32600:119;32758:1;32783:63;32838:7;32829:6;32818:9;32814:22;32783:63;:::i;:::-;32773:73;;32729:127;32514:349;;;;:::o

Swarm Source

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