ETH Price: $2,469.25 (+0.99%)
Gas: 8.38 Gwei

Token

Numb3r Block5 (BLOCK5)
 

Overview

Max Total Supply

58 BLOCK5

Holders

18

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 BLOCK5
0xcBc5A8a3090217Cd8F50A6674Cd22b8D7cea2cb0
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:
Numb3rBlock5

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-13
*/

//SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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


abstract contract Ownable is Context {

    address private _owner;

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

    constructor() {
        _transferOwnership(_msgSender());
    }

    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

library Base64 {

    string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    function encode(bytes memory data) internal pure returns (string memory) {
        /**
         * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
         */
        if (data.length == 0) return "";

        // Loads the table into memory
        string memory table = _TABLE;

        // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
        // and split into 4 numbers of 6 bits.
        // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
        // - `data.length + 2`  -> Round up
        // - `/ 3`              -> Number of 3-bytes chunks
        // - `4 *`              -> 4 characters for each chunk
        string memory result = new string(4 * ((data.length + 2) / 3));

        /// @solidity memory-safe-assembly
        assembly {
            // Prepare the lookup table (skip the first "length" byte)
            let tablePtr := add(table, 1)

            // Prepare result pointer, jump over length
            let resultPtr := add(result, 32)

            // Run over the input, 3 bytes at a time
            for {
                let dataPtr := data
                let endPtr := add(data, mload(data))
            } lt(dataPtr, endPtr) {

            } {
                // Advance 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // To write each character, shift the 3 bytes (18 bits) chunk
                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
                // and apply logical AND with 0x3F which is the number of
                // the previous character in the ASCII table prior to the Base64 Table
                // The result is then added to the table to get the character to write,
                // and finally write it in the result pointer but with a left shift
                // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits

                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance
            }

            // When data `bytes` is not exactly 3 bytes long
            // it is padded with `=` characters at the end
            switch mod(mload(data), 3)
            case 1 {
                mstore8(sub(resultPtr, 1), 0x3d)
                mstore8(sub(resultPtr, 2), 0x3d)
            }
            case 2 {
                mstore8(sub(resultPtr, 1), 0x3d)
            }
        }

        return result;
    }
}

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

abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
    
        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);
            }
        }
        _;
    }
}

abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);
    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

interface IERC20 {
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 amount) external;
}

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


interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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

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

        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 Returns whether the ownership slot at `index` is initialized.
     * An uninitialized slot does not necessarily mean that the slot has no owner.
     */
    function _ownershipIsInitialized(uint256 index) internal view virtual returns (bool) {
        return _packedOwnerships[index] != 0;
    }

    /**
     * @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 packed) {
        if (_startTokenId() <= tokenId) {
            packed = _packedOwnerships[tokenId];
            // If the data at the starting slot does not exist, start the scan.
            if (packed == 0) {
                if (tokenId >= _currentIndex) _revert(OwnerQueryForNonexistentToken.selector);
                // 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, `tokenId` will not underflow.
                //
                // We can directly compare the packed value.
                // If the address is zero, packed will be zero.
                for (;;) {
                    unchecked {
                        packed = _packedOwnerships[--tokenId];
                    }
                    if (packed == 0) continue;
                    if (packed & _BITMASK_BURNED == 0) return packed;
                    // Otherwise, the token is burned, and we must revert.
                    // This handles the case of batch burned tokens, where only the burned bit
                    // of the starting slot is set, and remaining slots are left uninitialized.
                    _revert(OwnerQueryForNonexistentToken.selector);
                }
            }
            // Otherwise, the data exists and we can skip the scan.
            // This is possible because we have already achieved the target condition.
            // This saves 2143 gas on transfers of initialized tokens.
            // If the token is not burned, return `packed`. Otherwise, revert.
            if (packed & _BITMASK_BURNED == 0) return packed;
        }
        _revert(OwnerQueryForNonexistentToken.selector);
    }

    /**
     * @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. See {ERC721A-_approve}.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     */
    function approve(address to, uint256 tokenId) public payable virtual override {
        _approve(to, tokenId, true);
    }

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

        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 result) {
        if (_startTokenId() <= tokenId) {
            if (tokenId < _currentIndex) {
                uint256 packed;
                while ((packed = _packedOwnerships[tokenId]) == 0) --tokenId;
                result = packed & _BITMASK_BURNED == 0;
            }
        }
    }

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

        // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean.
        from = address(uint160(uint256(uint160(from)) & _BITMASK_ADDRESS));

        if (address(uint160(prevOwnershipPacked)) != from) _revert(TransferFromIncorrectOwner.selector);

        (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.selector);

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

        // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
        uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS;
        assembly {
            // 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.
                from, // `from`.
                toMasked, // `to`.
                tokenId // `tokenId`.
            )
        }
        if (toMasked == 0) _revert(TransferToZeroAddress.selector);

        _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.selector);
            }
    }

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

        _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:
            // - `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)
            );

            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
            uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS;

            if (toMasked == 0) _revert(MintToZeroAddress.selector);

            uint256 end = startTokenId + quantity;
            uint256 tokenId = startTokenId;

            do {
                assembly {
                    // 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`.
                        tokenId // `tokenId`.
                    )
                }
                // The `!=` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
            } while (++tokenId != end);

            _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.selector);
        if (quantity == 0) _revert(MintZeroQuantity.selector);
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) _revert(MintERC2309QuantityExceedsLimit.selector);

        _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.selector);
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) _revert(bytes4(0));
            }
        }
    }

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

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

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

    /**
     * @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:
     *
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        bool approvalCheck
    ) internal virtual {
        address owner = ownerOf(tokenId);

        if (approvalCheck && _msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                _revert(ApprovalCallerNotOwnerNorApproved.selector);
            }

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

    // =============================================================
    //                        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.selector);
        }

        _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.selector);
        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)
        }
    }

    /**
     * @dev For more efficient reverts.
     */
    function _revert(bytes4 errorSelector) internal pure {
        assembly {
            mstore(0x00, errorSelector)
            revert(0x00, 0x04)
        }
    }
}


contract Numb3rBlock5 is ERC721A, DefaultOperatorFilterer, Ownable {

    uint256 public MAX_MINT = 2;
    uint256 public MAX_COMBINE = 5;

    // Collection name and description
    string private _collectionName = "Numb3r Block5";
    string private _collectionDescription = "Numb3r Block5 is an Open Edition-Hybrid that combines ERC-721 & ERC-1155 smart contract functionalities. The resulting contract has mixed functions from both variants, a 24-Hr mint period with no mint cap + an array of new unique capabilities that allows for the combination of Block5 based on numerical values calculated & created directly on-chain. The higher the Numb3r, the higher the Rarity."; 

    // Trait type
    string private _traitType;

    // Mapping from token ID to token data
    mapping (uint256 => uint256) private _tokenData;

    // Duration of the minting period
    uint256 private _mintingPeriod;

    // Timestamp of when the current minting period began
    uint256 private _mintingStartTime;

    // Token ID counter
    uint256 private _tokenIdTracker;

    // Constructor function
    constructor(string memory name, string memory symbol, string memory traitType) ERC721A(name, symbol) {
        _traitType = traitType;
        _mintingPeriod = 86400; // Set the minting period to 24 hours (24 * 60 * 60 seconds)
        _mintingStartTime = block.timestamp;
    }

    // Mint function
    function mint(uint amount) public {

       require(block.timestamp < _mintingStartTime + _mintingPeriod, "Minting period has ended");
       require(amount <= MAX_MINT && amount != 0);

        uint256 tokenData = 1;
        uint256 currentSupplyid = totalSupply(); 
        _tokenIdTracker += amount;
        _mint(msg.sender,amount);

        // avoid loop to reduce gas fee
        _tokenData[currentSupplyid + 1] = tokenData;
        _tokenData[currentSupplyid + 2] = tokenData;

    }

    // Combine function
    function combine(uint256[] calldata tokenIds) public {
        
        if(tokenIds.length > MAX_COMBINE) revert("Error: Max Combine Over Limit!");

        // Calculate new token data
        uint256 newTokenData;

        for(uint i = 0; i < tokenIds.length; i++) {
            require(_exists(tokenIds[i]));
            require(ownerOf(tokenIds[i]) == msg.sender);
            newTokenData += _tokenData[tokenIds[i]];
            _burn(tokenIds[i]);
        }

        _tokenIdTracker += 1;
        _mint(msg.sender,1);

        // Store token data
        _tokenData[totalSupply()] = newTokenData;

    }

    // Helper function to generate random color
    function getRandomColor() internal view returns (string memory) {
       uint256 random = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, totalSupply())));
       return string(abi.encodePacked("rgb(", toString(random % 255), ",", toString((random / 255) % 255), ",", toString((random / 65025) % 255), ")"));
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
         if (!_exists(tokenId)) revert("Token must exist");

        // Get token data
        uint256 tokenData = _tokenData[tokenId];

        // Construct token metadata
        string memory svg = string(abi.encodePacked(
            '<svg xmlns="http://www.w3.org/2000/svg" width="600" height="600">',
            '<rect x="0" y="0" width="600" height="600" fill="', getRandomColor(), '"/>',
            '<text x="300" y="300" font-size="200" text-anchor="middle" font-family="Bebas+Neue" dominant-baseline="central" fill="white">',
            toString(tokenData),
            '</text>',
            '</svg>'
        ));

        string memory imageUrl = string(abi.encodePacked("data:image/svg+xml;base64,", Base64.encode(bytes(svg))));

        string memory json = string(abi.encodePacked(
            '{"name":"',_collectionName,'#',toString(tokenData),'",',
            '"description":"', _collectionDescription, '",',
            '"attributes": [',
                '{',
                    '"trait_type": "', _traitType, '",',
                    '"value":', toString(tokenData),
                '}',
            '],',
            '"image":"', imageUrl, '"',
            '}'
        ));


        // Base URI for token metadata
        string memory baseURI = super.tokenURI(tokenId);


        // Concatenate base URI and metadata JSON string
        string memory dataString = string(abi.encodePacked(baseURI, json));


        // Encode data string as Base64
        string memory encodedData = Base64.encode(bytes(dataString));


        // Return full token URI with prefix
        return string(abi.encodePacked("data:application/json;base64,", encodedData));
    }

    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
        uint256 currentTokenId = _startTokenId();
        uint256 ownedTokenIndex = 0;

        while (ownedTokenIndex < ownerTokenCount && currentTokenId <= totalSupply()) {
            
            address currentTokenOwner = address(0);
            
            if(_exists(currentTokenId)){
                currentTokenOwner = ownerOf(currentTokenId);
            }

            if (currentTokenOwner == _owner) {
                ownedTokenIds[ownedTokenIndex] = currentTokenId;

                ownedTokenIndex++;
            }

            currentTokenId++;
        }

        return ownedTokenIds;
    }


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

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

    // ========================= Rescue Tokens/Funds ============================

    function rescueToken(address _token) external onlyOwner {
        uint balance = IERC20(_token).balanceOf(address(this));
        IERC20(_token).transfer(msg.sender,balance);
    }

    function rescueFunds() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    // ========================= Opensea Filters ============================

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

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

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

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"traitType","type":"string"}],"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_COMBINE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"combine","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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescueFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"rescueToken","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"}]

608060405260026009556005600a556040518060400160405280600d81526020017f4e756d62337220426c6f636b3500000000000000000000000000000000000000815250600b90816200005491906200069f565b50604051806101c0016040528061018c815260200162004a0361018c9139600c90816200008291906200069f565b503480156200009057600080fd5b5060405162004b8f38038062004b8f8339818101604052810190620000b69190620008ea565b733cc6cdda760b79bafa08df41ecfa224f810dceb6600184848160029081620000e091906200069f565b508060039081620000f291906200069f565b50620001036200034e60201b60201c565b600081905550505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111562000300578015620001c6576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200018c929190620009e8565b600060405180830381600087803b158015620001a757600080fd5b505af1158015620001bc573d6000803e3d6000fd5b50505050620002ff565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000280576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b815260040162000246929190620009e8565b600060405180830381600087803b1580156200026157600080fd5b505af115801562000276573d6000803e3d6000fd5b50505050620002fe565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620002c9919062000a15565b600060405180830381600087803b158015620002e457600080fd5b505af1158015620002f9573d6000803e3d6000fd5b505050505b5b5b505062000322620003166200035760201b60201c565b6200035f60201b60201c565b80600d90816200033391906200069f565b5062015180600f819055504260108190555050505062000a32565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004a757607f821691505b602082108103620004bd57620004bc6200045f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005277fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620004e8565b620005338683620004e8565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005806200057a62000574846200054b565b62000555565b6200054b565b9050919050565b6000819050919050565b6200059c836200055f565b620005b4620005ab8262000587565b848454620004f5565b825550505050565b600090565b620005cb620005bc565b620005d881848462000591565b505050565b5b818110156200060057620005f4600082620005c1565b600181019050620005de565b5050565b601f8211156200064f576200061981620004c3565b6200062484620004d8565b8101602085101562000634578190505b6200064c6200064385620004d8565b830182620005dd565b50505b505050565b600082821c905092915050565b6000620006746000198460080262000654565b1980831691505092915050565b60006200068f838362000661565b9150826002028217905092915050565b620006aa8262000425565b67ffffffffffffffff811115620006c657620006c562000430565b5b620006d282546200048e565b620006df82828562000604565b600060209050601f83116001811462000717576000841562000702578287015190505b6200070e858262000681565b8655506200077e565b601f1984166200072786620004c3565b60005b8281101562000751578489015182556001820191506020850194506020810190506200072a565b868310156200077157848901516200076d601f89168262000661565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b620007c082620007a4565b810181811067ffffffffffffffff82111715620007e257620007e162000430565b5b80604052505050565b6000620007f762000786565b9050620008058282620007b5565b919050565b600067ffffffffffffffff82111562000828576200082762000430565b5b6200083382620007a4565b9050602081019050919050565b60005b838110156200086057808201518184015260208101905062000843565b60008484015250505050565b6000620008836200087d846200080a565b620007eb565b905082815260208101848484011115620008a257620008a16200079f565b5b620008af84828562000840565b509392505050565b600082601f830112620008cf57620008ce6200079a565b5b8151620008e18482602086016200086c565b91505092915050565b60008060006060848603121562000906576200090562000790565b5b600084015167ffffffffffffffff81111562000927576200092662000795565b5b6200093586828701620008b7565b935050602084015167ffffffffffffffff81111562000959576200095862000795565b5b6200096786828701620008b7565b925050604084015167ffffffffffffffff8111156200098b576200098a62000795565b5b6200099986828701620008b7565b9150509250925092565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620009d082620009a3565b9050919050565b620009e281620009c3565b82525050565b6000604082019050620009ff6000830185620009d7565b62000a0e6020830184620009d7565b9392505050565b600060208201905062000a2c6000830184620009d7565b92915050565b613fc18062000a426000396000f3fe60806040526004361061014b5760003560e01c806370a08231116100b6578063b88d4fde1161006f578063b88d4fde14610467578063c87b56dd14610483578063e6b2603b146104c0578063e985e9c5146104d7578063f0292a0314610514578063f2fde38b1461053f5761014b565b806370a082311461036b578063715018a6146103a85780638da5cb5b146103bf57806395d89b41146103ea578063a0712d6814610415578063a22cb4651461043e5761014b565b806323b872dd1161010857806323b872dd1461026757806325e514c61461028357806342842e0e146102ac578063438b6300146102c85780634460d3cf146103055780636352211e1461032e5761014b565b806301ffc9a71461015057806306fdde031461018d578063081812fc146101b8578063095ea7b3146101f55780630e5c9d531461021157806318160ddd1461023c575b600080fd5b34801561015c57600080fd5b50610177600480360381019061017291906126b1565b610568565b60405161018491906126f9565b60405180910390f35b34801561019957600080fd5b506101a26105fa565b6040516101af91906127a4565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da91906127fc565b61068c565b6040516101ec919061286a565b60405180910390f35b61020f600480360381019061020a91906128b1565b6106ea565b005b34801561021d57600080fd5b506102266106fa565b6040516102339190612900565b60405180910390f35b34801561024857600080fd5b50610251610700565b60405161025e9190612900565b60405180910390f35b610281600480360381019061027c919061291b565b61070a565b005b34801561028f57600080fd5b506102aa60048036038101906102a591906129d3565b61085a565b005b6102c660048036038101906102c1919061291b565b6109f2565b005b3480156102d457600080fd5b506102ef60048036038101906102ea9190612a20565b610b42565b6040516102fc9190612b0b565b60405180910390f35b34801561031157600080fd5b5061032c60048036038101906103279190612a20565b610c66565b005b34801561033a57600080fd5b50610355600480360381019061035091906127fc565b610d5d565b604051610362919061286a565b60405180910390f35b34801561037757600080fd5b50610392600480360381019061038d9190612a20565b610d6f565b60405161039f9190612900565b60405180910390f35b3480156103b457600080fd5b506103bd610e06565b005b3480156103cb57600080fd5b506103d4610e1a565b6040516103e1919061286a565b60405180910390f35b3480156103f657600080fd5b506103ff610e44565b60405161040c91906127a4565b60405180910390f35b34801561042157600080fd5b5061043c600480360381019061043791906127fc565b610ed6565b005b34801561044a57600080fd5b5061046560048036038101906104609190612b59565b610fc5565b005b610481600480360381019061047c9190612cc9565b6110d0565b005b34801561048f57600080fd5b506104aa60048036038101906104a591906127fc565b611223565b6040516104b791906127a4565b60405180910390f35b3480156104cc57600080fd5b506104d5611395565b005b3480156104e357600080fd5b506104fe60048036038101906104f99190612d4c565b6113e6565b60405161050b91906126f9565b60405180910390f35b34801561052057600080fd5b5061052961147a565b6040516105369190612900565b60405180910390f35b34801561054b57600080fd5b5061056660048036038101906105619190612a20565b611480565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105c357506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105f35750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461060990612dbb565b80601f016020809104026020016040519081016040528092919081815260200182805461063590612dbb565b80156106825780601f1061065757610100808354040283529160200191610682565b820191906000526020600020905b81548152906001019060200180831161066557829003601f168201915b5050505050905090565b600061069782611503565b6106ac576106ab63cf4700e460e01b61157c565b5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6106f682826001611586565b5050565b600a5481565b6000601154905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610848573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361077c576107778484846116b5565b610854565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016107c5929190612dec565b602060405180830381865afa1580156107e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108069190612e2a565b61084757336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161083e919061286a565b60405180910390fd5b5b6108538484846116b5565b5b50505050565b600a548282905011156108a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089990612ea3565b60405180910390fd5b600080600090505b838390508110156109a8576108d78484838181106108cb576108ca612ec3565b5b90506020020135611503565b6108e057600080fd5b3373ffffffffffffffffffffffffffffffffffffffff1661091985858481811061090d5761090c612ec3565b5b90506020020135610d5d565b73ffffffffffffffffffffffffffffffffffffffff161461093957600080fd5b600e60008585848181106109505761094f612ec3565b5b90506020020135815260200190815260200160002054826109719190612f21565b915061099584848381811061098957610988612ec3565b5b90506020020135611976565b80806109a090612f55565b9150506108aa565b506001601160008282546109bc9190612f21565b925050819055506109ce336001611984565b80600e60006109db610700565b815260200190815260200160002081905550505050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610b30573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a6457610a5f848484611ae7565b610b3c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610aad929190612dec565b602060405180830381865afa158015610aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aee9190612e2a565b610b2f57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610b26919061286a565b60405180910390fd5b5b610b3b848484611ae7565b5b50505050565b60606000610b4f83610d6f565b905060008167ffffffffffffffff811115610b6d57610b6c612b9e565b5b604051908082528060200260200182016040528015610b9b5781602001602082028036833780820191505090505b5090506000610ba8611b07565b905060005b8381108015610bc35750610bbf610700565b8211155b15610c5a576000610bd383611503565b15610be457610be183610d5d565b90505b8673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c465782848381518110610c2b57610c2a612ec3565b5b6020026020010181815250508180610c4290612f55565b9250505b8280610c5190612f55565b93505050610bad565b82945050505050919050565b610c6e611b10565b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610ca9919061286a565b602060405180830381865afa158015610cc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cea9190612fb2565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610d27929190612fdf565b600060405180830381600087803b158015610d4157600080fd5b505af1158015610d55573d6000803e3d6000fd5b505050505050565b6000610d6882611b8e565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610db557610db4638f4eb60460e01b61157c565b5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610e0e611b10565b610e186000611c7a565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610e5390612dbb565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7f90612dbb565b8015610ecc5780601f10610ea157610100808354040283529160200191610ecc565b820191906000526020600020905b815481529060010190602001808311610eaf57829003601f168201915b5050505050905090565b600f54601054610ee69190612f21565b4210610f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1e90613054565b60405180910390fd5b6009548111158015610f3a575060008114155b610f4357600080fd5b6000600190506000610f53610700565b90508260116000828254610f679190612f21565b92505081905550610f783384611984565b81600e6000600184610f8a9190612f21565b81526020019081526020016000208190555081600e6000600284610fae9190612f21565b815260200190815260200160002081905550505050565b8060076000610fd2611d40565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661107f611d40565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110c491906126f9565b60405180910390a35050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561120f573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111435761113e85858585611d48565b61121c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161118c929190612dec565b602060405180830381865afa1580156111a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111cd9190612e2a565b61120e57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611205919061286a565b60405180910390fd5b5b61121b85858585611d48565b5b5050505050565b606061122e82611503565b61126d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611264906130c0565b60405180910390fd5b6000600e6000848152602001908152602001600020549050600061128f611d9a565b61129883611e53565b6040516020016112a99291906133c8565b604051602081830303815290604052905060006112c582611fb3565b6040516020016112d5919061347a565b60405160208183030381529060405290506000600b6112f385611e53565b600c600d61130088611e53565b86604051602001611316969594939291906138c4565b6040516020818303038152906040529050600061133287612116565b9050600081836040516020016113499291906139c1565b6040516020818303038152906040529050600061136582611fb3565b9050806040516020016113789190613a31565b604051602081830303815290604052975050505050505050919050565b61139d611b10565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156113e3573d6000803e3d6000fd5b50565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60095481565b611488611b10565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ee90613ac5565b60405180910390fd5b61150081611c7a565b50565b60008161150e611b07565b11611577576000548210156115765760005b600060046000858152602001908152602001600020549150810361154f578261154890613ae5565b9250611520565b60007c01000000000000000000000000000000000000000000000000000000008216149150505b5b919050565b8060005260046000fd5b600061159183610d5d565b90508180156115d357508073ffffffffffffffffffffffffffffffffffffffff166115ba611d40565b73ffffffffffffffffffffffffffffffffffffffff1614155b156115ff576115e9816115e4611d40565b6113e6565b6115fe576115fd63cfb3b94260e01b61157c565b5b5b836006600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b60006116c082611b8e565b905073ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff161693508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117355761173463a114810060e01b61157c565b5b60008061174184612193565b915091506117578187611752611d40565b6121ba565b6117825761176c86611767611d40565b6113e6565b611781576117806359c896be60e01b61157c565b5b5b61178f86868660016121fe565b801561179a57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061186885611844888887612204565b7c02000000000000000000000000000000000000000000000000000000001761222c565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036118ee57600060018501905060006004600083815260200190815260200160002054036118ec5760005481146118eb578360046000838152602001908152602001600020819055505b5b505b600073ffffffffffffffffffffffffffffffffffffffff8673ffffffffffffffffffffffffffffffffffffffff161690508481887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600081036119605761195f63ea553b3460e01b61157c565b5b61196d8787876001612257565b50505050505050565b61198181600061225d565b50565b600080549050600082036119a3576119a263b562e8dd60e01b61157c565b5b6119b060008483856121fe565b6119d0836119c16000866000612204565b6119ca8561248e565b1761222c565b6004600083815260200190815260200160002081905550600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600073ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff1616905060008103611a8857611a87632e07630060e01b61157c565b5b6000838301905060008390505b808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4818160010191508103611a955781600081905550505050611ae26000848385612257565b505050565b611b02838383604051806020016040528060008152506110d0565b505050565b60006001905090565b611b1861249e565b73ffffffffffffffffffffffffffffffffffffffff16611b36610e1a565b73ffffffffffffffffffffffffffffffffffffffff1614611b8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8390613b5a565b60405180910390fd5b565b600081611b99611b07565b11611c64576004600083815260200190815260200160002054905060008103611c3b576000548210611bd657611bd563df2d9b4260e01b61157c565b5b5b60046000836001900393508381526020019081526020016000205490506000810315611c365760007c010000000000000000000000000000000000000000000000000000000082160315611c7557611c3563df2d9b4260e01b61157c565b5b611bd7565b60007c010000000000000000000000000000000000000000000000000000000082160315611c75575b611c7463df2d9b4260e01b61157c565b5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b611d5384848461070a565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611d9457611d7e848484846124a6565b611d9357611d9263d1a57ed660e01b61157c565b5b5b50505050565b606060004233611da8610700565b604051602001611dba93929190613be3565b6040516020818303038152906040528051906020012060001c9050611dea60ff82611de59190613c4f565b611e53565b611e0a60ff8084611dfb9190613c80565b611e059190613c4f565b611e53565b611e2c60ff61fe0185611e1d9190613c80565b611e279190613c4f565b611e53565b604051602001611e3e93929190613d95565b60405160208183030381529060405291505090565b606060008203611e9a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611fae565b600082905060005b60008214611ecc578080611eb590612f55565b915050600a82611ec59190613c80565b9150611ea2565b60008167ffffffffffffffff811115611ee857611ee7612b9e565b5b6040519080825280601f01601f191660200182016040528015611f1a5781602001600182028036833780820191505090505b5090505b60008514611fa757600182611f339190613df2565b9150600a85611f429190613c4f565b6030611f4e9190612f21565b60f81b818381518110611f6457611f63612ec3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611fa09190613c80565b9450611f1e565b8093505050505b919050565b60606000825103611fd557604051806020016040528060008152509050612111565b6000604051806060016040528060408152602001613f4c60409139905060006003600285516120049190612f21565b61200e9190613c80565b600461201a9190613e26565b67ffffffffffffffff81111561203357612032612b9e565b5b6040519080825280601f01601f1916602001820160405280156120655781602001600182028036833780820191505090505b509050600182016020820185865187015b808210156120d1576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845360018401935050612076565b50506003865106600181146120ed576002811461210057612108565b603d6001830353603d6002830353612108565b603d60018303535b50505080925050505b919050565b606061212182611503565b6121365761213563a14c4b5060e01b61157c565b5b60006121406125d5565b90506000815103612160576040518060200160405280600081525061218b565b8061216a846125ec565b60405160200161217b9291906139c1565b6040516020818303038152906040525b915050919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861221b86868461263c565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600061226883611b8e565b9050600081905060008061227b86612193565b9150915084156122c3576122978184612292611d40565b6121ba565b6122c2576122ac836122a7611d40565b6113e6565b6122c1576122c06359c896be60e01b61157c565b5b5b5b6122d18360008860016121fe565b80156122dc57600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506123848361234185600088612204565b7c02000000000000000000000000000000000000000000000000000000007c0100000000000000000000000000000000000000000000000000000000171761222c565b600460008881526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000085160361240a5760006001870190506000600460008381526020019081526020016000205403612408576000548114612407578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612474836000886001612257565b600160008154809291906001019190505550505050505050565b60006001821460e11b9050919050565b600033905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124cc611d40565b8786866040518563ffffffff1660e01b81526004016124ee9493929190613ebd565b6020604051808303816000875af192505050801561252a57506040513d601f19601f820116820180604052508101906125279190613f1e565b60015b612582573d806000811461255a576040519150601f19603f3d011682016040523d82523d6000602084013e61255f565b606091505b50600081510361257a5761257963d1a57ed660e01b61157c565b5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060405180602001604052806000815250905090565b606060a060405101806040526020810391506000825281835b60011561262757600184039350600a81066030018453600a8104905080612605575b50828103602084039350808452505050919050565b60009392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61268e81612659565b811461269957600080fd5b50565b6000813590506126ab81612685565b92915050565b6000602082840312156126c7576126c661264f565b5b60006126d58482850161269c565b91505092915050565b60008115159050919050565b6126f3816126de565b82525050565b600060208201905061270e60008301846126ea565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561274e578082015181840152602081019050612733565b60008484015250505050565b6000601f19601f8301169050919050565b600061277682612714565b612780818561271f565b9350612790818560208601612730565b6127998161275a565b840191505092915050565b600060208201905081810360008301526127be818461276b565b905092915050565b6000819050919050565b6127d9816127c6565b81146127e457600080fd5b50565b6000813590506127f6816127d0565b92915050565b6000602082840312156128125761281161264f565b5b6000612820848285016127e7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061285482612829565b9050919050565b61286481612849565b82525050565b600060208201905061287f600083018461285b565b92915050565b61288e81612849565b811461289957600080fd5b50565b6000813590506128ab81612885565b92915050565b600080604083850312156128c8576128c761264f565b5b60006128d68582860161289c565b92505060206128e7858286016127e7565b9150509250929050565b6128fa816127c6565b82525050565b600060208201905061291560008301846128f1565b92915050565b6000806000606084860312156129345761293361264f565b5b60006129428682870161289c565b93505060206129538682870161289c565b9250506040612964868287016127e7565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f8401126129935761299261296e565b5b8235905067ffffffffffffffff8111156129b0576129af612973565b5b6020830191508360208202830111156129cc576129cb612978565b5b9250929050565b600080602083850312156129ea576129e961264f565b5b600083013567ffffffffffffffff811115612a0857612a07612654565b5b612a148582860161297d565b92509250509250929050565b600060208284031215612a3657612a3561264f565b5b6000612a448482850161289c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612a82816127c6565b82525050565b6000612a948383612a79565b60208301905092915050565b6000602082019050919050565b6000612ab882612a4d565b612ac28185612a58565b9350612acd83612a69565b8060005b83811015612afe578151612ae58882612a88565b9750612af083612aa0565b925050600181019050612ad1565b5085935050505092915050565b60006020820190508181036000830152612b258184612aad565b905092915050565b612b36816126de565b8114612b4157600080fd5b50565b600081359050612b5381612b2d565b92915050565b60008060408385031215612b7057612b6f61264f565b5b6000612b7e8582860161289c565b9250506020612b8f85828601612b44565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612bd68261275a565b810181811067ffffffffffffffff82111715612bf557612bf4612b9e565b5b80604052505050565b6000612c08612645565b9050612c148282612bcd565b919050565b600067ffffffffffffffff821115612c3457612c33612b9e565b5b612c3d8261275a565b9050602081019050919050565b82818337600083830152505050565b6000612c6c612c6784612c19565b612bfe565b905082815260208101848484011115612c8857612c87612b99565b5b612c93848285612c4a565b509392505050565b600082601f830112612cb057612caf61296e565b5b8135612cc0848260208601612c59565b91505092915050565b60008060008060808587031215612ce357612ce261264f565b5b6000612cf18782880161289c565b9450506020612d028782880161289c565b9350506040612d13878288016127e7565b925050606085013567ffffffffffffffff811115612d3457612d33612654565b5b612d4087828801612c9b565b91505092959194509250565b60008060408385031215612d6357612d6261264f565b5b6000612d718582860161289c565b9250506020612d828582860161289c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612dd357607f821691505b602082108103612de657612de5612d8c565b5b50919050565b6000604082019050612e01600083018561285b565b612e0e602083018461285b565b9392505050565b600081519050612e2481612b2d565b92915050565b600060208284031215612e4057612e3f61264f565b5b6000612e4e84828501612e15565b91505092915050565b7f4572726f723a204d617820436f6d62696e65204f766572204c696d6974210000600082015250565b6000612e8d601e8361271f565b9150612e9882612e57565b602082019050919050565b60006020820190508181036000830152612ebc81612e80565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f2c826127c6565b9150612f37836127c6565b9250828201905080821115612f4f57612f4e612ef2565b5b92915050565b6000612f60826127c6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612f9257612f91612ef2565b5b600182019050919050565b600081519050612fac816127d0565b92915050565b600060208284031215612fc857612fc761264f565b5b6000612fd684828501612f9d565b91505092915050565b6000604082019050612ff4600083018561285b565b61300160208301846128f1565b9392505050565b7f4d696e74696e6720706572696f642068617320656e6465640000000000000000600082015250565b600061303e60188361271f565b915061304982613008565b602082019050919050565b6000602082019050818103600083015261306d81613031565b9050919050565b7f546f6b656e206d75737420657869737400000000000000000000000000000000600082015250565b60006130aa60108361271f565b91506130b582613074565b602082019050919050565b600060208201905081810360008301526130d98161309d565b9050919050565b600081905092915050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060008201527f30302f737667222077696474683d2236303022206865696768743d223630302260208201527f3e00000000000000000000000000000000000000000000000000000000000000604082015250565b600061316d6041836130e0565b9150613178826130eb565b604182019050919050565b7f3c7265637420783d22302220793d2230222077696474683d223630302220686560008201527f696768743d22363030222066696c6c3d22000000000000000000000000000000602082015250565b60006131df6031836130e0565b91506131ea82613183565b603182019050919050565b600061320082612714565b61320a81856130e0565b935061321a818560208601612730565b80840191505092915050565b7f222f3e0000000000000000000000000000000000000000000000000000000000600082015250565b600061325c6003836130e0565b915061326782613226565b600382019050919050565b7f3c7465787420783d223330302220793d223330302220666f6e742d73697a653d60008201527f223230302220746578742d616e63686f723d226d6964646c652220666f6e742d60208201527f66616d696c793d2242656261732b4e6575652220646f6d696e616e742d62617360408201527f656c696e653d2263656e7472616c222066696c6c3d227768697465223e000000606082015250565b600061331a607d836130e0565b915061332582613272565b607d82019050919050565b7f3c2f746578743e00000000000000000000000000000000000000000000000000600082015250565b60006133666007836130e0565b915061337182613330565b600782019050919050565b7f3c2f7376673e0000000000000000000000000000000000000000000000000000600082015250565b60006133b26006836130e0565b91506133bd8261337c565b600682019050919050565b60006133d382613160565b91506133de826131d2565b91506133ea82856131f5565b91506133f58261324f565b91506134008261330d565b915061340c82846131f5565b915061341782613359565b9150613422826133a5565b91508190509392505050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000600082015250565b6000613464601a836130e0565b915061346f8261342e565b601a82019050919050565b600061348582613457565b915061349182846131f5565b915081905092915050565b7f7b226e616d65223a220000000000000000000000000000000000000000000000600082015250565b60006134d26009836130e0565b91506134dd8261349c565b600982019050919050565b60008190508160005260206000209050919050565b6000815461350a81612dbb565b61351481866130e0565b9450600182166000811461352f576001811461354457613577565b60ff1983168652811515820286019350613577565b61354d856134e8565b60005b8381101561356f57815481890152600182019150602081019050613550565b838801955050505b50505092915050565b7f2300000000000000000000000000000000000000000000000000000000000000600082015250565b60006135b66001836130e0565b91506135c182613580565b600182019050919050565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b60006136026002836130e0565b915061360d826135cc565b600282019050919050565b7f226465736372697074696f6e223a220000000000000000000000000000000000600082015250565b600061364e600f836130e0565b915061365982613618565b600f82019050919050565b7f2261747472696275746573223a205b0000000000000000000000000000000000600082015250565b600061369a600f836130e0565b91506136a582613664565b600f82019050919050565b7f7b00000000000000000000000000000000000000000000000000000000000000600082015250565b60006136e66001836130e0565b91506136f1826136b0565b600182019050919050565b7f2274726169745f74797065223a20220000000000000000000000000000000000600082015250565b6000613732600f836130e0565b915061373d826136fc565b600f82019050919050565b7f2276616c7565223a000000000000000000000000000000000000000000000000600082015250565b600061377e6008836130e0565b915061378982613748565b600882019050919050565b7f7d00000000000000000000000000000000000000000000000000000000000000600082015250565b60006137ca6001836130e0565b91506137d582613794565b600182019050919050565b7f5d2c000000000000000000000000000000000000000000000000000000000000600082015250565b60006138166002836130e0565b9150613821826137e0565b600282019050919050565b7f22696d616765223a220000000000000000000000000000000000000000000000600082015250565b60006138626009836130e0565b915061386d8261382c565b600982019050919050565b7f2200000000000000000000000000000000000000000000000000000000000000600082015250565b60006138ae6001836130e0565b91506138b982613878565b600182019050919050565b60006138cf826134c5565b91506138db82896134fd565b91506138e6826135a9565b91506138f282886131f5565b91506138fd826135f5565b915061390882613641565b915061391482876134fd565b915061391f826135f5565b915061392a8261368d565b9150613935826136d9565b915061394082613725565b915061394c82866134fd565b9150613957826135f5565b915061396282613771565b915061396e82856131f5565b9150613979826137bd565b915061398482613809565b915061398f82613855565b915061399b82846131f5565b91506139a6826138a1565b91506139b1826137bd565b9150819050979650505050505050565b60006139cd82856131f5565b91506139d982846131f5565b91508190509392505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b6000613a1b601d836130e0565b9150613a26826139e5565b601d82019050919050565b6000613a3c82613a0e565b9150613a4882846131f5565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613aaf60268361271f565b9150613aba82613a53565b604082019050919050565b60006020820190508181036000830152613ade81613aa2565b9050919050565b6000613af0826127c6565b915060008203613b0357613b02612ef2565b5b600182039050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613b4460208361271f565b9150613b4f82613b0e565b602082019050919050565b60006020820190508181036000830152613b7381613b37565b9050919050565b6000819050919050565b613b95613b90826127c6565b613b7a565b82525050565b60008160601b9050919050565b6000613bb382613b9b565b9050919050565b6000613bc582613ba8565b9050919050565b613bdd613bd882612849565b613bba565b82525050565b6000613bef8286613b84565b602082019150613bff8285613bcc565b601482019150613c0f8284613b84565b602082019150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613c5a826127c6565b9150613c65836127c6565b925082613c7557613c74613c20565b5b828206905092915050565b6000613c8b826127c6565b9150613c96836127c6565b925082613ca657613ca5613c20565b5b828204905092915050565b7f7267622800000000000000000000000000000000000000000000000000000000600082015250565b6000613ce76004836130e0565b9150613cf282613cb1565b600482019050919050565b7f2c00000000000000000000000000000000000000000000000000000000000000600082015250565b6000613d336001836130e0565b9150613d3e82613cfd565b600182019050919050565b7f2900000000000000000000000000000000000000000000000000000000000000600082015250565b6000613d7f6001836130e0565b9150613d8a82613d49565b600182019050919050565b6000613da082613cda565b9150613dac82866131f5565b9150613db782613d26565b9150613dc382856131f5565b9150613dce82613d26565b9150613dda82846131f5565b9150613de582613d72565b9150819050949350505050565b6000613dfd826127c6565b9150613e08836127c6565b9250828203905081811115613e2057613e1f612ef2565b5b92915050565b6000613e31826127c6565b9150613e3c836127c6565b9250828202613e4a816127c6565b91508282048414831517613e6157613e60612ef2565b5b5092915050565b600081519050919050565b600082825260208201905092915050565b6000613e8f82613e68565b613e998185613e73565b9350613ea9818560208601612730565b613eb28161275a565b840191505092915050565b6000608082019050613ed2600083018761285b565b613edf602083018661285b565b613eec60408301856128f1565b8181036060830152613efe8184613e84565b905095945050505050565b600081519050613f1881612685565b92915050565b600060208284031215613f3457613f3361264f565b5b6000613f4284828501613f09565b9150509291505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220b88571e73a8a620e3bb897ef5d8c8254b2eb56ec9af6864a65260f7175947b5464736f6c634300081300334e756d62337220426c6f636b3520697320616e204f70656e2045646974696f6e2d487962726964207468617420636f6d62696e6573204552432d3732312026204552432d3131353520736d61727420636f6e74726163742066756e6374696f6e616c69746965732e2054686520726573756c74696e6720636f6e747261637420686173206d697865642066756e6374696f6e732066726f6d20626f74682076617269616e74732c20612032342d4872206d696e7420706572696f642077697468206e6f206d696e7420636170202b20616e206172726179206f66206e657720756e69717565206361706162696c6974696573207468617420616c6c6f777320666f722074686520636f6d62696e6174696f6e206f6620426c6f636b35206261736564206f6e206e756d65726963616c2076616c7565732063616c63756c6174656420262063726561746564206469726563746c79206f6e2d636861696e2e205468652068696768657220746865204e756d6233722c207468652068696768657220746865205261726974792e000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000d4e756d62337220426c6f636b35000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006424c4f434b3500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061014b5760003560e01c806370a08231116100b6578063b88d4fde1161006f578063b88d4fde14610467578063c87b56dd14610483578063e6b2603b146104c0578063e985e9c5146104d7578063f0292a0314610514578063f2fde38b1461053f5761014b565b806370a082311461036b578063715018a6146103a85780638da5cb5b146103bf57806395d89b41146103ea578063a0712d6814610415578063a22cb4651461043e5761014b565b806323b872dd1161010857806323b872dd1461026757806325e514c61461028357806342842e0e146102ac578063438b6300146102c85780634460d3cf146103055780636352211e1461032e5761014b565b806301ffc9a71461015057806306fdde031461018d578063081812fc146101b8578063095ea7b3146101f55780630e5c9d531461021157806318160ddd1461023c575b600080fd5b34801561015c57600080fd5b50610177600480360381019061017291906126b1565b610568565b60405161018491906126f9565b60405180910390f35b34801561019957600080fd5b506101a26105fa565b6040516101af91906127a4565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da91906127fc565b61068c565b6040516101ec919061286a565b60405180910390f35b61020f600480360381019061020a91906128b1565b6106ea565b005b34801561021d57600080fd5b506102266106fa565b6040516102339190612900565b60405180910390f35b34801561024857600080fd5b50610251610700565b60405161025e9190612900565b60405180910390f35b610281600480360381019061027c919061291b565b61070a565b005b34801561028f57600080fd5b506102aa60048036038101906102a591906129d3565b61085a565b005b6102c660048036038101906102c1919061291b565b6109f2565b005b3480156102d457600080fd5b506102ef60048036038101906102ea9190612a20565b610b42565b6040516102fc9190612b0b565b60405180910390f35b34801561031157600080fd5b5061032c60048036038101906103279190612a20565b610c66565b005b34801561033a57600080fd5b50610355600480360381019061035091906127fc565b610d5d565b604051610362919061286a565b60405180910390f35b34801561037757600080fd5b50610392600480360381019061038d9190612a20565b610d6f565b60405161039f9190612900565b60405180910390f35b3480156103b457600080fd5b506103bd610e06565b005b3480156103cb57600080fd5b506103d4610e1a565b6040516103e1919061286a565b60405180910390f35b3480156103f657600080fd5b506103ff610e44565b60405161040c91906127a4565b60405180910390f35b34801561042157600080fd5b5061043c600480360381019061043791906127fc565b610ed6565b005b34801561044a57600080fd5b5061046560048036038101906104609190612b59565b610fc5565b005b610481600480360381019061047c9190612cc9565b6110d0565b005b34801561048f57600080fd5b506104aa60048036038101906104a591906127fc565b611223565b6040516104b791906127a4565b60405180910390f35b3480156104cc57600080fd5b506104d5611395565b005b3480156104e357600080fd5b506104fe60048036038101906104f99190612d4c565b6113e6565b60405161050b91906126f9565b60405180910390f35b34801561052057600080fd5b5061052961147a565b6040516105369190612900565b60405180910390f35b34801561054b57600080fd5b5061056660048036038101906105619190612a20565b611480565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105c357506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105f35750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461060990612dbb565b80601f016020809104026020016040519081016040528092919081815260200182805461063590612dbb565b80156106825780601f1061065757610100808354040283529160200191610682565b820191906000526020600020905b81548152906001019060200180831161066557829003601f168201915b5050505050905090565b600061069782611503565b6106ac576106ab63cf4700e460e01b61157c565b5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6106f682826001611586565b5050565b600a5481565b6000601154905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610848573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361077c576107778484846116b5565b610854565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016107c5929190612dec565b602060405180830381865afa1580156107e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108069190612e2a565b61084757336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161083e919061286a565b60405180910390fd5b5b6108538484846116b5565b5b50505050565b600a548282905011156108a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089990612ea3565b60405180910390fd5b600080600090505b838390508110156109a8576108d78484838181106108cb576108ca612ec3565b5b90506020020135611503565b6108e057600080fd5b3373ffffffffffffffffffffffffffffffffffffffff1661091985858481811061090d5761090c612ec3565b5b90506020020135610d5d565b73ffffffffffffffffffffffffffffffffffffffff161461093957600080fd5b600e60008585848181106109505761094f612ec3565b5b90506020020135815260200190815260200160002054826109719190612f21565b915061099584848381811061098957610988612ec3565b5b90506020020135611976565b80806109a090612f55565b9150506108aa565b506001601160008282546109bc9190612f21565b925050819055506109ce336001611984565b80600e60006109db610700565b815260200190815260200160002081905550505050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610b30573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a6457610a5f848484611ae7565b610b3c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610aad929190612dec565b602060405180830381865afa158015610aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aee9190612e2a565b610b2f57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610b26919061286a565b60405180910390fd5b5b610b3b848484611ae7565b5b50505050565b60606000610b4f83610d6f565b905060008167ffffffffffffffff811115610b6d57610b6c612b9e565b5b604051908082528060200260200182016040528015610b9b5781602001602082028036833780820191505090505b5090506000610ba8611b07565b905060005b8381108015610bc35750610bbf610700565b8211155b15610c5a576000610bd383611503565b15610be457610be183610d5d565b90505b8673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c465782848381518110610c2b57610c2a612ec3565b5b6020026020010181815250508180610c4290612f55565b9250505b8280610c5190612f55565b93505050610bad565b82945050505050919050565b610c6e611b10565b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610ca9919061286a565b602060405180830381865afa158015610cc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cea9190612fb2565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610d27929190612fdf565b600060405180830381600087803b158015610d4157600080fd5b505af1158015610d55573d6000803e3d6000fd5b505050505050565b6000610d6882611b8e565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610db557610db4638f4eb60460e01b61157c565b5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610e0e611b10565b610e186000611c7a565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610e5390612dbb565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7f90612dbb565b8015610ecc5780601f10610ea157610100808354040283529160200191610ecc565b820191906000526020600020905b815481529060010190602001808311610eaf57829003601f168201915b5050505050905090565b600f54601054610ee69190612f21565b4210610f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1e90613054565b60405180910390fd5b6009548111158015610f3a575060008114155b610f4357600080fd5b6000600190506000610f53610700565b90508260116000828254610f679190612f21565b92505081905550610f783384611984565b81600e6000600184610f8a9190612f21565b81526020019081526020016000208190555081600e6000600284610fae9190612f21565b815260200190815260200160002081905550505050565b8060076000610fd2611d40565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661107f611d40565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110c491906126f9565b60405180910390a35050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561120f573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111435761113e85858585611d48565b61121c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161118c929190612dec565b602060405180830381865afa1580156111a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111cd9190612e2a565b61120e57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611205919061286a565b60405180910390fd5b5b61121b85858585611d48565b5b5050505050565b606061122e82611503565b61126d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611264906130c0565b60405180910390fd5b6000600e6000848152602001908152602001600020549050600061128f611d9a565b61129883611e53565b6040516020016112a99291906133c8565b604051602081830303815290604052905060006112c582611fb3565b6040516020016112d5919061347a565b60405160208183030381529060405290506000600b6112f385611e53565b600c600d61130088611e53565b86604051602001611316969594939291906138c4565b6040516020818303038152906040529050600061133287612116565b9050600081836040516020016113499291906139c1565b6040516020818303038152906040529050600061136582611fb3565b9050806040516020016113789190613a31565b604051602081830303815290604052975050505050505050919050565b61139d611b10565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156113e3573d6000803e3d6000fd5b50565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60095481565b611488611b10565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ee90613ac5565b60405180910390fd5b61150081611c7a565b50565b60008161150e611b07565b11611577576000548210156115765760005b600060046000858152602001908152602001600020549150810361154f578261154890613ae5565b9250611520565b60007c01000000000000000000000000000000000000000000000000000000008216149150505b5b919050565b8060005260046000fd5b600061159183610d5d565b90508180156115d357508073ffffffffffffffffffffffffffffffffffffffff166115ba611d40565b73ffffffffffffffffffffffffffffffffffffffff1614155b156115ff576115e9816115e4611d40565b6113e6565b6115fe576115fd63cfb3b94260e01b61157c565b5b5b836006600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b60006116c082611b8e565b905073ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff161693508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117355761173463a114810060e01b61157c565b5b60008061174184612193565b915091506117578187611752611d40565b6121ba565b6117825761176c86611767611d40565b6113e6565b611781576117806359c896be60e01b61157c565b5b5b61178f86868660016121fe565b801561179a57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061186885611844888887612204565b7c02000000000000000000000000000000000000000000000000000000001761222c565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036118ee57600060018501905060006004600083815260200190815260200160002054036118ec5760005481146118eb578360046000838152602001908152602001600020819055505b5b505b600073ffffffffffffffffffffffffffffffffffffffff8673ffffffffffffffffffffffffffffffffffffffff161690508481887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600081036119605761195f63ea553b3460e01b61157c565b5b61196d8787876001612257565b50505050505050565b61198181600061225d565b50565b600080549050600082036119a3576119a263b562e8dd60e01b61157c565b5b6119b060008483856121fe565b6119d0836119c16000866000612204565b6119ca8561248e565b1761222c565b6004600083815260200190815260200160002081905550600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600073ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff1616905060008103611a8857611a87632e07630060e01b61157c565b5b6000838301905060008390505b808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4818160010191508103611a955781600081905550505050611ae26000848385612257565b505050565b611b02838383604051806020016040528060008152506110d0565b505050565b60006001905090565b611b1861249e565b73ffffffffffffffffffffffffffffffffffffffff16611b36610e1a565b73ffffffffffffffffffffffffffffffffffffffff1614611b8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8390613b5a565b60405180910390fd5b565b600081611b99611b07565b11611c64576004600083815260200190815260200160002054905060008103611c3b576000548210611bd657611bd563df2d9b4260e01b61157c565b5b5b60046000836001900393508381526020019081526020016000205490506000810315611c365760007c010000000000000000000000000000000000000000000000000000000082160315611c7557611c3563df2d9b4260e01b61157c565b5b611bd7565b60007c010000000000000000000000000000000000000000000000000000000082160315611c75575b611c7463df2d9b4260e01b61157c565b5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b611d5384848461070a565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611d9457611d7e848484846124a6565b611d9357611d9263d1a57ed660e01b61157c565b5b5b50505050565b606060004233611da8610700565b604051602001611dba93929190613be3565b6040516020818303038152906040528051906020012060001c9050611dea60ff82611de59190613c4f565b611e53565b611e0a60ff8084611dfb9190613c80565b611e059190613c4f565b611e53565b611e2c60ff61fe0185611e1d9190613c80565b611e279190613c4f565b611e53565b604051602001611e3e93929190613d95565b60405160208183030381529060405291505090565b606060008203611e9a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611fae565b600082905060005b60008214611ecc578080611eb590612f55565b915050600a82611ec59190613c80565b9150611ea2565b60008167ffffffffffffffff811115611ee857611ee7612b9e565b5b6040519080825280601f01601f191660200182016040528015611f1a5781602001600182028036833780820191505090505b5090505b60008514611fa757600182611f339190613df2565b9150600a85611f429190613c4f565b6030611f4e9190612f21565b60f81b818381518110611f6457611f63612ec3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611fa09190613c80565b9450611f1e565b8093505050505b919050565b60606000825103611fd557604051806020016040528060008152509050612111565b6000604051806060016040528060408152602001613f4c60409139905060006003600285516120049190612f21565b61200e9190613c80565b600461201a9190613e26565b67ffffffffffffffff81111561203357612032612b9e565b5b6040519080825280601f01601f1916602001820160405280156120655781602001600182028036833780820191505090505b509050600182016020820185865187015b808210156120d1576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845360018401935050612076565b50506003865106600181146120ed576002811461210057612108565b603d6001830353603d6002830353612108565b603d60018303535b50505080925050505b919050565b606061212182611503565b6121365761213563a14c4b5060e01b61157c565b5b60006121406125d5565b90506000815103612160576040518060200160405280600081525061218b565b8061216a846125ec565b60405160200161217b9291906139c1565b6040516020818303038152906040525b915050919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861221b86868461263c565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600061226883611b8e565b9050600081905060008061227b86612193565b9150915084156122c3576122978184612292611d40565b6121ba565b6122c2576122ac836122a7611d40565b6113e6565b6122c1576122c06359c896be60e01b61157c565b5b5b5b6122d18360008860016121fe565b80156122dc57600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506123848361234185600088612204565b7c02000000000000000000000000000000000000000000000000000000007c0100000000000000000000000000000000000000000000000000000000171761222c565b600460008881526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000085160361240a5760006001870190506000600460008381526020019081526020016000205403612408576000548114612407578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612474836000886001612257565b600160008154809291906001019190505550505050505050565b60006001821460e11b9050919050565b600033905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124cc611d40565b8786866040518563ffffffff1660e01b81526004016124ee9493929190613ebd565b6020604051808303816000875af192505050801561252a57506040513d601f19601f820116820180604052508101906125279190613f1e565b60015b612582573d806000811461255a576040519150601f19603f3d011682016040523d82523d6000602084013e61255f565b606091505b50600081510361257a5761257963d1a57ed660e01b61157c565b5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060405180602001604052806000815250905090565b606060a060405101806040526020810391506000825281835b60011561262757600184039350600a81066030018453600a8104905080612605575b50828103602084039350808452505050919050565b60009392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61268e81612659565b811461269957600080fd5b50565b6000813590506126ab81612685565b92915050565b6000602082840312156126c7576126c661264f565b5b60006126d58482850161269c565b91505092915050565b60008115159050919050565b6126f3816126de565b82525050565b600060208201905061270e60008301846126ea565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561274e578082015181840152602081019050612733565b60008484015250505050565b6000601f19601f8301169050919050565b600061277682612714565b612780818561271f565b9350612790818560208601612730565b6127998161275a565b840191505092915050565b600060208201905081810360008301526127be818461276b565b905092915050565b6000819050919050565b6127d9816127c6565b81146127e457600080fd5b50565b6000813590506127f6816127d0565b92915050565b6000602082840312156128125761281161264f565b5b6000612820848285016127e7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061285482612829565b9050919050565b61286481612849565b82525050565b600060208201905061287f600083018461285b565b92915050565b61288e81612849565b811461289957600080fd5b50565b6000813590506128ab81612885565b92915050565b600080604083850312156128c8576128c761264f565b5b60006128d68582860161289c565b92505060206128e7858286016127e7565b9150509250929050565b6128fa816127c6565b82525050565b600060208201905061291560008301846128f1565b92915050565b6000806000606084860312156129345761293361264f565b5b60006129428682870161289c565b93505060206129538682870161289c565b9250506040612964868287016127e7565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f8401126129935761299261296e565b5b8235905067ffffffffffffffff8111156129b0576129af612973565b5b6020830191508360208202830111156129cc576129cb612978565b5b9250929050565b600080602083850312156129ea576129e961264f565b5b600083013567ffffffffffffffff811115612a0857612a07612654565b5b612a148582860161297d565b92509250509250929050565b600060208284031215612a3657612a3561264f565b5b6000612a448482850161289c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612a82816127c6565b82525050565b6000612a948383612a79565b60208301905092915050565b6000602082019050919050565b6000612ab882612a4d565b612ac28185612a58565b9350612acd83612a69565b8060005b83811015612afe578151612ae58882612a88565b9750612af083612aa0565b925050600181019050612ad1565b5085935050505092915050565b60006020820190508181036000830152612b258184612aad565b905092915050565b612b36816126de565b8114612b4157600080fd5b50565b600081359050612b5381612b2d565b92915050565b60008060408385031215612b7057612b6f61264f565b5b6000612b7e8582860161289c565b9250506020612b8f85828601612b44565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612bd68261275a565b810181811067ffffffffffffffff82111715612bf557612bf4612b9e565b5b80604052505050565b6000612c08612645565b9050612c148282612bcd565b919050565b600067ffffffffffffffff821115612c3457612c33612b9e565b5b612c3d8261275a565b9050602081019050919050565b82818337600083830152505050565b6000612c6c612c6784612c19565b612bfe565b905082815260208101848484011115612c8857612c87612b99565b5b612c93848285612c4a565b509392505050565b600082601f830112612cb057612caf61296e565b5b8135612cc0848260208601612c59565b91505092915050565b60008060008060808587031215612ce357612ce261264f565b5b6000612cf18782880161289c565b9450506020612d028782880161289c565b9350506040612d13878288016127e7565b925050606085013567ffffffffffffffff811115612d3457612d33612654565b5b612d4087828801612c9b565b91505092959194509250565b60008060408385031215612d6357612d6261264f565b5b6000612d718582860161289c565b9250506020612d828582860161289c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612dd357607f821691505b602082108103612de657612de5612d8c565b5b50919050565b6000604082019050612e01600083018561285b565b612e0e602083018461285b565b9392505050565b600081519050612e2481612b2d565b92915050565b600060208284031215612e4057612e3f61264f565b5b6000612e4e84828501612e15565b91505092915050565b7f4572726f723a204d617820436f6d62696e65204f766572204c696d6974210000600082015250565b6000612e8d601e8361271f565b9150612e9882612e57565b602082019050919050565b60006020820190508181036000830152612ebc81612e80565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f2c826127c6565b9150612f37836127c6565b9250828201905080821115612f4f57612f4e612ef2565b5b92915050565b6000612f60826127c6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612f9257612f91612ef2565b5b600182019050919050565b600081519050612fac816127d0565b92915050565b600060208284031215612fc857612fc761264f565b5b6000612fd684828501612f9d565b91505092915050565b6000604082019050612ff4600083018561285b565b61300160208301846128f1565b9392505050565b7f4d696e74696e6720706572696f642068617320656e6465640000000000000000600082015250565b600061303e60188361271f565b915061304982613008565b602082019050919050565b6000602082019050818103600083015261306d81613031565b9050919050565b7f546f6b656e206d75737420657869737400000000000000000000000000000000600082015250565b60006130aa60108361271f565b91506130b582613074565b602082019050919050565b600060208201905081810360008301526130d98161309d565b9050919050565b600081905092915050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060008201527f30302f737667222077696474683d2236303022206865696768743d223630302260208201527f3e00000000000000000000000000000000000000000000000000000000000000604082015250565b600061316d6041836130e0565b9150613178826130eb565b604182019050919050565b7f3c7265637420783d22302220793d2230222077696474683d223630302220686560008201527f696768743d22363030222066696c6c3d22000000000000000000000000000000602082015250565b60006131df6031836130e0565b91506131ea82613183565b603182019050919050565b600061320082612714565b61320a81856130e0565b935061321a818560208601612730565b80840191505092915050565b7f222f3e0000000000000000000000000000000000000000000000000000000000600082015250565b600061325c6003836130e0565b915061326782613226565b600382019050919050565b7f3c7465787420783d223330302220793d223330302220666f6e742d73697a653d60008201527f223230302220746578742d616e63686f723d226d6964646c652220666f6e742d60208201527f66616d696c793d2242656261732b4e6575652220646f6d696e616e742d62617360408201527f656c696e653d2263656e7472616c222066696c6c3d227768697465223e000000606082015250565b600061331a607d836130e0565b915061332582613272565b607d82019050919050565b7f3c2f746578743e00000000000000000000000000000000000000000000000000600082015250565b60006133666007836130e0565b915061337182613330565b600782019050919050565b7f3c2f7376673e0000000000000000000000000000000000000000000000000000600082015250565b60006133b26006836130e0565b91506133bd8261337c565b600682019050919050565b60006133d382613160565b91506133de826131d2565b91506133ea82856131f5565b91506133f58261324f565b91506134008261330d565b915061340c82846131f5565b915061341782613359565b9150613422826133a5565b91508190509392505050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000600082015250565b6000613464601a836130e0565b915061346f8261342e565b601a82019050919050565b600061348582613457565b915061349182846131f5565b915081905092915050565b7f7b226e616d65223a220000000000000000000000000000000000000000000000600082015250565b60006134d26009836130e0565b91506134dd8261349c565b600982019050919050565b60008190508160005260206000209050919050565b6000815461350a81612dbb565b61351481866130e0565b9450600182166000811461352f576001811461354457613577565b60ff1983168652811515820286019350613577565b61354d856134e8565b60005b8381101561356f57815481890152600182019150602081019050613550565b838801955050505b50505092915050565b7f2300000000000000000000000000000000000000000000000000000000000000600082015250565b60006135b66001836130e0565b91506135c182613580565b600182019050919050565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b60006136026002836130e0565b915061360d826135cc565b600282019050919050565b7f226465736372697074696f6e223a220000000000000000000000000000000000600082015250565b600061364e600f836130e0565b915061365982613618565b600f82019050919050565b7f2261747472696275746573223a205b0000000000000000000000000000000000600082015250565b600061369a600f836130e0565b91506136a582613664565b600f82019050919050565b7f7b00000000000000000000000000000000000000000000000000000000000000600082015250565b60006136e66001836130e0565b91506136f1826136b0565b600182019050919050565b7f2274726169745f74797065223a20220000000000000000000000000000000000600082015250565b6000613732600f836130e0565b915061373d826136fc565b600f82019050919050565b7f2276616c7565223a000000000000000000000000000000000000000000000000600082015250565b600061377e6008836130e0565b915061378982613748565b600882019050919050565b7f7d00000000000000000000000000000000000000000000000000000000000000600082015250565b60006137ca6001836130e0565b91506137d582613794565b600182019050919050565b7f5d2c000000000000000000000000000000000000000000000000000000000000600082015250565b60006138166002836130e0565b9150613821826137e0565b600282019050919050565b7f22696d616765223a220000000000000000000000000000000000000000000000600082015250565b60006138626009836130e0565b915061386d8261382c565b600982019050919050565b7f2200000000000000000000000000000000000000000000000000000000000000600082015250565b60006138ae6001836130e0565b91506138b982613878565b600182019050919050565b60006138cf826134c5565b91506138db82896134fd565b91506138e6826135a9565b91506138f282886131f5565b91506138fd826135f5565b915061390882613641565b915061391482876134fd565b915061391f826135f5565b915061392a8261368d565b9150613935826136d9565b915061394082613725565b915061394c82866134fd565b9150613957826135f5565b915061396282613771565b915061396e82856131f5565b9150613979826137bd565b915061398482613809565b915061398f82613855565b915061399b82846131f5565b91506139a6826138a1565b91506139b1826137bd565b9150819050979650505050505050565b60006139cd82856131f5565b91506139d982846131f5565b91508190509392505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b6000613a1b601d836130e0565b9150613a26826139e5565b601d82019050919050565b6000613a3c82613a0e565b9150613a4882846131f5565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613aaf60268361271f565b9150613aba82613a53565b604082019050919050565b60006020820190508181036000830152613ade81613aa2565b9050919050565b6000613af0826127c6565b915060008203613b0357613b02612ef2565b5b600182039050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613b4460208361271f565b9150613b4f82613b0e565b602082019050919050565b60006020820190508181036000830152613b7381613b37565b9050919050565b6000819050919050565b613b95613b90826127c6565b613b7a565b82525050565b60008160601b9050919050565b6000613bb382613b9b565b9050919050565b6000613bc582613ba8565b9050919050565b613bdd613bd882612849565b613bba565b82525050565b6000613bef8286613b84565b602082019150613bff8285613bcc565b601482019150613c0f8284613b84565b602082019150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613c5a826127c6565b9150613c65836127c6565b925082613c7557613c74613c20565b5b828206905092915050565b6000613c8b826127c6565b9150613c96836127c6565b925082613ca657613ca5613c20565b5b828204905092915050565b7f7267622800000000000000000000000000000000000000000000000000000000600082015250565b6000613ce76004836130e0565b9150613cf282613cb1565b600482019050919050565b7f2c00000000000000000000000000000000000000000000000000000000000000600082015250565b6000613d336001836130e0565b9150613d3e82613cfd565b600182019050919050565b7f2900000000000000000000000000000000000000000000000000000000000000600082015250565b6000613d7f6001836130e0565b9150613d8a82613d49565b600182019050919050565b6000613da082613cda565b9150613dac82866131f5565b9150613db782613d26565b9150613dc382856131f5565b9150613dce82613d26565b9150613dda82846131f5565b9150613de582613d72565b9150819050949350505050565b6000613dfd826127c6565b9150613e08836127c6565b9250828203905081811115613e2057613e1f612ef2565b5b92915050565b6000613e31826127c6565b9150613e3c836127c6565b9250828202613e4a816127c6565b91508282048414831517613e6157613e60612ef2565b5b5092915050565b600081519050919050565b600082825260208201905092915050565b6000613e8f82613e68565b613e998185613e73565b9350613ea9818560208601612730565b613eb28161275a565b840191505092915050565b6000608082019050613ed2600083018761285b565b613edf602083018661285b565b613eec60408301856128f1565b8181036060830152613efe8184613e84565b905095945050505050565b600081519050613f1881612685565b92915050565b600060208284031215613f3457613f3361264f565b5b6000613f4284828501613f09565b9150509291505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220b88571e73a8a620e3bb897ef5d8c8254b2eb56ec9af6864a65260f7175947b5464736f6c63430008130033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000d4e756d62337220426c6f636b35000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006424c4f434b3500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Numb3r Block5
Arg [1] : symbol (string): BLOCK5
Arg [2] : traitType (string):

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [4] : 4e756d62337220426c6f636b3500000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [6] : 424c4f434b350000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

61990:7445:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26722:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27624:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34658:227;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34375:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62100:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68223:111;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68819:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63957:628;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68998:179;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66802:871;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68427:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29026:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24550:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;860:103;;;;;;;;;;;;;:::i;:::-;;625:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27800:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63420:504;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35225:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69185:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64983:1811;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68618:112;;;;;;;;;;;;;:::i;:::-;;35616:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62066:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;971:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26722:639;26807:4;27146:10;27131:25;;:11;:25;;;;:102;;;;27223:10;27208:25;;:11;:25;;;;27131:102;:179;;;;27300:10;27285:25;;:11;:25;;;;27131:179;27111:199;;26722:639;;;:::o;27624:100::-;27678:13;27711:5;27704:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27624:100;:::o;34658:227::-;34734:7;34759:16;34767:7;34759;:16::i;:::-;34754:73;;34777:50;34785:41;;;34777:7;:50::i;:::-;34754:73;34847:15;:24;34863:7;34847:24;;;;;;;;;;;:30;;;;;;;;;;;;34840:37;;34658:227;;;:::o;34375:124::-;34464:27;34473:2;34477:7;34486:4;34464:8;:27::i;:::-;34375:124;;:::o;62100:30::-;;;;:::o;68223:111::-;68284:7;68311:15;;68304:22;;68223:111;:::o;68819:171::-;68928:4;7836:1;6917:42;7788:45;;;:49;7784:539;;;8077:10;8069:18;;:4;:18;;;8065:85;;68945:37:::1;68964:4;68970:2;68974:7;68945:18;:37::i;:::-;8128:7:::0;;8065:85;6917:42;8169;;;8220:4;8227:10;8169:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8164:148;;8285:10;8266:30;;;;;;;;;;;:::i;:::-;;;;;;;;8164:148;7784:539;68945:37:::1;68964:4;68970:2;68974:7;68945:18;:37::i;:::-;68819:171:::0;;;;;:::o;63957:628::-;64052:11;;64034:8;;:15;;:29;64031:74;;;64065:40;;;;;;;;;;:::i;:::-;;;;;;;;64031:74;64155:20;64192:6;64201:1;64192:10;;64188:243;64208:8;;:15;;64204:1;:19;64188:243;;;64253:20;64261:8;;64270:1;64261:11;;;;;;;:::i;:::-;;;;;;;;64253:7;:20::i;:::-;64245:29;;;;;;64321:10;64297:34;;:20;64305:8;;64314:1;64305:11;;;;;;;:::i;:::-;;;;;;;;64297:7;:20::i;:::-;:34;;;64289:43;;;;;;64363:10;:23;64374:8;;64383:1;64374:11;;;;;;;:::i;:::-;;;;;;;;64363:23;;;;;;;;;;;;64347:39;;;;;:::i;:::-;;;64401:18;64407:8;;64416:1;64407:11;;;;;;;:::i;:::-;;;;;;;;64401:5;:18::i;:::-;64225:3;;;;;:::i;:::-;;;;64188:243;;;;64462:1;64443:15;;:20;;;;;;;:::i;:::-;;;;;;;;64474:19;64480:10;64491:1;64474:5;:19::i;:::-;64563:12;64535:10;:25;64546:13;:11;:13::i;:::-;64535:25;;;;;;;;;;;:40;;;;64010:575;63957:628;;:::o;68998:179::-;69111:4;7836:1;6917:42;7788:45;;;:49;7784:539;;;8077:10;8069:18;;:4;:18;;;8065:85;;69128:41:::1;69151:4;69157:2;69161:7;69128:22;:41::i;:::-;8128:7:::0;;8065:85;6917:42;8169;;;8220:4;8227:10;8169:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8164:148;;8285:10;8266:30;;;;;;;;;;;:::i;:::-;;;;;;;;8164:148;7784:539;69128:41:::1;69151:4;69157:2;69161:7;69128:22;:41::i;:::-;68998:179:::0;;;;;:::o;66802:871::-;66889:16;66923:23;66949:17;66959:6;66949:9;:17::i;:::-;66923:43;;66977:30;67024:15;67010:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66977:63;;67051:22;67076:15;:13;:15::i;:::-;67051:40;;67102:23;67142:491;67167:15;67149;:33;:68;;;;;67204:13;:11;:13::i;:::-;67186:14;:31;;67149:68;67142:491;;;67248:25;67318:23;67326:14;67318:7;:23::i;:::-;67315:105;;;67381:23;67389:14;67381:7;:23::i;:::-;67361:43;;67315:105;67461:6;67440:27;;:17;:27;;;67436:153;;67521:14;67488:13;67502:15;67488:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;67556:17;;;;;:::i;:::-;;;;67436:153;67605:16;;;;;:::i;:::-;;;;67219:414;67142:491;;;67652:13;67645:20;;;;;;66802:871;;;:::o;68427:183::-;584:13;:11;:13::i;:::-;68494:12:::1;68516:6;68509:24;;;68542:4;68509:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68494:54;;68566:6;68559:23;;;68583:10;68594:7;68559:43;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;68483:127;68427:183:::0;:::o;29026:152::-;29098:7;29141:27;29160:7;29141:18;:27::i;:::-;29118:52;;29026:152;;;:::o;24550:242::-;24622:7;24663:1;24646:19;;:5;:19;;;24642:69;;24667:44;24675:35;;;24667:7;:44::i;:::-;24642:69;18709:13;24729:18;:25;24748:5;24729:25;;;;;;;;;;;;;;;;:55;24722:62;;24550:242;;;:::o;860:103::-;584:13;:11;:13::i;:::-;925:30:::1;952:1;925:18;:30::i;:::-;860:103::o:0;625:87::-;671:7;698:6;;;;;;;;;;;691:13;;625:87;:::o;27800:104::-;27856:13;27889:7;27882:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27800:104;:::o;63420:504::-;63512:14;;63492:17;;:34;;;;:::i;:::-;63474:15;:52;63466:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;63583:8;;63573:6;:18;;:33;;;;;63605:1;63595:6;:11;;63573:33;63565:42;;;;;;63620:17;63640:1;63620:21;;63652:23;63678:13;:11;:13::i;:::-;63652:39;;63722:6;63703:15;;:25;;;;;;;:::i;:::-;;;;;;;;63739:24;63745:10;63756:6;63739:5;:24::i;:::-;63851:9;63817:10;:31;63846:1;63828:15;:19;;;;:::i;:::-;63817:31;;;;;;;;;;;:43;;;;63905:9;63871:10;:31;63900:1;63882:15;:19;;;;:::i;:::-;63871:31;;;;;;;;;;;:43;;;;63454:470;;63420:504;:::o;35225:234::-;35372:8;35320:18;:39;35339:19;:17;:19::i;:::-;35320:39;;;;;;;;;;;;;;;:49;35360:8;35320:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;35432:8;35396:55;;35411:19;:17;:19::i;:::-;35396:55;;;35442:8;35396:55;;;;;;:::i;:::-;;;;;;;;35225:234;;:::o;69185:245::-;69353:4;7836:1;6917:42;7788:45;;;:49;7784:539;;;8077:10;8069:18;;:4;:18;;;8065:85;;69375:47:::1;69398:4;69404:2;69408:7;69417:4;69375:22;:47::i;:::-;8128:7:::0;;8065:85;6917:42;8169;;;8220:4;8227:10;8169:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8164:148;;8285:10;8266:30;;;;;;;;;;;:::i;:::-;;;;;;;;8164:148;7784:539;69375:47:::1;69398:4;69404:2;69408:7;69417:4;69375:22;:47::i;:::-;69185:245:::0;;;;;;:::o;64983:1811::-;65048:13;65080:16;65088:7;65080;:16::i;:::-;65075:49;;65098:26;;;;;;;;;;:::i;:::-;;;;;;;;65075:49;65164:17;65184:10;:19;65195:7;65184:19;;;;;;;;;;;;65164:39;;65253:17;65446:16;:14;:16::i;:::-;65626:19;65635:9;65626:8;:19::i;:::-;65280:423;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65253:451;;65717:22;65796:25;65816:3;65796:13;:25::i;:::-;65749:73;;;;;;;;:::i;:::-;;;;;;;;;;;;;65717:106;;65836:18;65907:15;65927:19;65936:9;65927:8;:19::i;:::-;65985:22;66109:10;66160:19;66169:9;66160:8;:19::i;:::-;66248:8;65864:426;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65836:455;;66346:21;66370:23;66385:7;66370:14;:23::i;:::-;66346:47;;66466:24;66517:7;66526:4;66500:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66466:66;;66588:25;66616:32;66636:10;66616:13;:32::i;:::-;66588:60;;66773:11;66723:62;;;;;;;;:::i;:::-;;;;;;;;;;;;;66709:77;;;;;;;;;64983:1811;;;:::o;68618:112::-;584:13;:11;:13::i;:::-;68679:10:::1;68671:28;;:51;68700:21;68671:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;68618:112::o:0;35616:164::-;35713:4;35737:18;:25;35756:5;35737:25;;;;;;;;;;;;;;;:35;35763:8;35737:35;;;;;;;;;;;;;;;;;;;;;;;;;35730:42;;35616:164;;;;:::o;62066:27::-;;;;:::o;971:201::-;584:13;:11;:13::i;:::-;1080:1:::1;1060:22;;:8;:22;;::::0;1052:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1136:28;1155:8;1136:18;:28::i;:::-;971:201:::0;:::o;36038:368::-;36103:11;36150:7;36131:15;:13;:15::i;:::-;:26;36127:272;;36188:13;;36178:7;:23;36174:214;;;36222:14;36255:60;36303:1;36272:17;:26;36290:7;36272:26;;;;;;;;;;;;36263:35;;;36262:42;36255:60;;36306:9;;;;:::i;:::-;;;36255:60;;;36371:1;19485:8;36343:6;:24;:29;36334:38;;36203:185;36174:214;36127:272;36038:368;;;:::o;61816:165::-;61917:13;61911:4;61904:27;61958:4;61952;61945:18;53249:474;53378:13;53394:16;53402:7;53394;:16::i;:::-;53378:32;;53427:13;:45;;;;;53467:5;53444:28;;:19;:17;:19::i;:::-;:28;;;;53427:45;53423:201;;;53492:44;53509:5;53516:19;:17;:19::i;:::-;53492:16;:44::i;:::-;53487:137;;53557:51;53565:42;;;53557:7;:51::i;:::-;53487:137;53423:201;53669:2;53636:15;:24;53652:7;53636:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;53707:7;53703:2;53687:28;;53696:5;53687:28;;;;;;;;;;;;53367:356;53249:474;;;:::o;38392:3523::-;38534:27;38564;38583:7;38564:18;:27::i;:::-;38534:57;;20167:14;38735:4;38719:22;;:41;38696:66;;38820:4;38779:45;;38795:19;38779:45;;;38775:95;;38826:44;38834:35;;;38826:7;:44::i;:::-;38775:95;38884:27;38913:23;38940:35;38967:7;38940:26;:35::i;:::-;38883:92;;;;39075:68;39100:15;39117:4;39123:19;:17;:19::i;:::-;39075:24;:68::i;:::-;39070:189;;39163:43;39180:4;39186:19;:17;:19::i;:::-;39163:16;:43::i;:::-;39158:101;;39208:51;39216:42;;;39208:7;:51::i;:::-;39158:101;39070:189;39272:43;39294:4;39300:2;39304:7;39313:1;39272:21;:43::i;:::-;39408:15;39405:160;;;39548:1;39527:19;39520:30;39405:160;39945:18;:24;39964:4;39945:24;;;;;;;;;;;;;;;;39943:26;;;;;;;;;;;;40014:18;:22;40033:2;40014:22;;;;;;;;;;;;;;;;40012:24;;;;;;;;;;;40336:146;40373:2;40422:45;40437:4;40443:2;40447:19;40422:14;:45::i;:::-;19765:8;40394:73;40336:18;:146::i;:::-;40307:17;:26;40325:7;40307:26;;;;;;;;;;;:175;;;;40653:1;19765:8;40602:19;:47;:52;40598:627;;40675:19;40707:1;40697:7;:11;40675:33;;40864:1;40830:17;:30;40848:11;40830:30;;;;;;;;;;;;:35;40826:384;;40968:13;;40953:11;:28;40949:242;;41148:19;41115:17;:30;41133:11;41115:30;;;;;;;;;;;:52;;;;40949:242;40826:384;40656:569;40598:627;41338:16;20167:14;41373:2;41357:20;;:39;41338:58;;41737:7;41701:8;41667:4;41609:25;41554:1;41497;41474:299;41810:1;41798:8;:13;41794:58;;41813:39;41821:30;;;41813:7;:39::i;:::-;41794:58;41865:42;41886:4;41892:2;41896:7;41905:1;41865:20;:42::i;:::-;38523:3392;;;;38392:3523;;;:::o;53990:89::-;54050:21;54056:7;54065:5;54050;:21::i;:::-;53990:89;:::o;46455:2305::-;46528:20;46551:13;;46528:36;;46591:1;46579:8;:13;46575:53;;46594:34;46602:25;;;46594:7;:34::i;:::-;46575:53;46641:61;46671:1;46675:2;46679:12;46693:8;46641:21;:61::i;:::-;47175:139;47212:2;47266:33;47289:1;47293:2;47297:1;47266:14;:33::i;:::-;47233:30;47254:8;47233:20;:30::i;:::-;:66;47175:18;:139::i;:::-;47141:17;:31;47159:12;47141:31;;;;;;;;;;;:173;;;;47601:1;18847:2;47571:1;:26;;47570:32;47558:8;:45;47532:18;:22;47551:2;47532:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;47714:16;20167:14;47749:2;47733:20;;:39;47714:58;;47805:1;47793:8;:13;47789:54;;47808:35;47816:26;;;47808:7;:35::i;:::-;47789:54;47860:11;47889:8;47874:12;:23;47860:37;;47912:15;47930:12;47912:30;;47959:676;48378:7;48334:8;48289:1;48223:25;48160:1;48095;48064:358;48630:3;48617:9;;;;;;:16;47959:676;;48667:3;48651:13;:19;;;;46890:1792;;;48692:60;48721:1;48725:2;48729:12;48743:8;48692:20;:60::i;:::-;46517:2243;46455:2305;;:::o;42011:193::-;42157:39;42174:4;42180:2;42184:7;42157:39;;;;;;;;;;;;:16;:39::i;:::-;42011:193;;;:::o;22882:92::-;22938:7;22965:1;22958:8;;22882:92;:::o;720:132::-;795:12;:10;:12::i;:::-;784:23;;:7;:5;:7::i;:::-;:23;;;776:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;720:132::o;30506:2012::-;30573:14;30623:7;30604:15;:13;:15::i;:::-;:26;30600:1853;;30656:17;:26;30674:7;30656:26;;;;;;;;;;;;30647:35;;30792:1;30782:6;:11;30778:1292;;30829:13;;30818:7;:24;30814:77;;30844:47;30852:38;;;30844:7;:47::i;:::-;30814:77;31448:607;31526:17;:28;31544:9;;;;;;;31526:28;;;;;;;;;;;;31517:37;;31614:1;31604:6;:11;31600:25;31617:8;31600:25;31680:1;19485:8;31652:6;:24;:29;31648:48;31683:13;31648:48;31988:47;31996:38;;;31988:7;:47::i;:::-;31448:607;;;30778:1292;32425:1;19485:8;32397:6;:24;:29;32393:48;32428:13;32393:48;30600:1853;32463:47;32471:38;;;32463:7;:47::i;:::-;30506:2012;;;;:::o;1180:191::-;1254:16;1273:6;;;;;;;;;;;1254:25;;1299:8;1290:6;;:17;;;;;;;;;;;;;;;;;;1354:8;1323:40;;1344:8;1323:40;;;;;;;;;;;;1243:128;1180:191;:::o;59797:105::-;59857:7;59884:10;59877:17;;59797:105;:::o;42802:416::-;42977:31;42990:4;42996:2;43000:7;42977:12;:31::i;:::-;43041:1;43023:2;:14;;;:19;43019:192;;43062:56;43093:4;43099:2;43103:7;43112:5;43062:30;:56::i;:::-;43057:154;;43139:56;43147:47;;;43139:7;:56::i;:::-;43057:154;43019:192;42802:416;;;;:::o;64642:333::-;64691:13;64716:14;64768:15;64785:10;64797:13;:11;:13::i;:::-;64751:60;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64741:71;;;;;;64733:80;;64716:97;;64862:22;64880:3;64871:6;:12;;;;:::i;:::-;64862:8;:22::i;:::-;64891:30;64917:3;64910;64901:6;:12;;;;:::i;:::-;64900:20;;;;:::i;:::-;64891:8;:30::i;:::-;64928:32;64956:3;64947:5;64938:6;:14;;;;:::i;:::-;64937:22;;;;:::i;:::-;64928:8;:32::i;:::-;64837:129;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64823:144;;;64642:333;:::o;67683:532::-;67739:13;67778:1;67769:5;:10;67765:53;;67796:10;;;;;;;;;;;;;;;;;;;;;67765:53;67828:12;67843:5;67828:20;;67859:14;67884:78;67899:1;67891:4;:9;67884:78;;67917:8;;;;;:::i;:::-;;;;67948:2;67940:10;;;;;:::i;:::-;;;67884:78;;;67972:19;68004:6;67994:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67972:39;;68022:154;68038:1;68029:5;:10;68022:154;;68066:1;68056:11;;;;;:::i;:::-;;;68133:2;68125:5;:10;;;;:::i;:::-;68112:2;:24;;;;:::i;:::-;68099:39;;68082:6;68089;68082:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;68162:2;68153:11;;;;;:::i;:::-;;;68022:154;;;68200:6;68186:21;;;;;67683:532;;;;:::o;1511:3097::-;1569:13;1821:1;1806:4;:11;:16;1802:31;;1824:9;;;;;;;;;;;;;;;;1802:31;1886:19;1908:6;;;;;;;;;;;;;;;;;1886:28;;2325:20;2384:1;2379;2365:4;:11;:15;;;;:::i;:::-;2364:21;;;;:::i;:::-;2359:1;:27;;;;:::i;:::-;2348:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2325:62;;2567:1;2560:5;2556:13;2671:2;2663:6;2659:15;2782:4;2834;2828:11;2822:4;2818:22;2744:1432;2868:6;2859:7;2856:19;2744:1432;;;2974:1;2965:7;2961:15;2950:26;;3013:7;3007:14;3666:4;3658:5;3654:2;3650:14;3646:25;3636:8;3632:40;3626:47;3615:9;3607:67;3720:1;3709:9;3705:17;3692:30;;3812:4;3804:5;3800:2;3796:14;3792:25;3782:8;3778:40;3772:47;3761:9;3753:67;3866:1;3855:9;3851:17;3838:30;;3957:4;3949:5;3946:1;3942:13;3938:24;3928:8;3924:39;3918:46;3907:9;3899:66;4011:1;4000:9;3996:17;3983:30;;4094:4;4087:5;4083:16;4073:8;4069:31;4063:38;4052:9;4044:58;4148:1;4137:9;4133:17;4120:30;;2895:1281;2744:1432;;;2748:107;;4338:1;4331:4;4325:11;4321:19;4359:1;4354:123;;;;4496:1;4491:73;;;;4314:250;;4354:123;4407:4;4403:1;4392:9;4388:17;4380:32;4457:4;4453:1;4442:9;4438:17;4430:32;4354:123;;4491:73;4544:4;4540:1;4529:9;4525:17;4517:32;4314:250;;2453:2122;;4594:6;4587:13;;;;1511:3097;;;;:::o;28010:327::-;28083:13;28114:16;28122:7;28114;:16::i;:::-;28109:68;;28132:45;28140:36;;;28132:7;:45::i;:::-;28109:68;28190:21;28214:10;:8;:10::i;:::-;28190:34;;28267:1;28248:7;28242:21;:26;:87;;;;;;;;;;;;;;;;;28295:7;28304:18;28314:7;28304:9;:18::i;:::-;28278:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28242:87;28235:94;;;28010:327;;;:::o;37287:485::-;37389:27;37418:23;37459:38;37500:15;:24;37516:7;37500:24;;;;;;;;;;;37459:65;;37677:18;37654:41;;37734:19;37728:26;37709:45;;37639:126;37287:485;;;:::o;36515:659::-;36664:11;36829:16;36822:5;36818:28;36809:37;;36989:16;36978:9;36974:32;36961:45;;37139:15;37128:9;37125:30;37117:5;37106:9;37103:20;37100:56;37090:66;;36515:659;;;;;:::o;43880:159::-;;;;;:::o;59106:311::-;59241:7;59261:16;19889:3;59287:19;:41;;59261:68;;19889:3;59355:31;59366:4;59372:2;59376:9;59355:10;:31::i;:::-;59347:40;;:62;;59340:69;;;59106:311;;;;;:::o;33066:450::-;33146:14;33314:16;33307:5;33303:28;33294:37;;33491:5;33477:11;33452:23;33448:41;33445:52;33438:5;33435:63;33425:73;;33066:450;;;;:::o;44704:158::-;;;;;:::o;54308:3090::-;54388:27;54418;54437:7;54418:18;:27::i;:::-;54388:57;;54458:12;54489:19;54458:52;;54524:27;54553:23;54580:35;54607:7;54580:26;:35::i;:::-;54523:92;;;;54632:13;54628:325;;;54753:68;54778:15;54795:4;54801:19;:17;:19::i;:::-;54753:24;:68::i;:::-;54748:193;;54845:43;54862:4;54868:19;:17;:19::i;:::-;54845:16;:43::i;:::-;54840:101;;54890:51;54898:42;;;54890:7;:51::i;:::-;54840:101;54748:193;54628:325;54965:51;54987:4;55001:1;55005:7;55014:1;54965:21;:51::i;:::-;55109:15;55106:160;;;55249:1;55228:19;55221:30;55106:160;55927:1;18974:3;55897:1;:26;;55896:32;55868:18;:24;55887:4;55868:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;56195:176;56232:4;56303:53;56318:4;56332:1;56336:19;56303:14;:53::i;:::-;19765:8;19485;56256:43;56255:101;56195:18;:176::i;:::-;56166:17;:26;56184:7;56166:26;;;;;;;;;;;:205;;;;56542:1;19765:8;56491:19;:47;:52;56487:627;;56564:19;56596:1;56586:7;:11;56564:33;;56753:1;56719:17;:30;56737:11;56719:30;;;;;;;;;;;;:35;56715:384;;56857:13;;56842:11;:28;56838:242;;57037:19;57004:17;:30;57022:11;57004:30;;;;;;;;;;;:52;;;;56838:242;56715:384;56545:569;56487:627;57169:7;57165:1;57142:35;;57151:4;57142:35;;;;;;;;;;;;57188:50;57209:4;57223:1;57227:7;57236:1;57188:20;:50::i;:::-;57365:12;;:14;;;;;;;;;;;;;54377:3021;;;;54308:3090;;:::o;33618:324::-;33688:14;33921:1;33911:8;33908:15;33882:24;33878:46;33868:56;;33618:324;;;:::o;94:98::-;147:7;174:10;167:17;;94:98;:::o;45302:691::-;45465:4;45511:2;45486:45;;;45532:19;:17;:19::i;:::-;45553:4;45559:7;45568:5;45486:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45482:504;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45786:1;45769:6;:13;:18;45765:115;;45808:56;45816:47;;;45808:7;:56::i;:::-;45765:115;45952:6;45946:13;45937:6;45933:2;45929:15;45922:38;45482:504;45655:54;;;45645:64;;;:6;:64;;;;45638:71;;;45302:691;;;;;;:::o;28589:94::-;28640:13;28666:9;;;;;;;;;;;;;;28589:94;:::o;60004:1745::-;60069:17;60503:4;60496;60490:11;60486:22;60595:1;60589:4;60582:15;60670:4;60667:1;60663:12;60656:19;;60752:1;60747:3;60740:14;60856:3;61095:5;61077:428;61103:1;61077:428;;;61143:1;61138:3;61134:11;61127:18;;61314:2;61308:4;61304:13;61300:2;61296:22;61291:3;61283:36;61408:2;61402:4;61398:13;61390:21;;61475:4;61077:428;61465:25;61077:428;61081:21;61544:3;61539;61535:13;61659:4;61654:3;61650:14;61643:21;;61724:6;61719:3;61712:19;60108:1634;;;60004:1745;;;:::o;58807:147::-;58944:6;58807: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:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:117::-;5976:1;5973;5966:12;5990:117;6099:1;6096;6089:12;6113:117;6222:1;6219;6212:12;6253:568;6326:8;6336:6;6386:3;6379:4;6371:6;6367:17;6363:27;6353:122;;6394:79;;:::i;:::-;6353:122;6507:6;6494:20;6484:30;;6537:18;6529:6;6526:30;6523:117;;;6559:79;;:::i;:::-;6523:117;6673:4;6665:6;6661:17;6649:29;;6727:3;6719:4;6711:6;6707:17;6697:8;6693:32;6690:41;6687:128;;;6734:79;;:::i;:::-;6687:128;6253:568;;;;;:::o;6827:559::-;6913:6;6921;6970:2;6958:9;6949:7;6945:23;6941:32;6938:119;;;6976:79;;:::i;:::-;6938:119;7124:1;7113:9;7109:17;7096:31;7154:18;7146:6;7143:30;7140:117;;;7176:79;;:::i;:::-;7140:117;7289:80;7361:7;7352:6;7341:9;7337:22;7289:80;:::i;:::-;7271:98;;;;7067:312;6827:559;;;;;:::o;7392:329::-;7451:6;7500:2;7488:9;7479:7;7475:23;7471:32;7468:119;;;7506:79;;:::i;:::-;7468:119;7626:1;7651:53;7696:7;7687:6;7676:9;7672:22;7651:53;:::i;:::-;7641:63;;7597:117;7392:329;;;;:::o;7727:114::-;7794:6;7828:5;7822:12;7812:22;;7727:114;;;:::o;7847:184::-;7946:11;7980:6;7975:3;7968:19;8020:4;8015:3;8011:14;7996:29;;7847:184;;;;:::o;8037:132::-;8104:4;8127:3;8119:11;;8157:4;8152:3;8148:14;8140:22;;8037:132;;;:::o;8175:108::-;8252:24;8270:5;8252:24;:::i;:::-;8247:3;8240:37;8175:108;;:::o;8289:179::-;8358:10;8379:46;8421:3;8413:6;8379:46;:::i;:::-;8457:4;8452:3;8448:14;8434:28;;8289:179;;;;:::o;8474:113::-;8544:4;8576;8571:3;8567:14;8559:22;;8474:113;;;:::o;8623:732::-;8742:3;8771:54;8819:5;8771:54;:::i;:::-;8841:86;8920:6;8915:3;8841:86;:::i;:::-;8834:93;;8951:56;9001:5;8951:56;:::i;:::-;9030:7;9061:1;9046:284;9071:6;9068:1;9065:13;9046:284;;;9147:6;9141:13;9174:63;9233:3;9218:13;9174:63;:::i;:::-;9167:70;;9260:60;9313:6;9260:60;:::i;:::-;9250:70;;9106:224;9093:1;9090;9086:9;9081:14;;9046:284;;;9050:14;9346:3;9339:10;;8747:608;;;8623:732;;;;:::o;9361:373::-;9504:4;9542:2;9531:9;9527:18;9519:26;;9591:9;9585:4;9581:20;9577:1;9566:9;9562:17;9555:47;9619:108;9722:4;9713:6;9619:108;:::i;:::-;9611:116;;9361:373;;;;:::o;9740:116::-;9810:21;9825:5;9810:21;:::i;:::-;9803:5;9800:32;9790:60;;9846:1;9843;9836:12;9790:60;9740:116;:::o;9862:133::-;9905:5;9943:6;9930:20;9921:29;;9959:30;9983:5;9959:30;:::i;:::-;9862:133;;;;:::o;10001:468::-;10066:6;10074;10123:2;10111:9;10102:7;10098:23;10094:32;10091:119;;;10129:79;;:::i;:::-;10091:119;10249:1;10274:53;10319:7;10310:6;10299:9;10295:22;10274:53;:::i;:::-;10264:63;;10220:117;10376:2;10402:50;10444:7;10435:6;10424:9;10420:22;10402:50;:::i;:::-;10392:60;;10347:115;10001:468;;;;;:::o;10475:117::-;10584:1;10581;10574:12;10598:180;10646:77;10643:1;10636:88;10743:4;10740:1;10733:15;10767:4;10764:1;10757:15;10784:281;10867:27;10889:4;10867:27;:::i;:::-;10859:6;10855:40;10997:6;10985:10;10982:22;10961:18;10949:10;10946:34;10943:62;10940:88;;;11008:18;;:::i;:::-;10940:88;11048:10;11044:2;11037:22;10827:238;10784:281;;:::o;11071:129::-;11105:6;11132:20;;:::i;:::-;11122:30;;11161:33;11189:4;11181:6;11161:33;:::i;:::-;11071:129;;;:::o;11206:307::-;11267:4;11357:18;11349:6;11346:30;11343:56;;;11379:18;;:::i;:::-;11343:56;11417:29;11439:6;11417:29;:::i;:::-;11409:37;;11501:4;11495;11491:15;11483:23;;11206:307;;;:::o;11519:146::-;11616:6;11611:3;11606;11593:30;11657:1;11648:6;11643:3;11639:16;11632:27;11519:146;;;:::o;11671:423::-;11748:5;11773:65;11789:48;11830:6;11789:48;:::i;:::-;11773:65;:::i;:::-;11764:74;;11861:6;11854:5;11847:21;11899:4;11892:5;11888:16;11937:3;11928:6;11923:3;11919:16;11916:25;11913:112;;;11944:79;;:::i;:::-;11913:112;12034:54;12081:6;12076:3;12071;12034:54;:::i;:::-;11754:340;11671:423;;;;;:::o;12113:338::-;12168:5;12217:3;12210:4;12202:6;12198:17;12194:27;12184:122;;12225:79;;:::i;:::-;12184:122;12342:6;12329:20;12367:78;12441:3;12433:6;12426:4;12418:6;12414:17;12367:78;:::i;:::-;12358:87;;12174:277;12113:338;;;;:::o;12457:943::-;12552:6;12560;12568;12576;12625:3;12613:9;12604:7;12600:23;12596:33;12593:120;;;12632:79;;:::i;:::-;12593:120;12752:1;12777:53;12822:7;12813:6;12802:9;12798:22;12777:53;:::i;:::-;12767:63;;12723:117;12879:2;12905:53;12950:7;12941:6;12930:9;12926:22;12905:53;:::i;:::-;12895:63;;12850:118;13007:2;13033:53;13078:7;13069:6;13058:9;13054:22;13033:53;:::i;:::-;13023:63;;12978:118;13163:2;13152:9;13148:18;13135:32;13194:18;13186:6;13183:30;13180:117;;;13216:79;;:::i;:::-;13180:117;13321:62;13375:7;13366:6;13355:9;13351:22;13321:62;:::i;:::-;13311:72;;13106:287;12457:943;;;;;;;:::o;13406:474::-;13474:6;13482;13531:2;13519:9;13510:7;13506:23;13502:32;13499:119;;;13537:79;;:::i;:::-;13499:119;13657:1;13682:53;13727:7;13718:6;13707:9;13703:22;13682:53;:::i;:::-;13672:63;;13628:117;13784:2;13810:53;13855:7;13846:6;13835:9;13831:22;13810:53;:::i;:::-;13800:63;;13755:118;13406:474;;;;;:::o;13886:180::-;13934:77;13931:1;13924:88;14031:4;14028:1;14021:15;14055:4;14052:1;14045:15;14072:320;14116:6;14153:1;14147:4;14143:12;14133:22;;14200:1;14194:4;14190:12;14221:18;14211:81;;14277:4;14269:6;14265:17;14255:27;;14211:81;14339:2;14331:6;14328:14;14308:18;14305:38;14302:84;;14358:18;;:::i;:::-;14302:84;14123:269;14072:320;;;:::o;14398:332::-;14519:4;14557:2;14546:9;14542:18;14534:26;;14570:71;14638:1;14627:9;14623:17;14614:6;14570:71;:::i;:::-;14651:72;14719:2;14708:9;14704:18;14695:6;14651:72;:::i;:::-;14398:332;;;;;:::o;14736:137::-;14790:5;14821:6;14815:13;14806:22;;14837:30;14861:5;14837:30;:::i;:::-;14736:137;;;;:::o;14879:345::-;14946:6;14995:2;14983:9;14974:7;14970:23;14966:32;14963:119;;;15001:79;;:::i;:::-;14963:119;15121:1;15146:61;15199:7;15190:6;15179:9;15175:22;15146:61;:::i;:::-;15136:71;;15092:125;14879:345;;;;:::o;15230:180::-;15370:32;15366:1;15358:6;15354:14;15347:56;15230:180;:::o;15416:366::-;15558:3;15579:67;15643:2;15638:3;15579:67;:::i;:::-;15572:74;;15655:93;15744:3;15655:93;:::i;:::-;15773:2;15768:3;15764:12;15757:19;;15416:366;;;:::o;15788:419::-;15954:4;15992:2;15981:9;15977:18;15969:26;;16041:9;16035:4;16031:20;16027:1;16016:9;16012:17;16005:47;16069:131;16195:4;16069:131;:::i;:::-;16061:139;;15788:419;;;:::o;16213:180::-;16261:77;16258:1;16251:88;16358:4;16355:1;16348:15;16382:4;16379:1;16372:15;16399:180;16447:77;16444:1;16437:88;16544:4;16541:1;16534:15;16568:4;16565:1;16558:15;16585:191;16625:3;16644:20;16662:1;16644:20;:::i;:::-;16639:25;;16678:20;16696:1;16678:20;:::i;:::-;16673:25;;16721:1;16718;16714:9;16707:16;;16742:3;16739:1;16736:10;16733:36;;;16749:18;;:::i;:::-;16733:36;16585:191;;;;:::o;16782:233::-;16821:3;16844:24;16862:5;16844:24;:::i;:::-;16835:33;;16890:66;16883:5;16880:77;16877:103;;16960:18;;:::i;:::-;16877:103;17007:1;17000:5;16996:13;16989:20;;16782:233;;;:::o;17021:143::-;17078:5;17109:6;17103:13;17094:22;;17125:33;17152:5;17125:33;:::i;:::-;17021:143;;;;:::o;17170:351::-;17240:6;17289:2;17277:9;17268:7;17264:23;17260:32;17257:119;;;17295:79;;:::i;:::-;17257:119;17415:1;17440:64;17496:7;17487:6;17476:9;17472:22;17440:64;:::i;:::-;17430:74;;17386:128;17170:351;;;;:::o;17527:332::-;17648:4;17686:2;17675:9;17671:18;17663:26;;17699:71;17767:1;17756:9;17752:17;17743:6;17699:71;:::i;:::-;17780:72;17848:2;17837:9;17833:18;17824:6;17780:72;:::i;:::-;17527:332;;;;;:::o;17865:174::-;18005:26;18001:1;17993:6;17989:14;17982:50;17865:174;:::o;18045:366::-;18187:3;18208:67;18272:2;18267:3;18208:67;:::i;:::-;18201:74;;18284:93;18373:3;18284:93;:::i;:::-;18402:2;18397:3;18393:12;18386:19;;18045:366;;;:::o;18417:419::-;18583:4;18621:2;18610:9;18606:18;18598:26;;18670:9;18664:4;18660:20;18656:1;18645:9;18641:17;18634:47;18698:131;18824:4;18698:131;:::i;:::-;18690:139;;18417:419;;;:::o;18842:166::-;18982:18;18978:1;18970:6;18966:14;18959:42;18842:166;:::o;19014:366::-;19156:3;19177:67;19241:2;19236:3;19177:67;:::i;:::-;19170:74;;19253:93;19342:3;19253:93;:::i;:::-;19371:2;19366:3;19362:12;19355:19;;19014:366;;;:::o;19386:419::-;19552:4;19590:2;19579:9;19575:18;19567:26;;19639:9;19633:4;19629:20;19625:1;19614:9;19610:17;19603:47;19667:131;19793:4;19667:131;:::i;:::-;19659:139;;19386:419;;;:::o;19811:148::-;19913:11;19950:3;19935:18;;19811:148;;;;:::o;19965:353::-;20105:66;20101:1;20093:6;20089:14;20082:90;20206:66;20201:2;20193:6;20189:15;20182:91;20307:3;20302:2;20294:6;20290:15;20283:28;19965:353;:::o;20324:402::-;20484:3;20505:85;20587:2;20582:3;20505:85;:::i;:::-;20498:92;;20599:93;20688:3;20599:93;:::i;:::-;20717:2;20712:3;20708:12;20701:19;;20324:402;;;:::o;20732:315::-;20872:66;20868:1;20860:6;20856:14;20849:90;20973:66;20968:2;20960:6;20956:15;20949:91;20732:315;:::o;21053:402::-;21213:3;21234:85;21316:2;21311:3;21234:85;:::i;:::-;21227:92;;21328:93;21417:3;21328:93;:::i;:::-;21446:2;21441:3;21437:12;21430:19;;21053:402;;;:::o;21461:390::-;21567:3;21595:39;21628:5;21595:39;:::i;:::-;21650:89;21732:6;21727:3;21650:89;:::i;:::-;21643:96;;21748:65;21806:6;21801:3;21794:4;21787:5;21783:16;21748:65;:::i;:::-;21838:6;21833:3;21829:16;21822:23;;21571:280;21461:390;;;;:::o;21857:214::-;21997:66;21993:1;21985:6;21981:14;21974:90;21857:214;:::o;22077:400::-;22237:3;22258:84;22340:1;22335:3;22258:84;:::i;:::-;22251:91;;22351:93;22440:3;22351:93;:::i;:::-;22469:1;22464:3;22460:11;22453:18;;22077:400;;;:::o;22483:517::-;22623:66;22619:1;22611:6;22607:14;22600:90;22724:66;22719:2;22711:6;22707:15;22700:91;22825:66;22820:2;22812:6;22808:15;22801:91;22926:66;22921:2;22913:6;22909:15;22902:91;22483:517;:::o;23006:404::-;23166:3;23187:86;23269:3;23264;23187:86;:::i;:::-;23180:93;;23282;23371:3;23282:93;:::i;:::-;23400:3;23395;23391:13;23384:20;;23006:404;;;:::o;23416:157::-;23556:9;23552:1;23544:6;23540:14;23533:33;23416:157;:::o;23579:400::-;23739:3;23760:84;23842:1;23837:3;23760:84;:::i;:::-;23753:91;;23853:93;23942:3;23853:93;:::i;:::-;23971:1;23966:3;23962:11;23955:18;;23579:400;;;:::o;23985:156::-;24125:8;24121:1;24113:6;24109:14;24102:32;23985:156;:::o;24147:400::-;24307:3;24328:84;24410:1;24405:3;24328:84;:::i;:::-;24321:91;;24421:93;24510:3;24421:93;:::i;:::-;24539:1;24534:3;24530:11;24523:18;;24147:400;;;:::o;24553:2031::-;25339:3;25361:148;25505:3;25361:148;:::i;:::-;25354:155;;25526:148;25670:3;25526:148;:::i;:::-;25519:155;;25691:95;25782:3;25773:6;25691:95;:::i;:::-;25684:102;;25803:148;25947:3;25803:148;:::i;:::-;25796:155;;25968:148;26112:3;25968:148;:::i;:::-;25961:155;;26133:95;26224:3;26215:6;26133:95;:::i;:::-;26126:102;;26245:148;26389:3;26245:148;:::i;:::-;26238:155;;26410:148;26554:3;26410:148;:::i;:::-;26403:155;;26575:3;26568:10;;24553:2031;;;;;:::o;26590:176::-;26730:28;26726:1;26718:6;26714:14;26707:52;26590:176;:::o;26772:402::-;26932:3;26953:85;27035:2;27030:3;26953:85;:::i;:::-;26946:92;;27047:93;27136:3;27047:93;:::i;:::-;27165:2;27160:3;27156:12;27149:19;;26772:402;;;:::o;27180:541::-;27413:3;27435:148;27579:3;27435:148;:::i;:::-;27428:155;;27600:95;27691:3;27682:6;27600:95;:::i;:::-;27593:102;;27712:3;27705:10;;27180:541;;;;:::o;27727:214::-;27867:66;27863:1;27855:6;27851:14;27844:90;27727:214;:::o;27947:400::-;28107:3;28128:84;28210:1;28205:3;28128:84;:::i;:::-;28121:91;;28221:93;28310:3;28221:93;:::i;:::-;28339:1;28334:3;28330:11;28323:18;;27947:400;;;:::o;28353:141::-;28402:4;28425:3;28417:11;;28448:3;28445:1;28438:14;28482:4;28479:1;28469:18;28461:26;;28353:141;;;:::o;28524:874::-;28627:3;28664:5;28658:12;28693:36;28719:9;28693:36;:::i;:::-;28745:89;28827:6;28822:3;28745:89;:::i;:::-;28738:96;;28865:1;28854:9;28850:17;28881:1;28876:166;;;;29056:1;29051:341;;;;28843:549;;28876:166;28960:4;28956:9;28945;28941:25;28936:3;28929:38;29022:6;29015:14;29008:22;29000:6;28996:35;28991:3;28987:45;28980:52;;28876:166;;29051:341;29118:38;29150:5;29118:38;:::i;:::-;29178:1;29192:154;29206:6;29203:1;29200:13;29192:154;;;29280:7;29274:14;29270:1;29265:3;29261:11;29254:35;29330:1;29321:7;29317:15;29306:26;;29228:4;29225:1;29221:12;29216:17;;29192:154;;;29375:6;29370:3;29366:16;29359:23;;29058:334;;28843:549;;28631:767;;28524:874;;;;:::o;29404:151::-;29544:3;29540:1;29532:6;29528:14;29521:27;29404:151;:::o;29561:400::-;29721:3;29742:84;29824:1;29819:3;29742:84;:::i;:::-;29735:91;;29835:93;29924:3;29835:93;:::i;:::-;29953:1;29948:3;29944:11;29937:18;;29561:400;;;:::o;29967:214::-;30107:66;30103:1;30095:6;30091:14;30084:90;29967:214;:::o;30187:400::-;30347:3;30368:84;30450:1;30445:3;30368:84;:::i;:::-;30361:91;;30461:93;30550:3;30461:93;:::i;:::-;30579:1;30574:3;30570:11;30563:18;;30187:400;;;:::o;30593:214::-;30733:66;30729:1;30721:6;30717:14;30710:90;30593:214;:::o;30813:402::-;30973:3;30994:85;31076:2;31071:3;30994:85;:::i;:::-;30987:92;;31088:93;31177:3;31088:93;:::i;:::-;31206:2;31201:3;31197:12;31190:19;;30813:402;;;:::o;31221:214::-;31361:66;31357:1;31349:6;31345:14;31338:90;31221:214;:::o;31441:402::-;31601:3;31622:85;31704:2;31699:3;31622:85;:::i;:::-;31615:92;;31716:93;31805:3;31716:93;:::i;:::-;31834:2;31829:3;31825:12;31818:19;;31441:402;;;:::o;31849:155::-;31989:3;31985:1;31977:6;31973:14;31966:27;31849:155;:::o;32014:416::-;32174:3;32199:84;32281:1;32276:3;32199:84;:::i;:::-;32192:91;;32296:93;32385:3;32296:93;:::i;:::-;32418:1;32413:3;32409:11;32402:18;;32014:416;;;:::o;32440:222::-;32584:66;32580:1;32572:6;32568:14;32561:90;32440:222;:::o;32672:418::-;32832:3;32857:85;32939:2;32934:3;32857:85;:::i;:::-;32850:92;;32955:93;33044:3;32955:93;:::i;:::-;33077:2;33072:3;33068:12;33061:19;;32672:418;;;:::o;33100:222::-;33244:66;33240:1;33232:6;33228:14;33221:90;33100:222;:::o;33332:416::-;33492:3;33517:84;33599:1;33594:3;33517:84;:::i;:::-;33510:91;;33614:93;33703:3;33614:93;:::i;:::-;33736:1;33731:3;33727:11;33720:18;;33332:416;;;:::o;33758:151::-;33898:3;33894:1;33886:6;33882:14;33875:27;33758:151;:::o;33915:400::-;34075:3;34096:84;34178:1;34173:3;34096:84;:::i;:::-;34089:91;;34189:93;34278:3;34189:93;:::i;:::-;34307:1;34302:3;34298:11;34291:18;;33915:400;;;:::o;34321:152::-;34461:4;34457:1;34449:6;34445:14;34438:28;34321:152;:::o;34479:400::-;34639:3;34660:84;34742:1;34737:3;34660:84;:::i;:::-;34653:91;;34753:93;34842:3;34753:93;:::i;:::-;34871:1;34866:3;34862:11;34855:18;;34479:400;;;:::o;34885:214::-;35025:66;35021:1;35013:6;35009:14;35002:90;34885:214;:::o;35105:400::-;35265:3;35286:84;35368:1;35363:3;35286:84;:::i;:::-;35279:91;;35379:93;35468:3;35379:93;:::i;:::-;35497:1;35492:3;35488:11;35481:18;;35105:400;;;:::o;35511:214::-;35651:66;35647:1;35639:6;35635:14;35628:90;35511:214;:::o;35731:400::-;35891:3;35912:84;35994:1;35989:3;35912:84;:::i;:::-;35905:91;;36005:93;36094:3;36005:93;:::i;:::-;36123:1;36118:3;36114:11;36107:18;;35731:400;;;:::o;36137:5047::-;38015:3;38037:148;38181:3;38037:148;:::i;:::-;38030:155;;38202:92;38290:3;38281:6;38202:92;:::i;:::-;38195:99;;38311:148;38455:3;38311:148;:::i;:::-;38304:155;;38476:95;38567:3;38558:6;38476:95;:::i;:::-;38469:102;;38588:148;38732:3;38588:148;:::i;:::-;38581:155;;38753:148;38897:3;38753:148;:::i;:::-;38746:155;;38918:92;39006:3;38997:6;38918:92;:::i;:::-;38911:99;;39027:148;39171:3;39027:148;:::i;:::-;39020:155;;39192:148;39336:3;39192:148;:::i;:::-;39185:155;;39357:148;39501:3;39357:148;:::i;:::-;39350:155;;39522:148;39666:3;39522:148;:::i;:::-;39515:155;;39687:92;39775:3;39766:6;39687:92;:::i;:::-;39680:99;;39796:148;39940:3;39796:148;:::i;:::-;39789:155;;39961:148;40105:3;39961:148;:::i;:::-;39954:155;;40126:95;40217:3;40208:6;40126:95;:::i;:::-;40119:102;;40238:148;40382:3;40238:148;:::i;:::-;40231:155;;40403:148;40547:3;40403:148;:::i;:::-;40396:155;;40568:148;40712:3;40568:148;:::i;:::-;40561:155;;40733:95;40824:3;40815:6;40733:95;:::i;:::-;40726:102;;40845:148;40989:3;40845:148;:::i;:::-;40838:155;;41010:148;41154:3;41010:148;:::i;:::-;41003:155;;41175:3;41168:10;;36137:5047;;;;;;;;;:::o;41190:435::-;41370:3;41392:95;41483:3;41474:6;41392:95;:::i;:::-;41385:102;;41504:95;41595:3;41586:6;41504:95;:::i;:::-;41497:102;;41616:3;41609:10;;41190:435;;;;;:::o;41631:179::-;41771:31;41767:1;41759:6;41755:14;41748:55;41631:179;:::o;41816:402::-;41976:3;41997:85;42079:2;42074:3;41997:85;:::i;:::-;41990:92;;42091:93;42180:3;42091:93;:::i;:::-;42209:2;42204:3;42200:12;42193:19;;41816:402;;;:::o;42224:541::-;42457:3;42479:148;42623:3;42479:148;:::i;:::-;42472:155;;42644:95;42735:3;42726:6;42644:95;:::i;:::-;42637:102;;42756:3;42749:10;;42224:541;;;;:::o;42771:225::-;42911:34;42907:1;42899:6;42895:14;42888:58;42980:8;42975:2;42967:6;42963:15;42956:33;42771:225;:::o;43002:366::-;43144:3;43165:67;43229:2;43224:3;43165:67;:::i;:::-;43158:74;;43241:93;43330:3;43241:93;:::i;:::-;43359:2;43354:3;43350:12;43343:19;;43002:366;;;:::o;43374:419::-;43540:4;43578:2;43567:9;43563:18;43555:26;;43627:9;43621:4;43617:20;43613:1;43602:9;43598:17;43591:47;43655:131;43781:4;43655:131;:::i;:::-;43647:139;;43374:419;;;:::o;43799:171::-;43838:3;43861:24;43879:5;43861:24;:::i;:::-;43852:33;;43907:4;43900:5;43897:15;43894:41;;43915:18;;:::i;:::-;43894:41;43962:1;43955:5;43951:13;43944:20;;43799:171;;;:::o;43976:182::-;44116:34;44112:1;44104:6;44100:14;44093:58;43976:182;:::o;44164:366::-;44306:3;44327:67;44391:2;44386:3;44327:67;:::i;:::-;44320:74;;44403:93;44492:3;44403:93;:::i;:::-;44521:2;44516:3;44512:12;44505:19;;44164:366;;;:::o;44536:419::-;44702:4;44740:2;44729:9;44725:18;44717:26;;44789:9;44783:4;44779:20;44775:1;44764:9;44760:17;44753:47;44817:131;44943:4;44817:131;:::i;:::-;44809:139;;44536:419;;;:::o;44961:79::-;45000:7;45029:5;45018:16;;44961:79;;;:::o;45046:157::-;45151:45;45171:24;45189:5;45171:24;:::i;:::-;45151:45;:::i;:::-;45146:3;45139:58;45046:157;;:::o;45209:94::-;45242:8;45290:5;45286:2;45282:14;45261:35;;45209:94;;;:::o;45309:::-;45348:7;45377:20;45391:5;45377:20;:::i;:::-;45366:31;;45309:94;;;:::o;45409:100::-;45448:7;45477:26;45497:5;45477:26;:::i;:::-;45466:37;;45409:100;;;:::o;45515:157::-;45620:45;45640:24;45658:5;45640:24;:::i;:::-;45620:45;:::i;:::-;45615:3;45608:58;45515:157;;:::o;45678:538::-;45846:3;45861:75;45932:3;45923:6;45861:75;:::i;:::-;45961:2;45956:3;45952:12;45945:19;;45974:75;46045:3;46036:6;45974:75;:::i;:::-;46074:2;46069:3;46065:12;46058:19;;46087:75;46158:3;46149:6;46087:75;:::i;:::-;46187:2;46182:3;46178:12;46171:19;;46207:3;46200:10;;45678:538;;;;;;:::o;46222:180::-;46270:77;46267:1;46260:88;46367:4;46364:1;46357:15;46391:4;46388:1;46381:15;46408:176;46440:1;46457:20;46475:1;46457:20;:::i;:::-;46452:25;;46491:20;46509:1;46491:20;:::i;:::-;46486:25;;46530:1;46520:35;;46535:18;;:::i;:::-;46520:35;46576:1;46573;46569:9;46564:14;;46408:176;;;;:::o;46590:185::-;46630:1;46647:20;46665:1;46647:20;:::i;:::-;46642:25;;46681:20;46699:1;46681:20;:::i;:::-;46676:25;;46720:1;46710:35;;46725:18;;:::i;:::-;46710:35;46767:1;46764;46760:9;46755:14;;46590:185;;;;:::o;46781:158::-;46921:6;46917:1;46909:6;46905:14;46898:30;46781:158;:::o;46949:416::-;47109:3;47134:84;47216:1;47211:3;47134:84;:::i;:::-;47127:91;;47231:93;47320:3;47231:93;:::i;:::-;47353:1;47348:3;47344:11;47337:18;;46949:416;;;:::o;47375:159::-;47519:3;47515:1;47507:6;47503:14;47496:27;47375:159;:::o;47544:416::-;47704:3;47729:84;47811:1;47806:3;47729:84;:::i;:::-;47722:91;;47826:93;47915:3;47826:93;:::i;:::-;47948:1;47943:3;47939:11;47932:18;;47544:416;;;:::o;47970:151::-;48110:3;48106:1;48098:6;48094:14;48087:27;47970:151;:::o;48127:400::-;48287:3;48308:84;48390:1;48385:3;48308:84;:::i;:::-;48301:91;;48401:93;48490:3;48401:93;:::i;:::-;48519:1;48514:3;48510:11;48503:18;;48127:400;;;:::o;48533:1659::-;49165:3;49187:148;49331:3;49187:148;:::i;:::-;49180:155;;49352:95;49443:3;49434:6;49352:95;:::i;:::-;49345:102;;49464:148;49608:3;49464:148;:::i;:::-;49457:155;;49629:95;49720:3;49711:6;49629:95;:::i;:::-;49622:102;;49741:148;49885:3;49741:148;:::i;:::-;49734:155;;49906:95;49997:3;49988:6;49906:95;:::i;:::-;49899:102;;50018:148;50162:3;50018:148;:::i;:::-;50011:155;;50183:3;50176:10;;48533:1659;;;;;;:::o;50198:194::-;50238:4;50258:20;50276:1;50258:20;:::i;:::-;50253:25;;50292:20;50310:1;50292:20;:::i;:::-;50287:25;;50336:1;50333;50329:9;50321:17;;50360:1;50354:4;50351:11;50348:37;;;50365:18;;:::i;:::-;50348:37;50198:194;;;;:::o;50398:410::-;50438:7;50461:20;50479:1;50461:20;:::i;:::-;50456:25;;50495:20;50513:1;50495:20;:::i;:::-;50490:25;;50550:1;50547;50543:9;50572:30;50590:11;50572:30;:::i;:::-;50561:41;;50751:1;50742:7;50738:15;50735:1;50732:22;50712:1;50705:9;50685:83;50662:139;;50781:18;;:::i;:::-;50662:139;50446:362;50398:410;;;;:::o;50814:98::-;50865:6;50899:5;50893:12;50883:22;;50814:98;;;:::o;50918:168::-;51001:11;51035:6;51030:3;51023:19;51075:4;51070:3;51066:14;51051:29;;50918:168;;;;:::o;51092:373::-;51178:3;51206:38;51238:5;51206:38;:::i;:::-;51260:70;51323:6;51318:3;51260:70;:::i;:::-;51253:77;;51339:65;51397:6;51392:3;51385:4;51378:5;51374:16;51339:65;:::i;:::-;51429:29;51451:6;51429:29;:::i;:::-;51424:3;51420:39;51413:46;;51182:283;51092:373;;;;:::o;51471:640::-;51666:4;51704:3;51693:9;51689:19;51681:27;;51718:71;51786:1;51775:9;51771:17;51762:6;51718:71;:::i;:::-;51799:72;51867:2;51856:9;51852:18;51843:6;51799:72;:::i;:::-;51881;51949:2;51938:9;51934:18;51925:6;51881:72;:::i;:::-;52000:9;51994:4;51990:20;51985:2;51974:9;51970:18;51963:48;52028:76;52099:4;52090:6;52028:76;:::i;:::-;52020:84;;51471:640;;;;;;;:::o;52117:141::-;52173:5;52204:6;52198:13;52189:22;;52220:32;52246:5;52220:32;:::i;:::-;52117:141;;;;:::o;52264:349::-;52333:6;52382:2;52370:9;52361:7;52357:23;52353:32;52350:119;;;52388:79;;:::i;:::-;52350:119;52508:1;52533:63;52588:7;52579:6;52568:9;52564:22;52533:63;:::i;:::-;52523:73;;52479:127;52264:349;;;;:::o

Swarm Source

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