ETH Price: $3,010.90 (+4.51%)
Gas: 2 Gwei

Token

KageOrb (KageOrb)
 

Overview

Max Total Supply

895 KageOrb

Holders

259

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 KageOrb
0x4fed4b86b2f634b2acb2d0c0c4bd7d26e2b4d3cd
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:
KageOrb

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-14
*/

// SPDX-License-Identifier: MIT
// File: contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

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

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

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

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

    // ==============================
    //        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);
}
// File: contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // 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 tokenId of the next token 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`
    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 => address) private _tokenApprovals;

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

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

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

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view 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 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 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 returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    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: 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.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (_addressToUint256(owner) == 0) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

    /**
     * Returns the auxillary 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 auxillary 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 {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

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

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = address(uint160(_packedOwnershipOf(tokenId)));
        if (to == owner) revert ApprovalToCurrentOwner();

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

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

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, 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.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (_addressToUint256(to) == 0) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.code.length != 0) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @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.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (_addressToUint256(to) == 0) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

        address approvedAddress = _tokenApprovals[tokenId];

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            approvedAddress == _msgSenderERC721A());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (_addressToUint256(to) == 0) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        if (_addressToUint256(approvedAddress) != 0) {
            delete _tokenApprovals[tokenId];
        }

        // 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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

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

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

    /**
     * @dev Equivalent to `_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));
        address approvedAddress = _tokenApprovals[tokenId];

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
                isApprovedForAll(from, _msgSenderERC721A()) ||
                approvedAddress == _msgSenderERC721A());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        if (_addressToUint256(approvedAddress) != 0) {
            delete _tokenApprovals[tokenId];
        }

        // 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] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;

            // 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++;
        }
    }

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

    /**
     * @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 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 returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), 
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length, 
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

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

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for { 
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp { 
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } { // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }
            
            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}
// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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

// File: contracts/KageOrb.sol


pragma solidity ^0.8.0;




interface iMetakages {
    function ownerOf(uint256 tokenId) external view returns (address);
    }
contract KageOrb is ERC721A, Ownable {
     iMetakages public Metakages;

    uint256 public MAX_SUPPLY = 3000;

    bool public isPresaleActive = false;

    bool _revealed = false;

    string private baseURI = "";

    bytes32 freemintRoot;

    struct UserPurchaseInfo {
        uint256 freeMinted;
    }

    mapping(address => UserPurchaseInfo) public userPurchase;
    mapping(address => uint256) addressBlockBought;
    mapping(uint256 => bool) public claimed;
    uint256[] public claimedIds;
    mapping(bytes32 => bool) public usedDigests;

    constructor(address MetakagesAddress) ERC721A("KageOrb", "KageOrb") {
          Metakages = iMetakages(MetakagesAddress);
    }

    modifier isSecured(uint8 mintType) {
        require(
            addressBlockBought[msg.sender] < block.timestamp,
            "CANNOT_MINT_ON_THE_SAME_BLOCK"
        );
        require(tx.origin == msg.sender, "CONTRACTS_NOT_ALLOWED_TO_MINT");
        if (mintType == 3) {
            require(isPresaleActive, "FREE_MINT_IS_NOT_YET_ACTIVE");
        }

        _;
    }

    modifier supplyMintLimit(uint256 numberOfTokens) {
        require(
            numberOfTokens + totalSupply() <= MAX_SUPPLY,
            "NOT_ENOUGH_SUPPLY"
        );
        _;
    }

    function mint(uint256[] memory tokenIds)
        external
        isSecured(3)
        supplyMintLimit(tokenIds.length)
    {
        for(uint256 id = 0; id < tokenIds.length; id++) {
            require(Metakages.ownerOf(tokenIds[id]) == msg.sender, "MUST_OWN_ALL_TOKENS");
            require(claimed[tokenIds[id]] == false, "TOKEN_ALREADY_CLAIMED");
            claimed[tokenIds[id]] = true;
            claimedIds.push(tokenIds[id]);
        }
        addressBlockBought[msg.sender] = block.timestamp;
        
        _mint(msg.sender, tokenIds.length);
    }

    function freeMint(
        bytes32[] memory proof,
        uint256 numberOfTokens,
        uint256 maxMint
    ) external isSecured(3) supplyMintLimit(numberOfTokens) {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender, maxMint));
        require(MerkleProof.verify(proof, freemintRoot, leaf), "PROOF_INVALID");
        require(
            userPurchase[msg.sender].freeMinted + numberOfTokens <= maxMint,
            "EXCEED_ALLOCATED_MINT_LIMIT"
        );
        addressBlockBought[msg.sender] = block.timestamp;
        userPurchase[msg.sender].freeMinted += numberOfTokens;
        _mint(msg.sender, numberOfTokens);
    }

    function devMint(address[] memory _addresses, uint256[] memory quantities)
        external
        onlyOwner
    {
        require(_addresses.length == quantities.length, "WRONG_PARAMETERS");
        uint256 totalTokens = 0;
        for (uint256 i = 0; i < quantities.length; i++) {
            totalTokens += quantities[i];
        }
        require(totalTokens + totalSupply() <= MAX_SUPPLY, "NOT_ENOUGH_SUPPLY");
        for (uint256 i = 0; i < _addresses.length; i++) {
            _safeMint(_addresses[i], quantities[i]);
        }
    }

    //Essential
    function setBaseURI(string calldata URI) external onlyOwner {
        baseURI = URI;
    }

    function reveal(bool revealed, string calldata _baseURI) public onlyOwner {
        _revealed = revealed;
        baseURI = _baseURI;
    }

    function setPreSaleStatus() external onlyOwner {
        isPresaleActive = !isPresaleActive;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        if (_revealed) {
            return string(abi.encodePacked(baseURI, Strings.toString(tokenId)));
        } else {
            return string(abi.encodePacked(baseURI));
        }
    }

    function setFreeMintRoot(bytes32 _freemintRoot) external onlyOwner {
        freemintRoot = _freemintRoot;
    }

    function decreaseSupply(uint256 _maxSupply) external onlyOwner {
        require(_maxSupply < MAX_SUPPLY, "CANT_INCREASE_SUPPLY");
        MAX_SUPPLY = _maxSupply;
    }

    function getClaimed()
        public
        view
        returns (uint256[] memory)
    {
        return claimedIds;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"MetakagesAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","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":"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_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Metakages","outputs":[{"internalType":"contract iMetakages","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimedIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"decreaseSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"quantities","type":"uint256[]"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"uint256","name":"maxMint","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimed","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","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":[{"internalType":"bool","name":"revealed","type":"bool"},{"internalType":"string","name":"_baseURI","type":"string"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_freemintRoot","type":"bytes32"}],"name":"setFreeMintRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPreSaleStatus","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"usedDigests","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userPurchase","outputs":[{"internalType":"uint256","name":"freeMinted","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080604052610bb8600a556000600b60006101000a81548160ff0219169083151502179055506000600b60016101000a81548160ff02191690831515021790555060405180602001604052806000815250600c9080519060200190620000679291906200028c565b503480156200007557600080fd5b506040516200467c3803806200467c83398181016040528101906200009b919062000353565b6040518060400160405280600781526020017f4b6167654f7262000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f4b6167654f72620000000000000000000000000000000000000000000000000081525081600290805190602001906200011f9291906200028c565b508060039080519060200190620001389291906200028c565b5062000149620001b960201b60201c565b60008190555050506200017162000165620001be60201b60201c565b620001c660201b60201c565b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506200043d565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200029a90620003b9565b90600052602060002090601f016020900481019282620002be57600085556200030a565b82601f10620002d957805160ff19168380011785556200030a565b828001600101855582156200030a579182015b8281111562000309578251825591602001919060010190620002ec565b5b5090506200031991906200031d565b5090565b5b80821115620003385760008160009055506001016200031e565b5090565b6000815190506200034d8162000423565b92915050565b6000602082840312156200036c576200036b6200041e565b5b60006200037c848285016200033c565b91505092915050565b6000620003928262000399565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006002820490506001821680620003d257607f821691505b60208210811415620003e957620003e8620003ef565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6200042e8162000385565b81146200043a57600080fd5b50565b61422f806200044d6000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c806370c425751161011a578063b484eff7116100ad578063d39c4de71161007c578063d39c4de714610588578063dbe7e3bd146105b8578063e985e9c5146105e8578063f2fde38b14610618578063f8e93ef914610634576101fb565b8063b484eff7146104ee578063b88d4fde1461051e578063c87b56dd1461053a578063d2fe4a9c1461056a576101fb565b806398e52f9a116100e957806398e52f9a1461047c578063a101ff6d14610498578063a22cb465146104b4578063ae3bb460146104d0576101fb565b806370c425751461041a578063715018a6146104365780638da5cb5b1461044057806395d89b411461045e576101fb565b806334837ad31161019257806360d938dc1161016157806360d938dc1461036c5780636352211e1461038a57806369cdcfdc146103ba57806370a08231146103ea576101fb565b806334837ad31461030e5780633e07ac021461032a57806342842e0e1461033457806355f804b314610350576101fb565b806318160ddd116101ce57806318160ddd1461029a57806323b872dd146102b85780632446548f146102d457806332cb6b0c146102f0576101fb565b806301ffc9a71461020057806306fdde0314610230578063081812fc1461024e578063095ea7b31461027e575b600080fd5b61021a600480360381019061021591906132ba565b610650565b6040516102279190613833565b60405180910390f35b6102386106e2565b6040516102459190613869565b60405180910390f35b61026860048036038101906102639190613361565b610774565b60405161027591906137aa565b60405180910390f35b610298600480360381019061029391906130bd565b6107f0565b005b6102a2610997565b6040516102af9190613a0b565b60405180910390f35b6102d260048036038101906102cd9190612fa7565b6109ae565b005b6102ee60048036038101906102e991906130fd565b6109be565b005b6102f8610b81565b6040516103059190613a0b565b60405180910390f35b61032860048036038101906103239190613175565b610b87565b005b610332610ee4565b005b61034e60048036038101906103499190612fa7565b610f8c565b005b61036a60048036038101906103659190613314565b610fac565b005b61037461103e565b6040516103819190613833565b60405180910390f35b6103a4600480360381019061039f9190613361565b611051565b6040516103b191906137aa565b60405180910390f35b6103d460048036038101906103cf9190613361565b611063565b6040516103e19190613a0b565b60405180910390f35b61040460048036038101906103ff9190612f0d565b611087565b6040516104119190613a0b565b60405180910390f35b610434600480360381019061042f919061328d565b61111c565b005b61043e6111a2565b005b61044861122a565b60405161045591906137aa565b60405180910390f35b610466611254565b6040516104739190613869565b60405180910390f35b61049660048036038101906104919190613361565b6112e6565b005b6104b260048036038101906104ad919061322d565b6113b0565b005b6104ce60048036038101906104c9919061307d565b61145d565b005b6104d86115d5565b6040516104e59190613811565b60405180910390f35b61050860048036038101906105039190612f0d565b61162d565b6040516105159190613a0b565b60405180910390f35b61053860048036038101906105339190612ffa565b61164b565b005b610554600480360381019061054f9190613361565b6116be565b6040516105619190613869565b60405180910390f35b610572611730565b60405161057f919061384e565b60405180910390f35b6105a2600480360381019061059d919061328d565b611756565b6040516105af9190613833565b60405180910390f35b6105d260048036038101906105cd9190613361565b611776565b6040516105df9190613833565b60405180910390f35b61060260048036038101906105fd9190612f67565b611796565b60405161060f9190613833565b60405180910390f35b610632600480360381019061062d9190612f0d565b61182a565b005b61064e600480360381019061064991906131e4565b611922565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106ab57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106db5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546106f190613d42565b80601f016020809104026020016040519081016040528092919081815260200182805461071d90613d42565b801561076a5780601f1061073f5761010080835404028352916020019161076a565b820191906000526020600020905b81548152906001019060200180831161074d57829003601f168201915b5050505050905090565b600061077f82611d78565b6107b5576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107fb82611dd7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610863576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610882611ea5565b73ffffffffffffffffffffffffffffffffffffffff16146108e5576108ae816108a9611ea5565b611796565b6108e4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006109a1611ead565b6001546000540303905090565b6109b9838383611eb2565b505050565b6109c661227a565b73ffffffffffffffffffffffffffffffffffffffff166109e461122a565b73ffffffffffffffffffffffffffffffffffffffff1614610a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a319061396b565b60405180910390fd5b8051825114610a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a759061388b565b60405180910390fd5b6000805b8251811015610ac657828181518110610a9e57610a9d613eda565b5b602002602001015182610ab19190613b91565b91508080610abe90613da5565b915050610a82565b50600a54610ad2610997565b82610add9190613b91565b1115610b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b15906139ab565b60405180910390fd5b60005b8351811015610b7b57610b68848281518110610b4057610b3f613eda565b5b6020026020010151848381518110610b5b57610b5a613eda565b5b6020026020010151612282565b8080610b7390613da5565b915050610b21565b50505050565b600a5481565b600342600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c019061392b565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6f906138ab565b60405180910390fd5b60038160ff161415610cd457600b60009054906101000a900460ff16610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca9061390b565b60405180910390fd5b5b82600a54610ce0610997565b82610ceb9190613b91565b1115610d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d23906139ab565b60405180910390fd5b60003384604051602001610d41929190613743565b604051602081830303815290604052805190602001209050610d6686600d54836122a0565b610da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9c906139eb565b60405180910390fd5b8385600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154610df49190613b91565b1115610e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2c9061398b565b60405180910390fd5b42600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555084600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610ecb9190613b91565b92505081905550610edc33866122b7565b505050505050565b610eec61227a565b73ffffffffffffffffffffffffffffffffffffffff16610f0a61122a565b73ffffffffffffffffffffffffffffffffffffffff1614610f60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f579061396b565b60405180910390fd5b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b610fa78383836040518060200160405280600081525061164b565b505050565b610fb461227a565b73ffffffffffffffffffffffffffffffffffffffff16610fd261122a565b73ffffffffffffffffffffffffffffffffffffffff1614611028576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101f9061396b565b60405180910390fd5b8181600c9190611039929190612b37565b505050565b600b60009054906101000a900460ff1681565b600061105c82611dd7565b9050919050565b6011818154811061107357600080fd5b906000526020600020016000915090505481565b60008061109383612467565b14156110cb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61112461227a565b73ffffffffffffffffffffffffffffffffffffffff1661114261122a565b73ffffffffffffffffffffffffffffffffffffffff1614611198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118f9061396b565b60405180910390fd5b80600d8190555050565b6111aa61227a565b73ffffffffffffffffffffffffffffffffffffffff166111c861122a565b73ffffffffffffffffffffffffffffffffffffffff161461121e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112159061396b565b60405180910390fd5b6112286000612471565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461126390613d42565b80601f016020809104026020016040519081016040528092919081815260200182805461128f90613d42565b80156112dc5780601f106112b1576101008083540402835291602001916112dc565b820191906000526020600020905b8154815290600101906020018083116112bf57829003601f168201915b5050505050905090565b6112ee61227a565b73ffffffffffffffffffffffffffffffffffffffff1661130c61122a565b73ffffffffffffffffffffffffffffffffffffffff1614611362576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113599061396b565b60405180910390fd5b600a5481106113a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139d9061394b565b60405180910390fd5b80600a8190555050565b6113b861227a565b73ffffffffffffffffffffffffffffffffffffffff166113d661122a565b73ffffffffffffffffffffffffffffffffffffffff161461142c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114239061396b565b60405180910390fd5b82600b60016101000a81548160ff0219169083151502179055508181600c9190611457929190612b37565b50505050565b611465611ea5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114ca576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006114d7611ea5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611584611ea5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115c99190613833565b60405180910390a35050565b6060601180548060200260200160405190810160405280929190818152602001828054801561162357602002820191906000526020600020905b81548152602001906001019080831161160f575b5050505050905090565b600e6020528060005260406000206000915090508060000154905081565b611656848484611eb2565b60008373ffffffffffffffffffffffffffffffffffffffff163b146116b85761168184848484612537565b6116b7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600b60019054906101000a900460ff161561170757600c6116e083612697565b6040516020016116f1929190613786565b604051602081830303815290604052905061172b565b600c604051602001611719919061376f565b60405160208183030381529060405290505b919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60126020528060005260406000206000915054906101000a900460ff1681565b60106020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61183261227a565b73ffffffffffffffffffffffffffffffffffffffff1661185061122a565b73ffffffffffffffffffffffffffffffffffffffff16146118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d9061396b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190d906138eb565b60405180910390fd5b61191f81612471565b50565b600342600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106119a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199c9061392b565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0a906138ab565b60405180910390fd5b60038160ff161415611a6f57600b60009054906101000a900460ff16611a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a659061390b565b60405180910390fd5b5b8151600a54611a7c610997565b82611a879190613b91565b1115611ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abf906139ab565b60405180910390fd5b60005b8351811015611d23573373ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e868481518110611b3c57611b3b613eda565b5b60200260200101516040518263ffffffff1660e01b8152600401611b609190613a0b565b60206040518083038186803b158015611b7857600080fd5b505afa158015611b8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb09190612f3a565b73ffffffffffffffffffffffffffffffffffffffff1614611c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfd906138cb565b60405180910390fd5b6000151560106000868481518110611c2157611c20613eda565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff16151514611c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7e906139cb565b60405180910390fd5b600160106000868481518110611ca057611c9f613eda565b5b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055506011848281518110611ce257611ce1613eda565b5b602002602001015190806001815401808255809150506001900390600052602060002001600090919091909150558080611d1b90613da5565b915050611acb565b5042600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611d733384516122b7565b505050565b600081611d83611ead565b11158015611d92575060005482105b8015611dd0575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611de6611ead565b11611e6e57600054811015611e6d5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611e6b575b6000811415611e61576004600083600190039350838152602001908152602001600020549050611e36565b8092505050611ea0565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611ebd82611dd7565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611f24576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff16611f7d611ea5565b73ffffffffffffffffffffffffffffffffffffffff161480611fac5750611fab86611fa6611ea5565b611796565b5b80611fe95750611fba611ea5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b905080612022576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061202d86612467565b1415612065576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61207286868660016127f8565b600061207d83612467565b146120b9576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61218087612467565b1717600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561220a576000600185019050600060046000838152602001908152602001600020541415612208576000548114612207578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461227286868660016127fe565b505050505050565b600033905090565b61229c828260405180602001604052806000815250612804565b5050565b6000826122ad8584612a95565b1490509392505050565b60008054905060006122c884612467565b1415612300576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082141561233b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61234860008483856127f8565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16123ad60018414612aeb565b901b60a042901b6123bd85612467565b171760046000838152602001908152602001600020819055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106123e35781600081905550505061246260008483856127fe565b505050565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261255d611ea5565b8786866040518563ffffffff1660e01b815260040161257f94939291906137c5565b602060405180830381600087803b15801561259957600080fd5b505af19250505080156125ca57506040513d601f19601f820116820180604052508101906125c791906132e7565b60015b612644573d80600081146125fa576040519150601f19603f3d011682016040523d82523d6000602084013e6125ff565b606091505b5060008151141561263c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008214156126df576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127f3565b600082905060005b600082146127115780806126fa90613da5565b915050600a8261270a9190613be7565b91506126e7565b60008167ffffffffffffffff81111561272d5761272c613f09565b5b6040519080825280601f01601f19166020018201604052801561275f5781602001600182028036833780820191505090505b5090505b600085146127ec576001826127789190613c18565b9150600a856127879190613e1c565b60306127939190613b91565b60f81b8183815181106127a9576127a8613eda565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127e59190613be7565b9450612763565b8093505050505b919050565b50505050565b50505050565b600080549050600061281585612467565b141561284d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612888576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61289560008583866127f8565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16128fa60018514612aeb565b901b60a042901b61290a86612467565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612a0e575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129be6000878480600101955087612537565b6129f4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061294f578260005414612a0957600080fd5b612a79565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612a0f575b816000819055505050612a8f60008583866127fe565b50505050565b60008082905060005b8451811015612ae057612acb82868381518110612abe57612abd613eda565b5b6020026020010151612af5565b91508080612ad890613da5565b915050612a9e565b508091505092915050565b6000819050919050565b6000818310612b0d57612b088284612b20565b612b18565b612b178383612b20565b5b905092915050565b600082600052816020526040600020905092915050565b828054612b4390613d42565b90600052602060002090601f016020900481019282612b655760008555612bac565b82601f10612b7e57803560ff1916838001178555612bac565b82800160010185558215612bac579182015b82811115612bab578235825591602001919060010190612b90565b5b509050612bb99190612bbd565b5090565b5b80821115612bd6576000816000905550600101612bbe565b5090565b6000612bed612be884613a4b565b613a26565b90508083825260208201905082856020860282011115612c1057612c0f613f42565b5b60005b85811015612c405781612c268882612d6c565b845260208401935060208301925050600181019050612c13565b5050509392505050565b6000612c5d612c5884613a77565b613a26565b90508083825260208201905082856020860282011115612c8057612c7f613f42565b5b60005b85811015612cb05781612c968882612e35565b845260208401935060208301925050600181019050612c83565b5050509392505050565b6000612ccd612cc884613aa3565b613a26565b90508083825260208201905082856020860282011115612cf057612cef613f42565b5b60005b85811015612d205781612d068882612ef8565b845260208401935060208301925050600181019050612cf3565b5050509392505050565b6000612d3d612d3884613acf565b613a26565b905082815260208101848484011115612d5957612d58613f47565b5b612d64848285613d00565b509392505050565b600081359050612d7b81614186565b92915050565b600081519050612d9081614186565b92915050565b600082601f830112612dab57612daa613f3d565b5b8135612dbb848260208601612bda565b91505092915050565b600082601f830112612dd957612dd8613f3d565b5b8135612de9848260208601612c4a565b91505092915050565b600082601f830112612e0757612e06613f3d565b5b8135612e17848260208601612cba565b91505092915050565b600081359050612e2f8161419d565b92915050565b600081359050612e44816141b4565b92915050565b600081359050612e59816141cb565b92915050565b600081519050612e6e816141cb565b92915050565b600082601f830112612e8957612e88613f3d565b5b8135612e99848260208601612d2a565b91505092915050565b60008083601f840112612eb857612eb7613f3d565b5b8235905067ffffffffffffffff811115612ed557612ed4613f38565b5b602083019150836001820283011115612ef157612ef0613f42565b5b9250929050565b600081359050612f07816141e2565b92915050565b600060208284031215612f2357612f22613f51565b5b6000612f3184828501612d6c565b91505092915050565b600060208284031215612f5057612f4f613f51565b5b6000612f5e84828501612d81565b91505092915050565b60008060408385031215612f7e57612f7d613f51565b5b6000612f8c85828601612d6c565b9250506020612f9d85828601612d6c565b9150509250929050565b600080600060608486031215612fc057612fbf613f51565b5b6000612fce86828701612d6c565b9350506020612fdf86828701612d6c565b9250506040612ff086828701612ef8565b9150509250925092565b6000806000806080858703121561301457613013613f51565b5b600061302287828801612d6c565b945050602061303387828801612d6c565b935050604061304487828801612ef8565b925050606085013567ffffffffffffffff81111561306557613064613f4c565b5b61307187828801612e74565b91505092959194509250565b6000806040838503121561309457613093613f51565b5b60006130a285828601612d6c565b92505060206130b385828601612e20565b9150509250929050565b600080604083850312156130d4576130d3613f51565b5b60006130e285828601612d6c565b92505060206130f385828601612ef8565b9150509250929050565b6000806040838503121561311457613113613f51565b5b600083013567ffffffffffffffff81111561313257613131613f4c565b5b61313e85828601612d96565b925050602083013567ffffffffffffffff81111561315f5761315e613f4c565b5b61316b85828601612df2565b9150509250929050565b60008060006060848603121561318e5761318d613f51565b5b600084013567ffffffffffffffff8111156131ac576131ab613f4c565b5b6131b886828701612dc4565b93505060206131c986828701612ef8565b92505060406131da86828701612ef8565b9150509250925092565b6000602082840312156131fa576131f9613f51565b5b600082013567ffffffffffffffff81111561321857613217613f4c565b5b61322484828501612df2565b91505092915050565b60008060006040848603121561324657613245613f51565b5b600061325486828701612e20565b935050602084013567ffffffffffffffff81111561327557613274613f4c565b5b61328186828701612ea2565b92509250509250925092565b6000602082840312156132a3576132a2613f51565b5b60006132b184828501612e35565b91505092915050565b6000602082840312156132d0576132cf613f51565b5b60006132de84828501612e4a565b91505092915050565b6000602082840312156132fd576132fc613f51565b5b600061330b84828501612e5f565b91505092915050565b6000806020838503121561332b5761332a613f51565b5b600083013567ffffffffffffffff81111561334957613348613f4c565b5b61335585828601612ea2565b92509250509250929050565b60006020828403121561337757613376613f51565b5b600061338584828501612ef8565b91505092915050565b600061339a838361370e565b60208301905092915050565b6133af81613c4c565b82525050565b6133c66133c182613c4c565b613dee565b82525050565b60006133d782613b25565b6133e18185613b53565b93506133ec83613b00565b8060005b8381101561341d578151613404888261338e565b975061340f83613b46565b9250506001810190506133f0565b5085935050505092915050565b61343381613c5e565b82525050565b600061344482613b30565b61344e8185613b64565b935061345e818560208601613d0f565b61346781613f56565b840191505092915050565b61347b81613cca565b82525050565b600061348c82613b3b565b6134968185613b75565b93506134a6818560208601613d0f565b6134af81613f56565b840191505092915050565b60006134c582613b3b565b6134cf8185613b86565b93506134df818560208601613d0f565b80840191505092915050565b600081546134f881613d42565b6135028186613b86565b9450600182166000811461351d576001811461352e57613561565b60ff19831686528186019350613561565b61353785613b10565b60005b838110156135595781548189015260018201915060208101905061353a565b838801955050505b50505092915050565b6000613577601083613b75565b915061358282613f74565b602082019050919050565b600061359a601d83613b75565b91506135a582613f9d565b602082019050919050565b60006135bd601383613b75565b91506135c882613fc6565b602082019050919050565b60006135e0602683613b75565b91506135eb82613fef565b604082019050919050565b6000613603601b83613b75565b915061360e8261403e565b602082019050919050565b6000613626601d83613b75565b915061363182614067565b602082019050919050565b6000613649601483613b75565b915061365482614090565b602082019050919050565b600061366c602083613b75565b9150613677826140b9565b602082019050919050565b600061368f601b83613b75565b915061369a826140e2565b602082019050919050565b60006136b2601183613b75565b91506136bd8261410b565b602082019050919050565b60006136d5601583613b75565b91506136e082614134565b602082019050919050565b60006136f8600d83613b75565b91506137038261415d565b602082019050919050565b61371781613cc0565b82525050565b61372681613cc0565b82525050565b61373d61373882613cc0565b613e12565b82525050565b600061374f82856133b5565b60148201915061375f828461372c565b6020820191508190509392505050565b600061377b82846134eb565b915081905092915050565b600061379282856134eb565b915061379e82846134ba565b91508190509392505050565b60006020820190506137bf60008301846133a6565b92915050565b60006080820190506137da60008301876133a6565b6137e760208301866133a6565b6137f4604083018561371d565b81810360608301526138068184613439565b905095945050505050565b6000602082019050818103600083015261382b81846133cc565b905092915050565b6000602082019050613848600083018461342a565b92915050565b60006020820190506138636000830184613472565b92915050565b600060208201905081810360008301526138838184613481565b905092915050565b600060208201905081810360008301526138a48161356a565b9050919050565b600060208201905081810360008301526138c48161358d565b9050919050565b600060208201905081810360008301526138e4816135b0565b9050919050565b60006020820190508181036000830152613904816135d3565b9050919050565b60006020820190508181036000830152613924816135f6565b9050919050565b6000602082019050818103600083015261394481613619565b9050919050565b600060208201905081810360008301526139648161363c565b9050919050565b600060208201905081810360008301526139848161365f565b9050919050565b600060208201905081810360008301526139a481613682565b9050919050565b600060208201905081810360008301526139c4816136a5565b9050919050565b600060208201905081810360008301526139e4816136c8565b9050919050565b60006020820190508181036000830152613a04816136eb565b9050919050565b6000602082019050613a20600083018461371d565b92915050565b6000613a30613a41565b9050613a3c8282613d74565b919050565b6000604051905090565b600067ffffffffffffffff821115613a6657613a65613f09565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613a9257613a91613f09565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613abe57613abd613f09565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613aea57613ae9613f09565b5b613af382613f56565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b9c82613cc0565b9150613ba783613cc0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613bdc57613bdb613e4d565b5b828201905092915050565b6000613bf282613cc0565b9150613bfd83613cc0565b925082613c0d57613c0c613e7c565b5b828204905092915050565b6000613c2382613cc0565b9150613c2e83613cc0565b925082821015613c4157613c40613e4d565b5b828203905092915050565b6000613c5782613ca0565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613cd582613cdc565b9050919050565b6000613ce782613cee565b9050919050565b6000613cf982613ca0565b9050919050565b82818337600083830152505050565b60005b83811015613d2d578082015181840152602081019050613d12565b83811115613d3c576000848401525b50505050565b60006002820490506001821680613d5a57607f821691505b60208210811415613d6e57613d6d613eab565b5b50919050565b613d7d82613f56565b810181811067ffffffffffffffff82111715613d9c57613d9b613f09565b5b80604052505050565b6000613db082613cc0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613de357613de2613e4d565b5b600182019050919050565b6000613df982613e00565b9050919050565b6000613e0b82613f67565b9050919050565b6000819050919050565b6000613e2782613cc0565b9150613e3283613cc0565b925082613e4257613e41613e7c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f57524f4e475f504152414d455445525300000000000000000000000000000000600082015250565b7f434f4e5452414354535f4e4f545f414c4c4f5745445f544f5f4d494e54000000600082015250565b7f4d5553545f4f574e5f414c4c5f544f4b454e5300000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f465245455f4d494e545f49535f4e4f545f5945545f4143544956450000000000600082015250565b7f43414e4e4f545f4d494e545f4f4e5f5448455f53414d455f424c4f434b000000600082015250565b7f43414e545f494e4352454153455f535550504c59000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4558434545445f414c4c4f43415445445f4d494e545f4c494d49540000000000600082015250565b7f4e4f545f454e4f5547485f535550504c59000000000000000000000000000000600082015250565b7f544f4b454e5f414c52454144595f434c41494d45440000000000000000000000600082015250565b7f50524f4f465f494e56414c494400000000000000000000000000000000000000600082015250565b61418f81613c4c565b811461419a57600080fd5b50565b6141a681613c5e565b81146141b157600080fd5b50565b6141bd81613c6a565b81146141c857600080fd5b50565b6141d481613c74565b81146141df57600080fd5b50565b6141eb81613cc0565b81146141f657600080fd5b5056fea2646970667358221220813a8872370d08a1e0e4b1d65598230c1a72a2267f2e82e1b137cc1eb423e2ec64736f6c63430008070033000000000000000000000000b5f8ca23320ad5bd6d5263bfa008b4dbeab4f0d2

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c806370c425751161011a578063b484eff7116100ad578063d39c4de71161007c578063d39c4de714610588578063dbe7e3bd146105b8578063e985e9c5146105e8578063f2fde38b14610618578063f8e93ef914610634576101fb565b8063b484eff7146104ee578063b88d4fde1461051e578063c87b56dd1461053a578063d2fe4a9c1461056a576101fb565b806398e52f9a116100e957806398e52f9a1461047c578063a101ff6d14610498578063a22cb465146104b4578063ae3bb460146104d0576101fb565b806370c425751461041a578063715018a6146104365780638da5cb5b1461044057806395d89b411461045e576101fb565b806334837ad31161019257806360d938dc1161016157806360d938dc1461036c5780636352211e1461038a57806369cdcfdc146103ba57806370a08231146103ea576101fb565b806334837ad31461030e5780633e07ac021461032a57806342842e0e1461033457806355f804b314610350576101fb565b806318160ddd116101ce57806318160ddd1461029a57806323b872dd146102b85780632446548f146102d457806332cb6b0c146102f0576101fb565b806301ffc9a71461020057806306fdde0314610230578063081812fc1461024e578063095ea7b31461027e575b600080fd5b61021a600480360381019061021591906132ba565b610650565b6040516102279190613833565b60405180910390f35b6102386106e2565b6040516102459190613869565b60405180910390f35b61026860048036038101906102639190613361565b610774565b60405161027591906137aa565b60405180910390f35b610298600480360381019061029391906130bd565b6107f0565b005b6102a2610997565b6040516102af9190613a0b565b60405180910390f35b6102d260048036038101906102cd9190612fa7565b6109ae565b005b6102ee60048036038101906102e991906130fd565b6109be565b005b6102f8610b81565b6040516103059190613a0b565b60405180910390f35b61032860048036038101906103239190613175565b610b87565b005b610332610ee4565b005b61034e60048036038101906103499190612fa7565b610f8c565b005b61036a60048036038101906103659190613314565b610fac565b005b61037461103e565b6040516103819190613833565b60405180910390f35b6103a4600480360381019061039f9190613361565b611051565b6040516103b191906137aa565b60405180910390f35b6103d460048036038101906103cf9190613361565b611063565b6040516103e19190613a0b565b60405180910390f35b61040460048036038101906103ff9190612f0d565b611087565b6040516104119190613a0b565b60405180910390f35b610434600480360381019061042f919061328d565b61111c565b005b61043e6111a2565b005b61044861122a565b60405161045591906137aa565b60405180910390f35b610466611254565b6040516104739190613869565b60405180910390f35b61049660048036038101906104919190613361565b6112e6565b005b6104b260048036038101906104ad919061322d565b6113b0565b005b6104ce60048036038101906104c9919061307d565b61145d565b005b6104d86115d5565b6040516104e59190613811565b60405180910390f35b61050860048036038101906105039190612f0d565b61162d565b6040516105159190613a0b565b60405180910390f35b61053860048036038101906105339190612ffa565b61164b565b005b610554600480360381019061054f9190613361565b6116be565b6040516105619190613869565b60405180910390f35b610572611730565b60405161057f919061384e565b60405180910390f35b6105a2600480360381019061059d919061328d565b611756565b6040516105af9190613833565b60405180910390f35b6105d260048036038101906105cd9190613361565b611776565b6040516105df9190613833565b60405180910390f35b61060260048036038101906105fd9190612f67565b611796565b60405161060f9190613833565b60405180910390f35b610632600480360381019061062d9190612f0d565b61182a565b005b61064e600480360381019061064991906131e4565b611922565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106ab57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106db5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546106f190613d42565b80601f016020809104026020016040519081016040528092919081815260200182805461071d90613d42565b801561076a5780601f1061073f5761010080835404028352916020019161076a565b820191906000526020600020905b81548152906001019060200180831161074d57829003601f168201915b5050505050905090565b600061077f82611d78565b6107b5576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107fb82611dd7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610863576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610882611ea5565b73ffffffffffffffffffffffffffffffffffffffff16146108e5576108ae816108a9611ea5565b611796565b6108e4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006109a1611ead565b6001546000540303905090565b6109b9838383611eb2565b505050565b6109c661227a565b73ffffffffffffffffffffffffffffffffffffffff166109e461122a565b73ffffffffffffffffffffffffffffffffffffffff1614610a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a319061396b565b60405180910390fd5b8051825114610a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a759061388b565b60405180910390fd5b6000805b8251811015610ac657828181518110610a9e57610a9d613eda565b5b602002602001015182610ab19190613b91565b91508080610abe90613da5565b915050610a82565b50600a54610ad2610997565b82610add9190613b91565b1115610b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b15906139ab565b60405180910390fd5b60005b8351811015610b7b57610b68848281518110610b4057610b3f613eda565b5b6020026020010151848381518110610b5b57610b5a613eda565b5b6020026020010151612282565b8080610b7390613da5565b915050610b21565b50505050565b600a5481565b600342600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c019061392b565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6f906138ab565b60405180910390fd5b60038160ff161415610cd457600b60009054906101000a900460ff16610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca9061390b565b60405180910390fd5b5b82600a54610ce0610997565b82610ceb9190613b91565b1115610d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d23906139ab565b60405180910390fd5b60003384604051602001610d41929190613743565b604051602081830303815290604052805190602001209050610d6686600d54836122a0565b610da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9c906139eb565b60405180910390fd5b8385600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154610df49190613b91565b1115610e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2c9061398b565b60405180910390fd5b42600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555084600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610ecb9190613b91565b92505081905550610edc33866122b7565b505050505050565b610eec61227a565b73ffffffffffffffffffffffffffffffffffffffff16610f0a61122a565b73ffffffffffffffffffffffffffffffffffffffff1614610f60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f579061396b565b60405180910390fd5b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b610fa78383836040518060200160405280600081525061164b565b505050565b610fb461227a565b73ffffffffffffffffffffffffffffffffffffffff16610fd261122a565b73ffffffffffffffffffffffffffffffffffffffff1614611028576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101f9061396b565b60405180910390fd5b8181600c9190611039929190612b37565b505050565b600b60009054906101000a900460ff1681565b600061105c82611dd7565b9050919050565b6011818154811061107357600080fd5b906000526020600020016000915090505481565b60008061109383612467565b14156110cb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61112461227a565b73ffffffffffffffffffffffffffffffffffffffff1661114261122a565b73ffffffffffffffffffffffffffffffffffffffff1614611198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118f9061396b565b60405180910390fd5b80600d8190555050565b6111aa61227a565b73ffffffffffffffffffffffffffffffffffffffff166111c861122a565b73ffffffffffffffffffffffffffffffffffffffff161461121e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112159061396b565b60405180910390fd5b6112286000612471565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461126390613d42565b80601f016020809104026020016040519081016040528092919081815260200182805461128f90613d42565b80156112dc5780601f106112b1576101008083540402835291602001916112dc565b820191906000526020600020905b8154815290600101906020018083116112bf57829003601f168201915b5050505050905090565b6112ee61227a565b73ffffffffffffffffffffffffffffffffffffffff1661130c61122a565b73ffffffffffffffffffffffffffffffffffffffff1614611362576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113599061396b565b60405180910390fd5b600a5481106113a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139d9061394b565b60405180910390fd5b80600a8190555050565b6113b861227a565b73ffffffffffffffffffffffffffffffffffffffff166113d661122a565b73ffffffffffffffffffffffffffffffffffffffff161461142c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114239061396b565b60405180910390fd5b82600b60016101000a81548160ff0219169083151502179055508181600c9190611457929190612b37565b50505050565b611465611ea5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114ca576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006114d7611ea5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611584611ea5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115c99190613833565b60405180910390a35050565b6060601180548060200260200160405190810160405280929190818152602001828054801561162357602002820191906000526020600020905b81548152602001906001019080831161160f575b5050505050905090565b600e6020528060005260406000206000915090508060000154905081565b611656848484611eb2565b60008373ffffffffffffffffffffffffffffffffffffffff163b146116b85761168184848484612537565b6116b7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600b60019054906101000a900460ff161561170757600c6116e083612697565b6040516020016116f1929190613786565b604051602081830303815290604052905061172b565b600c604051602001611719919061376f565b60405160208183030381529060405290505b919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60126020528060005260406000206000915054906101000a900460ff1681565b60106020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61183261227a565b73ffffffffffffffffffffffffffffffffffffffff1661185061122a565b73ffffffffffffffffffffffffffffffffffffffff16146118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d9061396b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190d906138eb565b60405180910390fd5b61191f81612471565b50565b600342600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106119a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199c9061392b565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0a906138ab565b60405180910390fd5b60038160ff161415611a6f57600b60009054906101000a900460ff16611a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a659061390b565b60405180910390fd5b5b8151600a54611a7c610997565b82611a879190613b91565b1115611ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abf906139ab565b60405180910390fd5b60005b8351811015611d23573373ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e868481518110611b3c57611b3b613eda565b5b60200260200101516040518263ffffffff1660e01b8152600401611b609190613a0b565b60206040518083038186803b158015611b7857600080fd5b505afa158015611b8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb09190612f3a565b73ffffffffffffffffffffffffffffffffffffffff1614611c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfd906138cb565b60405180910390fd5b6000151560106000868481518110611c2157611c20613eda565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff16151514611c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7e906139cb565b60405180910390fd5b600160106000868481518110611ca057611c9f613eda565b5b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055506011848281518110611ce257611ce1613eda565b5b602002602001015190806001815401808255809150506001900390600052602060002001600090919091909150558080611d1b90613da5565b915050611acb565b5042600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611d733384516122b7565b505050565b600081611d83611ead565b11158015611d92575060005482105b8015611dd0575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611de6611ead565b11611e6e57600054811015611e6d5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611e6b575b6000811415611e61576004600083600190039350838152602001908152602001600020549050611e36565b8092505050611ea0565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611ebd82611dd7565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611f24576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff16611f7d611ea5565b73ffffffffffffffffffffffffffffffffffffffff161480611fac5750611fab86611fa6611ea5565b611796565b5b80611fe95750611fba611ea5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b905080612022576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061202d86612467565b1415612065576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61207286868660016127f8565b600061207d83612467565b146120b9576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61218087612467565b1717600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561220a576000600185019050600060046000838152602001908152602001600020541415612208576000548114612207578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461227286868660016127fe565b505050505050565b600033905090565b61229c828260405180602001604052806000815250612804565b5050565b6000826122ad8584612a95565b1490509392505050565b60008054905060006122c884612467565b1415612300576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082141561233b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61234860008483856127f8565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16123ad60018414612aeb565b901b60a042901b6123bd85612467565b171760046000838152602001908152602001600020819055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106123e35781600081905550505061246260008483856127fe565b505050565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261255d611ea5565b8786866040518563ffffffff1660e01b815260040161257f94939291906137c5565b602060405180830381600087803b15801561259957600080fd5b505af19250505080156125ca57506040513d601f19601f820116820180604052508101906125c791906132e7565b60015b612644573d80600081146125fa576040519150601f19603f3d011682016040523d82523d6000602084013e6125ff565b606091505b5060008151141561263c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008214156126df576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127f3565b600082905060005b600082146127115780806126fa90613da5565b915050600a8261270a9190613be7565b91506126e7565b60008167ffffffffffffffff81111561272d5761272c613f09565b5b6040519080825280601f01601f19166020018201604052801561275f5781602001600182028036833780820191505090505b5090505b600085146127ec576001826127789190613c18565b9150600a856127879190613e1c565b60306127939190613b91565b60f81b8183815181106127a9576127a8613eda565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127e59190613be7565b9450612763565b8093505050505b919050565b50505050565b50505050565b600080549050600061281585612467565b141561284d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612888576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61289560008583866127f8565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16128fa60018514612aeb565b901b60a042901b61290a86612467565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612a0e575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129be6000878480600101955087612537565b6129f4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061294f578260005414612a0957600080fd5b612a79565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612a0f575b816000819055505050612a8f60008583866127fe565b50505050565b60008082905060005b8451811015612ae057612acb82868381518110612abe57612abd613eda565b5b6020026020010151612af5565b91508080612ad890613da5565b915050612a9e565b508091505092915050565b6000819050919050565b6000818310612b0d57612b088284612b20565b612b18565b612b178383612b20565b5b905092915050565b600082600052816020526040600020905092915050565b828054612b4390613d42565b90600052602060002090601f016020900481019282612b655760008555612bac565b82601f10612b7e57803560ff1916838001178555612bac565b82800160010185558215612bac579182015b82811115612bab578235825591602001919060010190612b90565b5b509050612bb99190612bbd565b5090565b5b80821115612bd6576000816000905550600101612bbe565b5090565b6000612bed612be884613a4b565b613a26565b90508083825260208201905082856020860282011115612c1057612c0f613f42565b5b60005b85811015612c405781612c268882612d6c565b845260208401935060208301925050600181019050612c13565b5050509392505050565b6000612c5d612c5884613a77565b613a26565b90508083825260208201905082856020860282011115612c8057612c7f613f42565b5b60005b85811015612cb05781612c968882612e35565b845260208401935060208301925050600181019050612c83565b5050509392505050565b6000612ccd612cc884613aa3565b613a26565b90508083825260208201905082856020860282011115612cf057612cef613f42565b5b60005b85811015612d205781612d068882612ef8565b845260208401935060208301925050600181019050612cf3565b5050509392505050565b6000612d3d612d3884613acf565b613a26565b905082815260208101848484011115612d5957612d58613f47565b5b612d64848285613d00565b509392505050565b600081359050612d7b81614186565b92915050565b600081519050612d9081614186565b92915050565b600082601f830112612dab57612daa613f3d565b5b8135612dbb848260208601612bda565b91505092915050565b600082601f830112612dd957612dd8613f3d565b5b8135612de9848260208601612c4a565b91505092915050565b600082601f830112612e0757612e06613f3d565b5b8135612e17848260208601612cba565b91505092915050565b600081359050612e2f8161419d565b92915050565b600081359050612e44816141b4565b92915050565b600081359050612e59816141cb565b92915050565b600081519050612e6e816141cb565b92915050565b600082601f830112612e8957612e88613f3d565b5b8135612e99848260208601612d2a565b91505092915050565b60008083601f840112612eb857612eb7613f3d565b5b8235905067ffffffffffffffff811115612ed557612ed4613f38565b5b602083019150836001820283011115612ef157612ef0613f42565b5b9250929050565b600081359050612f07816141e2565b92915050565b600060208284031215612f2357612f22613f51565b5b6000612f3184828501612d6c565b91505092915050565b600060208284031215612f5057612f4f613f51565b5b6000612f5e84828501612d81565b91505092915050565b60008060408385031215612f7e57612f7d613f51565b5b6000612f8c85828601612d6c565b9250506020612f9d85828601612d6c565b9150509250929050565b600080600060608486031215612fc057612fbf613f51565b5b6000612fce86828701612d6c565b9350506020612fdf86828701612d6c565b9250506040612ff086828701612ef8565b9150509250925092565b6000806000806080858703121561301457613013613f51565b5b600061302287828801612d6c565b945050602061303387828801612d6c565b935050604061304487828801612ef8565b925050606085013567ffffffffffffffff81111561306557613064613f4c565b5b61307187828801612e74565b91505092959194509250565b6000806040838503121561309457613093613f51565b5b60006130a285828601612d6c565b92505060206130b385828601612e20565b9150509250929050565b600080604083850312156130d4576130d3613f51565b5b60006130e285828601612d6c565b92505060206130f385828601612ef8565b9150509250929050565b6000806040838503121561311457613113613f51565b5b600083013567ffffffffffffffff81111561313257613131613f4c565b5b61313e85828601612d96565b925050602083013567ffffffffffffffff81111561315f5761315e613f4c565b5b61316b85828601612df2565b9150509250929050565b60008060006060848603121561318e5761318d613f51565b5b600084013567ffffffffffffffff8111156131ac576131ab613f4c565b5b6131b886828701612dc4565b93505060206131c986828701612ef8565b92505060406131da86828701612ef8565b9150509250925092565b6000602082840312156131fa576131f9613f51565b5b600082013567ffffffffffffffff81111561321857613217613f4c565b5b61322484828501612df2565b91505092915050565b60008060006040848603121561324657613245613f51565b5b600061325486828701612e20565b935050602084013567ffffffffffffffff81111561327557613274613f4c565b5b61328186828701612ea2565b92509250509250925092565b6000602082840312156132a3576132a2613f51565b5b60006132b184828501612e35565b91505092915050565b6000602082840312156132d0576132cf613f51565b5b60006132de84828501612e4a565b91505092915050565b6000602082840312156132fd576132fc613f51565b5b600061330b84828501612e5f565b91505092915050565b6000806020838503121561332b5761332a613f51565b5b600083013567ffffffffffffffff81111561334957613348613f4c565b5b61335585828601612ea2565b92509250509250929050565b60006020828403121561337757613376613f51565b5b600061338584828501612ef8565b91505092915050565b600061339a838361370e565b60208301905092915050565b6133af81613c4c565b82525050565b6133c66133c182613c4c565b613dee565b82525050565b60006133d782613b25565b6133e18185613b53565b93506133ec83613b00565b8060005b8381101561341d578151613404888261338e565b975061340f83613b46565b9250506001810190506133f0565b5085935050505092915050565b61343381613c5e565b82525050565b600061344482613b30565b61344e8185613b64565b935061345e818560208601613d0f565b61346781613f56565b840191505092915050565b61347b81613cca565b82525050565b600061348c82613b3b565b6134968185613b75565b93506134a6818560208601613d0f565b6134af81613f56565b840191505092915050565b60006134c582613b3b565b6134cf8185613b86565b93506134df818560208601613d0f565b80840191505092915050565b600081546134f881613d42565b6135028186613b86565b9450600182166000811461351d576001811461352e57613561565b60ff19831686528186019350613561565b61353785613b10565b60005b838110156135595781548189015260018201915060208101905061353a565b838801955050505b50505092915050565b6000613577601083613b75565b915061358282613f74565b602082019050919050565b600061359a601d83613b75565b91506135a582613f9d565b602082019050919050565b60006135bd601383613b75565b91506135c882613fc6565b602082019050919050565b60006135e0602683613b75565b91506135eb82613fef565b604082019050919050565b6000613603601b83613b75565b915061360e8261403e565b602082019050919050565b6000613626601d83613b75565b915061363182614067565b602082019050919050565b6000613649601483613b75565b915061365482614090565b602082019050919050565b600061366c602083613b75565b9150613677826140b9565b602082019050919050565b600061368f601b83613b75565b915061369a826140e2565b602082019050919050565b60006136b2601183613b75565b91506136bd8261410b565b602082019050919050565b60006136d5601583613b75565b91506136e082614134565b602082019050919050565b60006136f8600d83613b75565b91506137038261415d565b602082019050919050565b61371781613cc0565b82525050565b61372681613cc0565b82525050565b61373d61373882613cc0565b613e12565b82525050565b600061374f82856133b5565b60148201915061375f828461372c565b6020820191508190509392505050565b600061377b82846134eb565b915081905092915050565b600061379282856134eb565b915061379e82846134ba565b91508190509392505050565b60006020820190506137bf60008301846133a6565b92915050565b60006080820190506137da60008301876133a6565b6137e760208301866133a6565b6137f4604083018561371d565b81810360608301526138068184613439565b905095945050505050565b6000602082019050818103600083015261382b81846133cc565b905092915050565b6000602082019050613848600083018461342a565b92915050565b60006020820190506138636000830184613472565b92915050565b600060208201905081810360008301526138838184613481565b905092915050565b600060208201905081810360008301526138a48161356a565b9050919050565b600060208201905081810360008301526138c48161358d565b9050919050565b600060208201905081810360008301526138e4816135b0565b9050919050565b60006020820190508181036000830152613904816135d3565b9050919050565b60006020820190508181036000830152613924816135f6565b9050919050565b6000602082019050818103600083015261394481613619565b9050919050565b600060208201905081810360008301526139648161363c565b9050919050565b600060208201905081810360008301526139848161365f565b9050919050565b600060208201905081810360008301526139a481613682565b9050919050565b600060208201905081810360008301526139c4816136a5565b9050919050565b600060208201905081810360008301526139e4816136c8565b9050919050565b60006020820190508181036000830152613a04816136eb565b9050919050565b6000602082019050613a20600083018461371d565b92915050565b6000613a30613a41565b9050613a3c8282613d74565b919050565b6000604051905090565b600067ffffffffffffffff821115613a6657613a65613f09565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613a9257613a91613f09565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613abe57613abd613f09565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613aea57613ae9613f09565b5b613af382613f56565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b9c82613cc0565b9150613ba783613cc0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613bdc57613bdb613e4d565b5b828201905092915050565b6000613bf282613cc0565b9150613bfd83613cc0565b925082613c0d57613c0c613e7c565b5b828204905092915050565b6000613c2382613cc0565b9150613c2e83613cc0565b925082821015613c4157613c40613e4d565b5b828203905092915050565b6000613c5782613ca0565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613cd582613cdc565b9050919050565b6000613ce782613cee565b9050919050565b6000613cf982613ca0565b9050919050565b82818337600083830152505050565b60005b83811015613d2d578082015181840152602081019050613d12565b83811115613d3c576000848401525b50505050565b60006002820490506001821680613d5a57607f821691505b60208210811415613d6e57613d6d613eab565b5b50919050565b613d7d82613f56565b810181811067ffffffffffffffff82111715613d9c57613d9b613f09565b5b80604052505050565b6000613db082613cc0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613de357613de2613e4d565b5b600182019050919050565b6000613df982613e00565b9050919050565b6000613e0b82613f67565b9050919050565b6000819050919050565b6000613e2782613cc0565b9150613e3283613cc0565b925082613e4257613e41613e7c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f57524f4e475f504152414d455445525300000000000000000000000000000000600082015250565b7f434f4e5452414354535f4e4f545f414c4c4f5745445f544f5f4d494e54000000600082015250565b7f4d5553545f4f574e5f414c4c5f544f4b454e5300000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f465245455f4d494e545f49535f4e4f545f5945545f4143544956450000000000600082015250565b7f43414e4e4f545f4d494e545f4f4e5f5448455f53414d455f424c4f434b000000600082015250565b7f43414e545f494e4352454153455f535550504c59000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4558434545445f414c4c4f43415445445f4d494e545f4c494d49540000000000600082015250565b7f4e4f545f454e4f5547485f535550504c59000000000000000000000000000000600082015250565b7f544f4b454e5f414c52454144595f434c41494d45440000000000000000000000600082015250565b7f50524f4f465f494e56414c494400000000000000000000000000000000000000600082015250565b61418f81613c4c565b811461419a57600080fd5b50565b6141a681613c5e565b81146141b157600080fd5b50565b6141bd81613c6a565b81146141c857600080fd5b50565b6141d481613c74565b81146141df57600080fd5b50565b6141eb81613cc0565b81146141f657600080fd5b5056fea2646970667358221220813a8872370d08a1e0e4b1d65598230c1a72a2267f2e82e1b137cc1eb423e2ec64736f6c63430008070033

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

000000000000000000000000b5f8ca23320ad5bd6d5263bfa008b4dbeab4f0d2

-----Decoded View---------------
Arg [0] : MetakagesAddress (address): 0xb5F8Ca23320AD5bd6d5263bfA008B4dbEAb4f0d2

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000b5f8ca23320ad5bd6d5263bfa008b4dbeab4f0d2


Deployed Bytecode Sourcemap

53473:4271:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13088:615;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18111:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20179:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19639:474;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12142:315;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21065:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56025:556;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53554:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55364:653;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56856:100;;;:::i;:::-;;21306:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56606:92;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53595:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17900:144;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53966:27;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13767:234;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57310:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52484:103;;;:::i;:::-;;51833:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18280:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57432:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56706:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20455:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57612:129;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53804:56;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21562:396;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56964:338;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53518:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54000:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53920:39;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20834:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52742:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54778:578;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13088:615;13173:4;13488:10;13473:25;;:11;:25;;;;:102;;;;13565:10;13550:25;;:11;:25;;;;13473:102;:179;;;;13642:10;13627:25;;:11;:25;;;;13473:179;13453:199;;13088:615;;;:::o;18111:100::-;18165:13;18198:5;18191:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18111:100;:::o;20179:204::-;20247:7;20272:16;20280:7;20272;:16::i;:::-;20267:64;;20297:34;;;;;;;;;;;;;;20267:64;20351:15;:24;20367:7;20351:24;;;;;;;;;;;;;;;;;;;;;20344:31;;20179:204;;;:::o;19639:474::-;19712:13;19744:27;19763:7;19744:18;:27::i;:::-;19712:61;;19794:5;19788:11;;:2;:11;;;19784:48;;;19808:24;;;;;;;;;;;;;;19784:48;19872:5;19849:28;;:19;:17;:19::i;:::-;:28;;;19845:175;;19897:44;19914:5;19921:19;:17;:19::i;:::-;19897:16;:44::i;:::-;19892:128;;19969:35;;;;;;;;;;;;;;19892:128;19845:175;20059:2;20032:15;:24;20048:7;20032:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;20097:7;20093:2;20077:28;;20086:5;20077:28;;;;;;;;;;;;19701:412;19639:474;;:::o;12142:315::-;12195:7;12423:15;:13;:15::i;:::-;12408:12;;12392:13;;:28;:46;12385:53;;12142:315;:::o;21065:170::-;21199:28;21209:4;21215:2;21219:7;21199:9;:28::i;:::-;21065:170;;;:::o;56025:556::-;52064:12;:10;:12::i;:::-;52053:23;;:7;:5;:7::i;:::-;:23;;;52045:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56182:10:::1;:17;56161:10;:17;:38;56153:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;56231:19;56270:9:::0;56265:103:::1;56289:10;:17;56285:1;:21;56265:103;;;56343:10;56354:1;56343:13;;;;;;;;:::i;:::-;;;;;;;;56328:28;;;;;:::i;:::-;;;56308:3;;;;;:::i;:::-;;;;56265:103;;;;56417:10;;56400:13;:11;:13::i;:::-;56386:11;:27;;;;:::i;:::-;:41;;56378:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;56465:9;56460:114;56484:10;:17;56480:1;:21;56460:114;;;56523:39;56533:10;56544:1;56533:13;;;;;;;;:::i;:::-;;;;;;;;56548:10;56559:1;56548:13;;;;;;;;:::i;:::-;;;;;;;;56523:9;:39::i;:::-;56503:3;;;;;:::i;:::-;;;;56460:114;;;;56142:439;56025:556:::0;;:::o;53554:32::-;;;;:::o;55364:653::-;55500:1;54290:15;54257:18;:30;54276:10;54257:30;;;;;;;;;;;;;;;;:48;54235:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;54394:10;54381:23;;:9;:23;;;54373:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;54465:1;54453:8;:13;;;54449:101;;;54491:15;;;;;;;;;;;54483:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;54449:101;55519:14:::1;54695:10;;54678:13;:11;:13::i;:::-;54661:14;:30;;;;:::i;:::-;:44;;54639:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;55546:12:::2;55588:10;55600:7;55571:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55561:48;;;;;;55546:63;;55628:45;55647:5;55654:12;;55668:4;55628:18;:45::i;:::-;55620:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;55780:7;55762:14;55724:12;:24;55737:10;55724:24;;;;;;;;;;;;;;;:35;;;:52;;;;:::i;:::-;:63;;55702:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;55886:15;55853:18;:30;55872:10;55853:30;;;;;;;;;;;;;;;:48;;;;55951:14;55912:12;:24;55925:10;55912:24;;;;;;;;;;;;;;;:35;;;:53;;;;;;;:::i;:::-;;;;;;;;55976:33;55982:10;55994:14;55976:5;:33::i;:::-;55535:482;54562:1:::1;55364:653:::0;;;;:::o;56856:100::-;52064:12;:10;:12::i;:::-;52053:23;;:7;:5;:7::i;:::-;:23;;;52045:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56933:15:::1;;;;;;;;;;;56932:16;56914:15;;:34;;;;;;;;;;;;;;;;;;56856:100::o:0;21306:185::-;21444:39;21461:4;21467:2;21471:7;21444:39;;;;;;;;;;;;:16;:39::i;:::-;21306:185;;;:::o;56606:92::-;52064:12;:10;:12::i;:::-;52053:23;;:7;:5;:7::i;:::-;:23;;;52045:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56687:3:::1;;56677:7;:13;;;;;;;:::i;:::-;;56606:92:::0;;:::o;53595:35::-;;;;;;;;;;;;;:::o;17900:144::-;17964:7;18007:27;18026:7;18007:18;:27::i;:::-;17984:52;;17900:144;;;:::o;53966:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13767:234::-;13831:7;13883:1;13855:24;13873:5;13855:17;:24::i;:::-;:29;13851:70;;;13893:28;;;;;;;;;;;;;;13851:70;9106:13;13939:18;:25;13958:5;13939:25;;;;;;;;;;;;;;;;:54;13932:61;;13767:234;;;:::o;57310:114::-;52064:12;:10;:12::i;:::-;52053:23;;:7;:5;:7::i;:::-;:23;;;52045:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57403:13:::1;57388:12;:28;;;;57310:114:::0;:::o;52484:103::-;52064:12;:10;:12::i;:::-;52053:23;;:7;:5;:7::i;:::-;:23;;;52045:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52549:30:::1;52576:1;52549:18;:30::i;:::-;52484:103::o:0;51833:87::-;51879:7;51906:6;;;;;;;;;;;51899:13;;51833:87;:::o;18280:104::-;18336:13;18369:7;18362:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18280:104;:::o;57432:172::-;52064:12;:10;:12::i;:::-;52053:23;;:7;:5;:7::i;:::-;:23;;;52045:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57527:10:::1;;57514;:23;57506:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;57586:10;57573;:23;;;;57432:172:::0;:::o;56706:142::-;52064:12;:10;:12::i;:::-;52053:23;;:7;:5;:7::i;:::-;:23;;;52045:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56803:8:::1;56791:9;;:20;;;;;;;;;;;;;;;;;;56832:8;;56822:7;:18;;;;;;;:::i;:::-;;56706:142:::0;;;:::o;20455:308::-;20566:19;:17;:19::i;:::-;20554:31;;:8;:31;;;20550:61;;;20594:17;;;;;;;;;;;;;;20550:61;20676:8;20624:18;:39;20643:19;:17;:19::i;:::-;20624:39;;;;;;;;;;;;;;;:49;20664:8;20624:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;20736:8;20700:55;;20715:19;:17;:19::i;:::-;20700:55;;;20746:8;20700:55;;;;;;:::i;:::-;;;;;;;;20455:308;;:::o;57612:129::-;57682:16;57723:10;57716:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57612:129;:::o;53804:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;21562:396::-;21729:28;21739:4;21745:2;21749:7;21729:9;:28::i;:::-;21790:1;21772:2;:14;;;:19;21768:183;;21811:56;21842:4;21848:2;21852:7;21861:5;21811:30;:56::i;:::-;21806:145;;21895:40;;;;;;;;;;;;;;21806:145;21768:183;21562:396;;;;:::o;56964:338::-;57082:13;57117:9;;;;;;;;;;;57113:182;;;57174:7;57183:25;57200:7;57183:16;:25::i;:::-;57157:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57143:67;;;;57113:182;57274:7;57257:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;57243:40;;56964:338;;;;:::o;53518:27::-;;;;;;;;;;;;;:::o;54000:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;53920:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;20834:164::-;20931:4;20955:18;:25;20974:5;20955:25;;;;;;;;;;;;;;;:35;20981:8;20955:35;;;;;;;;;;;;;;;;;;;;;;;;;20948:42;;20834:164;;;;:::o;52742:201::-;52064:12;:10;:12::i;:::-;52053:23;;:7;:5;:7::i;:::-;:23;;;52045:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52851:1:::1;52831:22;;:8;:22;;;;52823:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52907:28;52926:8;52907:18;:28::i;:::-;52742:201:::0;:::o;54778:578::-;54856:1;54290:15;54257:18;:30;54276:10;54257:30;;;;;;;;;;;;;;;;:48;54235:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;54394:10;54381:23;;:9;:23;;;54373:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;54465:1;54453:8;:13;;;54449:101;;;54491:15;;;;;;;;;;;54483:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;54449:101;54884:8:::1;:15;54695:10;;54678:13;:11;:13::i;:::-;54661:14;:30;;;;:::i;:::-;:44;;54639:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;54921:10:::2;54917:318;54942:8;:15;54937:2;:20;54917:318;;;55023:10;54988:45;;:9;;;;;;;;;;;:17;;;55006:8;55015:2;55006:12;;;;;;;;:::i;:::-;;;;;;;;54988:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45;;;54980:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;55105:5;55080:30;;:7;:21;55088:8;55097:2;55088:12;;;;;;;;:::i;:::-;;;;;;;;55080:21;;;;;;;;;;;;;;;;;;;;;:30;;;55072:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;55175:4;55151:7;:21;55159:8;55168:2;55159:12;;;;;;;;:::i;:::-;;;;;;;;55151:21;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;55194:10;55210:8;55219:2;55210:12;;;;;;;;:::i;:::-;;;;;;;;55194:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54959:4;;;;;:::i;:::-;;;;54917:318;;;;55278:15;55245:18;:30;55264:10;55245:30;;;;;;;;;;;;;;;:48;;;;55314:34;55320:10;55332:8;:15;55314:5;:34::i;:::-;54562:1:::1;54778:578:::0;;:::o;22213:273::-;22270:4;22326:7;22307:15;:13;:15::i;:::-;:26;;:66;;;;;22360:13;;22350:7;:23;22307:66;:152;;;;;22458:1;9876:8;22411:17;:26;22429:7;22411:26;;;;;;;;;;;;:43;:48;22307:152;22287:172;;22213:273;;;:::o;15415:1129::-;15482:7;15502:12;15517:7;15502:22;;15585:4;15566:15;:13;:15::i;:::-;:23;15562:915;;15619:13;;15612:4;:20;15608:869;;;15657:14;15674:17;:23;15692:4;15674:23;;;;;;;;;;;;15657:40;;15790:1;9876:8;15763:6;:23;:28;15759:699;;;16282:113;16299:1;16289:6;:11;16282:113;;;16342:17;:25;16360:6;;;;;;;16342:25;;;;;;;;;;;;16333:34;;16282:113;;;16428:6;16421:13;;;;;;15759:699;15634:843;15608:869;15562:915;16505:31;;;;;;;;;;;;;;15415:1129;;;;:::o;36481:105::-;36541:7;36568:10;36561:17;;36481:105;:::o;11665:92::-;11721:7;11665:92;:::o;27472:2654::-;27587:27;27617;27636:7;27617:18;:27::i;:::-;27587:57;;27702:4;27661:45;;27677:19;27661:45;;;27657:86;;27715:28;;;;;;;;;;;;;;27657:86;27756:23;27782:15;:24;27798:7;27782:24;;;;;;;;;;;;;;;;;;;;;27756:50;;27819:22;27868:4;27845:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;27889:43;27906:4;27912:19;:17;:19::i;:::-;27889:16;:43::i;:::-;27845:87;:142;;;;27968:19;:17;:19::i;:::-;27949:38;;:15;:38;;;27845:142;27819:169;;28006:17;28001:66;;28032:35;;;;;;;;;;;;;;28001:66;28107:1;28082:21;28100:2;28082:17;:21::i;:::-;:26;28078:62;;;28117:23;;;;;;;;;;;;;;28078:62;28153:43;28175:4;28181:2;28185:7;28194:1;28153:21;:43::i;:::-;28304:1;28266:34;28284:15;28266:17;:34::i;:::-;:39;28262:103;;28329:15;:24;28345:7;28329:24;;;;;;;;;;;;28322:31;;;;;;;;;;;28262:103;28732:18;:24;28751:4;28732:24;;;;;;;;;;;;;;;;28730:26;;;;;;;;;;;;28801:18;:22;28820:2;28801:22;;;;;;;;;;;;;;;;28799:24;;;;;;;;;;;10158:8;9760:3;29182:15;:41;;29140:21;29158:2;29140:17;:21::i;:::-;:84;:128;29094:17;:26;29112:7;29094:26;;;;;;;;;;;:174;;;;29438:1;10158:8;29388:19;:46;:51;29384:626;;;29460:19;29492:1;29482:7;:11;29460:33;;29649:1;29615:17;:30;29633:11;29615:30;;;;;;;;;;;;:35;29611:384;;;29753:13;;29738:11;:28;29734:242;;29933:19;29900:17;:30;29918:11;29900:30;;;;;;;;;;;:52;;;;29734:242;29611:384;29441:569;29384:626;30057:7;30053:2;30038:27;;30047:4;30038:27;;;;;;;;;;;;30076:42;30097:4;30103:2;30107:7;30116:1;30076:20;:42::i;:::-;27576:2550;;;27472:2654;;;:::o;50557:98::-;50610:7;50637:10;50630:17;;50557:98;:::o;22570:104::-;22639:27;22649:2;22653:8;22639:27;;;;;;;;;;;;:9;:27::i;:::-;22570:104;;:::o;39875:190::-;40000:4;40053;40024:25;40037:5;40044:4;40024:12;:25::i;:::-;:33;40017:40;;39875:190;;;;;:::o;25552:1666::-;25617:20;25640:13;;25617:36;;25693:1;25668:21;25686:2;25668:17;:21::i;:::-;:26;25664:58;;;25703:19;;;;;;;;;;;;;;25664:58;25749:1;25737:8;:13;25733:44;;;25759:18;;;;;;;;;;;;;;25733:44;25790:61;25820:1;25824:2;25828:12;25842:8;25790:21;:61::i;:::-;26394:1;9243:2;26365:1;:25;;26364:31;26352:8;:44;26326:18;:22;26345:2;26326:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;10023:3;26795:29;26822:1;26810:8;:13;26795:14;:29::i;:::-;:56;;9760:3;26732:15;:41;;26690:21;26708:2;26690:17;:21::i;:::-;:84;:162;26639:17;:31;26657:12;26639:31;;;;;;;;;;;:213;;;;26869:20;26892:12;26869:35;;26919:11;26948:8;26933:12;:23;26919:37;;26973:111;27025:14;;;;;;27021:2;27000:40;;27017:1;27000:40;;;;;;;;;;;;27079:3;27064:12;:18;26973:111;;27116:12;27100:13;:28;;;;26103:1037;;27150:60;27179:1;27183:2;27187:12;27201:8;27150:20;:60::i;:::-;25606:1612;25552:1666;;:::o;19200:148::-;19264:14;19325:5;19315:15;;19200:148;;;:::o;53103:191::-;53177:16;53196:6;;;;;;;;;;;53177:25;;53222:8;53213:6;;:17;;;;;;;;;;;;;;;;;;53277:8;53246:40;;53267:8;53246:40;;;;;;;;;;;;53166:128;53103:191;:::o;33950:716::-;34113:4;34159:2;34134:45;;;34180:19;:17;:19::i;:::-;34201:4;34207:7;34216:5;34134:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34130:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34434:1;34417:6;:13;:18;34413:235;;;34463:40;;;;;;;;;;;;;;34413:235;34606:6;34600:13;34591:6;34587:2;34583:15;34576:38;34130:529;34303:54;;;34293:64;;;:6;:64;;;;34286:71;;;33950:716;;;;;;:::o;47811:723::-;47867:13;48097:1;48088:5;:10;48084:53;;;48115:10;;;;;;;;;;;;;;;;;;;;;48084:53;48147:12;48162:5;48147:20;;48178:14;48203:78;48218:1;48210:4;:9;48203:78;;48236:8;;;;;:::i;:::-;;;;48267:2;48259:10;;;;;:::i;:::-;;;48203:78;;;48291:19;48323:6;48313:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48291:39;;48341:154;48357:1;48348:5;:10;48341:154;;48385:1;48375:11;;;;;:::i;:::-;;;48452:2;48444:5;:10;;;;:::i;:::-;48431:2;:24;;;;:::i;:::-;48418:39;;48401:6;48408;48401:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;48481:2;48472:11;;;;;:::i;:::-;;;48341:154;;;48519:6;48505:21;;;;;47811:723;;;;:::o;35314:159::-;;;;;:::o;36132:158::-;;;;;:::o;23047:2246::-;23170:20;23193:13;;23170:36;;23246:1;23221:21;23239:2;23221:17;:21::i;:::-;:26;23217:58;;;23256:19;;;;;;;;;;;;;;23217:58;23302:1;23290:8;:13;23286:44;;;23312:18;;;;;;;;;;;;;;23286:44;23343:61;23373:1;23377:2;23381:12;23395:8;23343:21;:61::i;:::-;23947:1;9243:2;23918:1;:25;;23917:31;23905:8;:44;23879:18;:22;23898:2;23879:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;10023:3;24348:29;24375:1;24363:8;:13;24348:14;:29::i;:::-;:56;;9760:3;24285:15;:41;;24243:21;24261:2;24243:17;:21::i;:::-;:84;:162;24192:17;:31;24210:12;24192:31;;;;;;;;;;;:213;;;;24422:20;24445:12;24422:35;;24472:11;24501:8;24486:12;:23;24472:37;;24548:1;24530:2;:14;;;:19;24526:635;;24570:313;24626:12;24622:2;24601:38;;24618:1;24601:38;;;;;;;;;;;;24667:69;24706:1;24710:2;24714:14;;;;;;24730:5;24667:30;:69::i;:::-;24662:174;;24772:40;;;;;;;;;;;;;;24662:174;24878:3;24863:12;:18;24570:313;;24964:12;24947:13;;:29;24943:43;;24978:8;;;24943:43;24526:635;;;25027:119;25083:14;;;;;;25079:2;25058:40;;25075:1;25058:40;;;;;;;;;;;;25141:3;25126:12;:18;25027:119;;24526:635;25191:12;25175:13;:28;;;;23656:1559;;25225:60;25254:1;25258:2;25262:12;25276:8;25225:20;:60::i;:::-;23159:2134;23047:2246;;;:::o;40742:296::-;40825:7;40845:20;40868:4;40845:27;;40888:9;40883:118;40907:5;:12;40903:1;:16;40883:118;;;40956:33;40966:12;40980:5;40986:1;40980:8;;;;;;;;:::i;:::-;;;;;;;;40956:9;:33::i;:::-;40941:48;;40921:3;;;;;:::i;:::-;;;;40883:118;;;;41018:12;41011:19;;;40742:296;;;;:::o;19435:142::-;19493:14;19554:5;19544:15;;19435:142;;;:::o;46949:149::-;47012:7;47043:1;47039;:5;:51;;47070:20;47085:1;47088;47070:14;:20::i;:::-;47039:51;;;47047:20;47062:1;47065;47047:14;:20::i;:::-;47039:51;47032:58;;46949:149;;;;:::o;47106:268::-;47174:13;47281:1;47275:4;47268:15;47310:1;47304:4;47297:15;47351:4;47345;47335:21;47326:30;;47106:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1514:::-;1610:5;1635:81;1651:64;1708:6;1651:64;:::i;:::-;1635:81;:::i;:::-;1626:90;;1736:5;1765:6;1758:5;1751:21;1799:4;1792:5;1788:16;1781:23;;1825:6;1875:3;1867:4;1859:6;1855:17;1850:3;1846:27;1843:36;1840:143;;;1894:79;;:::i;:::-;1840:143;2007:1;1992:238;2017:6;2014:1;2011:13;1992:238;;;2085:3;2114:37;2147:3;2135:10;2114:37;:::i;:::-;2109:3;2102:50;2181:4;2176:3;2172:14;2165:21;;2215:4;2210:3;2206:14;2199:21;;2052:178;2039:1;2036;2032:9;2027:14;;1992:238;;;1996:14;1616:620;;1514:722;;;;;:::o;2242:410::-;2319:5;2344:65;2360:48;2401:6;2360:48;:::i;:::-;2344:65;:::i;:::-;2335:74;;2432:6;2425:5;2418:21;2470:4;2463:5;2459:16;2508:3;2499:6;2494:3;2490:16;2487:25;2484:112;;;2515:79;;:::i;:::-;2484:112;2605:41;2639:6;2634:3;2629;2605:41;:::i;:::-;2325:327;2242:410;;;;;:::o;2658:139::-;2704:5;2742:6;2729:20;2720:29;;2758:33;2785:5;2758:33;:::i;:::-;2658:139;;;;:::o;2803:143::-;2860:5;2891:6;2885:13;2876:22;;2907:33;2934:5;2907:33;:::i;:::-;2803:143;;;;:::o;2969:370::-;3040:5;3089:3;3082:4;3074:6;3070:17;3066:27;3056:122;;3097:79;;:::i;:::-;3056:122;3214:6;3201:20;3239:94;3329:3;3321:6;3314:4;3306:6;3302:17;3239:94;:::i;:::-;3230:103;;3046:293;2969:370;;;;:::o;3362:::-;3433:5;3482:3;3475:4;3467:6;3463:17;3459:27;3449:122;;3490:79;;:::i;:::-;3449:122;3607:6;3594:20;3632:94;3722:3;3714:6;3707:4;3699:6;3695:17;3632:94;:::i;:::-;3623:103;;3439:293;3362:370;;;;:::o;3755:::-;3826:5;3875:3;3868:4;3860:6;3856:17;3852:27;3842:122;;3883:79;;:::i;:::-;3842:122;4000:6;3987:20;4025:94;4115:3;4107:6;4100:4;4092:6;4088:17;4025:94;:::i;:::-;4016:103;;3832:293;3755:370;;;;:::o;4131:133::-;4174:5;4212:6;4199:20;4190:29;;4228:30;4252:5;4228:30;:::i;:::-;4131:133;;;;:::o;4270:139::-;4316:5;4354:6;4341:20;4332:29;;4370:33;4397:5;4370:33;:::i;:::-;4270:139;;;;:::o;4415:137::-;4460:5;4498:6;4485:20;4476:29;;4514:32;4540:5;4514:32;:::i;:::-;4415:137;;;;:::o;4558:141::-;4614:5;4645:6;4639:13;4630:22;;4661:32;4687:5;4661:32;:::i;:::-;4558:141;;;;:::o;4718:338::-;4773:5;4822:3;4815:4;4807:6;4803:17;4799:27;4789:122;;4830:79;;:::i;:::-;4789:122;4947:6;4934:20;4972:78;5046:3;5038:6;5031:4;5023:6;5019:17;4972:78;:::i;:::-;4963:87;;4779:277;4718:338;;;;:::o;5076:553::-;5134:8;5144:6;5194:3;5187:4;5179:6;5175:17;5171:27;5161:122;;5202:79;;:::i;:::-;5161:122;5315:6;5302:20;5292:30;;5345:18;5337:6;5334:30;5331:117;;;5367:79;;:::i;:::-;5331:117;5481:4;5473:6;5469:17;5457:29;;5535:3;5527:4;5519:6;5515:17;5505:8;5501:32;5498:41;5495:128;;;5542:79;;:::i;:::-;5495:128;5076:553;;;;;:::o;5635:139::-;5681:5;5719:6;5706:20;5697:29;;5735:33;5762:5;5735:33;:::i;:::-;5635:139;;;;:::o;5780:329::-;5839:6;5888:2;5876:9;5867:7;5863:23;5859:32;5856:119;;;5894:79;;:::i;:::-;5856:119;6014:1;6039:53;6084:7;6075:6;6064:9;6060:22;6039:53;:::i;:::-;6029:63;;5985:117;5780:329;;;;:::o;6115:351::-;6185:6;6234:2;6222:9;6213:7;6209:23;6205:32;6202:119;;;6240:79;;:::i;:::-;6202:119;6360:1;6385:64;6441:7;6432:6;6421:9;6417:22;6385:64;:::i;:::-;6375:74;;6331:128;6115:351;;;;:::o;6472:474::-;6540:6;6548;6597:2;6585:9;6576:7;6572:23;6568:32;6565:119;;;6603:79;;:::i;:::-;6565:119;6723:1;6748:53;6793:7;6784:6;6773:9;6769:22;6748:53;:::i;:::-;6738:63;;6694:117;6850:2;6876:53;6921:7;6912:6;6901:9;6897:22;6876:53;:::i;:::-;6866:63;;6821:118;6472:474;;;;;:::o;6952:619::-;7029:6;7037;7045;7094:2;7082:9;7073:7;7069:23;7065:32;7062:119;;;7100:79;;:::i;:::-;7062:119;7220:1;7245:53;7290:7;7281:6;7270:9;7266:22;7245:53;:::i;:::-;7235:63;;7191:117;7347:2;7373:53;7418:7;7409:6;7398:9;7394:22;7373:53;:::i;:::-;7363:63;;7318:118;7475:2;7501:53;7546:7;7537:6;7526:9;7522:22;7501:53;:::i;:::-;7491:63;;7446:118;6952:619;;;;;:::o;7577:943::-;7672:6;7680;7688;7696;7745:3;7733:9;7724:7;7720:23;7716:33;7713:120;;;7752:79;;:::i;:::-;7713:120;7872:1;7897:53;7942:7;7933:6;7922:9;7918:22;7897:53;:::i;:::-;7887:63;;7843:117;7999:2;8025:53;8070:7;8061:6;8050:9;8046:22;8025:53;:::i;:::-;8015:63;;7970:118;8127:2;8153:53;8198:7;8189:6;8178:9;8174:22;8153:53;:::i;:::-;8143:63;;8098:118;8283:2;8272:9;8268:18;8255:32;8314:18;8306:6;8303:30;8300:117;;;8336:79;;:::i;:::-;8300:117;8441:62;8495:7;8486:6;8475:9;8471:22;8441:62;:::i;:::-;8431:72;;8226:287;7577:943;;;;;;;:::o;8526:468::-;8591:6;8599;8648:2;8636:9;8627:7;8623:23;8619:32;8616:119;;;8654:79;;:::i;:::-;8616:119;8774:1;8799:53;8844:7;8835:6;8824:9;8820:22;8799:53;:::i;:::-;8789:63;;8745:117;8901:2;8927:50;8969:7;8960:6;8949:9;8945:22;8927:50;:::i;:::-;8917:60;;8872:115;8526:468;;;;;:::o;9000:474::-;9068:6;9076;9125:2;9113:9;9104:7;9100:23;9096:32;9093:119;;;9131:79;;:::i;:::-;9093:119;9251:1;9276:53;9321:7;9312:6;9301:9;9297:22;9276:53;:::i;:::-;9266:63;;9222:117;9378:2;9404:53;9449:7;9440:6;9429:9;9425:22;9404:53;:::i;:::-;9394:63;;9349:118;9000:474;;;;;:::o;9480:894::-;9598:6;9606;9655:2;9643:9;9634:7;9630:23;9626:32;9623:119;;;9661:79;;:::i;:::-;9623:119;9809:1;9798:9;9794:17;9781:31;9839:18;9831:6;9828:30;9825:117;;;9861:79;;:::i;:::-;9825:117;9966:78;10036:7;10027:6;10016:9;10012:22;9966:78;:::i;:::-;9956:88;;9752:302;10121:2;10110:9;10106:18;10093:32;10152:18;10144:6;10141:30;10138:117;;;10174:79;;:::i;:::-;10138:117;10279:78;10349:7;10340:6;10329:9;10325:22;10279:78;:::i;:::-;10269:88;;10064:303;9480:894;;;;;:::o;10380:829::-;10482:6;10490;10498;10547:2;10535:9;10526:7;10522:23;10518:32;10515:119;;;10553:79;;:::i;:::-;10515:119;10701:1;10690:9;10686:17;10673:31;10731:18;10723:6;10720:30;10717:117;;;10753:79;;:::i;:::-;10717:117;10858:78;10928:7;10919:6;10908:9;10904:22;10858:78;:::i;:::-;10848:88;;10644:302;10985:2;11011:53;11056:7;11047:6;11036:9;11032:22;11011:53;:::i;:::-;11001:63;;10956:118;11113:2;11139:53;11184:7;11175:6;11164:9;11160:22;11139:53;:::i;:::-;11129:63;;11084:118;10380:829;;;;;:::o;11215:539::-;11299:6;11348:2;11336:9;11327:7;11323:23;11319:32;11316:119;;;11354:79;;:::i;:::-;11316:119;11502:1;11491:9;11487:17;11474:31;11532:18;11524:6;11521:30;11518:117;;;11554:79;;:::i;:::-;11518:117;11659:78;11729:7;11720:6;11709:9;11705:22;11659:78;:::i;:::-;11649:88;;11445:302;11215:539;;;;:::o;11760:668::-;11837:6;11845;11853;11902:2;11890:9;11881:7;11877:23;11873:32;11870:119;;;11908:79;;:::i;:::-;11870:119;12028:1;12053:50;12095:7;12086:6;12075:9;12071:22;12053:50;:::i;:::-;12043:60;;11999:114;12180:2;12169:9;12165:18;12152:32;12211:18;12203:6;12200:30;12197:117;;;12233:79;;:::i;:::-;12197:117;12346:65;12403:7;12394:6;12383:9;12379:22;12346:65;:::i;:::-;12328:83;;;;12123:298;11760:668;;;;;:::o;12434:329::-;12493:6;12542:2;12530:9;12521:7;12517:23;12513:32;12510:119;;;12548:79;;:::i;:::-;12510:119;12668:1;12693:53;12738:7;12729:6;12718:9;12714:22;12693:53;:::i;:::-;12683:63;;12639:117;12434:329;;;;:::o;12769:327::-;12827:6;12876:2;12864:9;12855:7;12851:23;12847:32;12844:119;;;12882:79;;:::i;:::-;12844:119;13002:1;13027:52;13071:7;13062:6;13051:9;13047:22;13027:52;:::i;:::-;13017:62;;12973:116;12769:327;;;;:::o;13102:349::-;13171:6;13220:2;13208:9;13199:7;13195:23;13191:32;13188:119;;;13226:79;;:::i;:::-;13188:119;13346:1;13371:63;13426:7;13417:6;13406:9;13402:22;13371:63;:::i;:::-;13361:73;;13317:127;13102:349;;;;:::o;13457:529::-;13528:6;13536;13585:2;13573:9;13564:7;13560:23;13556:32;13553:119;;;13591:79;;:::i;:::-;13553:119;13739:1;13728:9;13724:17;13711:31;13769:18;13761:6;13758:30;13755:117;;;13791:79;;:::i;:::-;13755:117;13904:65;13961:7;13952:6;13941:9;13937:22;13904:65;:::i;:::-;13886:83;;;;13682:297;13457:529;;;;;:::o;13992:329::-;14051:6;14100:2;14088:9;14079:7;14075:23;14071:32;14068:119;;;14106:79;;:::i;:::-;14068:119;14226:1;14251:53;14296:7;14287:6;14276:9;14272:22;14251:53;:::i;:::-;14241:63;;14197:117;13992:329;;;;:::o;14327:179::-;14396:10;14417:46;14459:3;14451:6;14417:46;:::i;:::-;14495:4;14490:3;14486:14;14472:28;;14327:179;;;;:::o;14512:118::-;14599:24;14617:5;14599:24;:::i;:::-;14594:3;14587:37;14512:118;;:::o;14636:157::-;14741:45;14761:24;14779:5;14761:24;:::i;:::-;14741:45;:::i;:::-;14736:3;14729:58;14636:157;;:::o;14829:732::-;14948:3;14977:54;15025:5;14977:54;:::i;:::-;15047:86;15126:6;15121:3;15047:86;:::i;:::-;15040:93;;15157:56;15207:5;15157:56;:::i;:::-;15236:7;15267:1;15252:284;15277:6;15274:1;15271:13;15252:284;;;15353:6;15347:13;15380:63;15439:3;15424:13;15380:63;:::i;:::-;15373:70;;15466:60;15519:6;15466:60;:::i;:::-;15456:70;;15312:224;15299:1;15296;15292:9;15287:14;;15252:284;;;15256:14;15552:3;15545:10;;14953:608;;;14829:732;;;;:::o;15567:109::-;15648:21;15663:5;15648:21;:::i;:::-;15643:3;15636:34;15567:109;;:::o;15682:360::-;15768:3;15796:38;15828:5;15796:38;:::i;:::-;15850:70;15913:6;15908:3;15850:70;:::i;:::-;15843:77;;15929:52;15974:6;15969:3;15962:4;15955:5;15951:16;15929:52;:::i;:::-;16006:29;16028:6;16006:29;:::i;:::-;16001:3;15997:39;15990:46;;15772:270;15682:360;;;;:::o;16048:169::-;16154:56;16204:5;16154:56;:::i;:::-;16149:3;16142:69;16048:169;;:::o;16223:364::-;16311:3;16339:39;16372:5;16339:39;:::i;:::-;16394:71;16458:6;16453:3;16394:71;:::i;:::-;16387:78;;16474:52;16519:6;16514:3;16507:4;16500:5;16496:16;16474:52;:::i;:::-;16551:29;16573:6;16551:29;:::i;:::-;16546:3;16542:39;16535:46;;16315:272;16223:364;;;;:::o;16593:377::-;16699:3;16727:39;16760:5;16727:39;:::i;:::-;16782:89;16864:6;16859:3;16782:89;:::i;:::-;16775:96;;16880:52;16925:6;16920:3;16913:4;16906:5;16902:16;16880:52;:::i;:::-;16957:6;16952:3;16948:16;16941:23;;16703:267;16593:377;;;;:::o;17000:845::-;17103:3;17140:5;17134:12;17169:36;17195:9;17169:36;:::i;:::-;17221:89;17303:6;17298:3;17221:89;:::i;:::-;17214:96;;17341:1;17330:9;17326:17;17357:1;17352:137;;;;17503:1;17498:341;;;;17319:520;;17352:137;17436:4;17432:9;17421;17417:25;17412:3;17405:38;17472:6;17467:3;17463:16;17456:23;;17352:137;;17498:341;17565:38;17597:5;17565:38;:::i;:::-;17625:1;17639:154;17653:6;17650:1;17647:13;17639:154;;;17727:7;17721:14;17717:1;17712:3;17708:11;17701:35;17777:1;17768:7;17764:15;17753:26;;17675:4;17672:1;17668:12;17663:17;;17639:154;;;17822:6;17817:3;17813:16;17806:23;;17505:334;;17319:520;;17107:738;;17000:845;;;;:::o;17851:366::-;17993:3;18014:67;18078:2;18073:3;18014:67;:::i;:::-;18007:74;;18090:93;18179:3;18090:93;:::i;:::-;18208:2;18203:3;18199:12;18192:19;;17851:366;;;:::o;18223:::-;18365:3;18386:67;18450:2;18445:3;18386:67;:::i;:::-;18379:74;;18462:93;18551:3;18462:93;:::i;:::-;18580:2;18575:3;18571:12;18564:19;;18223:366;;;:::o;18595:::-;18737:3;18758:67;18822:2;18817:3;18758:67;:::i;:::-;18751:74;;18834:93;18923:3;18834:93;:::i;:::-;18952:2;18947:3;18943:12;18936:19;;18595:366;;;:::o;18967:::-;19109:3;19130:67;19194:2;19189:3;19130:67;:::i;:::-;19123:74;;19206:93;19295:3;19206:93;:::i;:::-;19324:2;19319:3;19315:12;19308:19;;18967:366;;;:::o;19339:::-;19481:3;19502:67;19566:2;19561:3;19502:67;:::i;:::-;19495:74;;19578:93;19667:3;19578:93;:::i;:::-;19696:2;19691:3;19687:12;19680:19;;19339:366;;;:::o;19711:::-;19853:3;19874:67;19938:2;19933:3;19874:67;:::i;:::-;19867:74;;19950:93;20039:3;19950:93;:::i;:::-;20068:2;20063:3;20059:12;20052:19;;19711:366;;;:::o;20083:::-;20225:3;20246:67;20310:2;20305:3;20246:67;:::i;:::-;20239:74;;20322:93;20411:3;20322:93;:::i;:::-;20440:2;20435:3;20431:12;20424:19;;20083:366;;;:::o;20455:::-;20597:3;20618:67;20682:2;20677:3;20618:67;:::i;:::-;20611:74;;20694:93;20783:3;20694:93;:::i;:::-;20812:2;20807:3;20803:12;20796:19;;20455:366;;;:::o;20827:::-;20969:3;20990:67;21054:2;21049:3;20990:67;:::i;:::-;20983:74;;21066:93;21155:3;21066:93;:::i;:::-;21184:2;21179:3;21175:12;21168:19;;20827:366;;;:::o;21199:::-;21341:3;21362:67;21426:2;21421:3;21362:67;:::i;:::-;21355:74;;21438:93;21527:3;21438:93;:::i;:::-;21556:2;21551:3;21547:12;21540:19;;21199:366;;;:::o;21571:::-;21713:3;21734:67;21798:2;21793:3;21734:67;:::i;:::-;21727:74;;21810:93;21899:3;21810:93;:::i;:::-;21928:2;21923:3;21919:12;21912:19;;21571:366;;;:::o;21943:::-;22085:3;22106:67;22170:2;22165:3;22106:67;:::i;:::-;22099:74;;22182:93;22271:3;22182:93;:::i;:::-;22300:2;22295:3;22291:12;22284:19;;21943:366;;;:::o;22315:108::-;22392:24;22410:5;22392:24;:::i;:::-;22387:3;22380:37;22315:108;;:::o;22429:118::-;22516:24;22534:5;22516:24;:::i;:::-;22511:3;22504:37;22429:118;;:::o;22553:157::-;22658:45;22678:24;22696:5;22678:24;:::i;:::-;22658:45;:::i;:::-;22653:3;22646:58;22553:157;;:::o;22716:397::-;22856:3;22871:75;22942:3;22933:6;22871:75;:::i;:::-;22971:2;22966:3;22962:12;22955:19;;22984:75;23055:3;23046:6;22984:75;:::i;:::-;23084:2;23079:3;23075:12;23068:19;;23104:3;23097:10;;22716:397;;;;;:::o;23119:269::-;23248:3;23270:92;23358:3;23349:6;23270:92;:::i;:::-;23263:99;;23379:3;23372:10;;23119:269;;;;:::o;23394:429::-;23571:3;23593:92;23681:3;23672:6;23593:92;:::i;:::-;23586:99;;23702:95;23793:3;23784:6;23702:95;:::i;:::-;23695:102;;23814:3;23807:10;;23394:429;;;;;:::o;23829:222::-;23922:4;23960:2;23949:9;23945:18;23937:26;;23973:71;24041:1;24030:9;24026:17;24017:6;23973:71;:::i;:::-;23829:222;;;;:::o;24057:640::-;24252:4;24290:3;24279:9;24275:19;24267:27;;24304:71;24372:1;24361:9;24357:17;24348:6;24304:71;:::i;:::-;24385:72;24453:2;24442:9;24438:18;24429:6;24385:72;:::i;:::-;24467;24535:2;24524:9;24520:18;24511:6;24467:72;:::i;:::-;24586:9;24580:4;24576:20;24571:2;24560:9;24556:18;24549:48;24614:76;24685:4;24676:6;24614:76;:::i;:::-;24606:84;;24057:640;;;;;;;:::o;24703:373::-;24846:4;24884:2;24873:9;24869:18;24861:26;;24933:9;24927:4;24923:20;24919:1;24908:9;24904:17;24897:47;24961:108;25064:4;25055:6;24961:108;:::i;:::-;24953:116;;24703:373;;;;:::o;25082:210::-;25169:4;25207:2;25196:9;25192:18;25184:26;;25220:65;25282:1;25271:9;25267:17;25258:6;25220:65;:::i;:::-;25082:210;;;;:::o;25298:260::-;25410:4;25448:2;25437:9;25433:18;25425:26;;25461:90;25548:1;25537:9;25533:17;25524:6;25461:90;:::i;:::-;25298:260;;;;:::o;25564:313::-;25677:4;25715:2;25704:9;25700:18;25692:26;;25764:9;25758:4;25754:20;25750:1;25739:9;25735:17;25728:47;25792:78;25865:4;25856:6;25792:78;:::i;:::-;25784:86;;25564:313;;;;:::o;25883:419::-;26049:4;26087:2;26076:9;26072:18;26064:26;;26136:9;26130:4;26126:20;26122:1;26111:9;26107:17;26100:47;26164:131;26290:4;26164:131;:::i;:::-;26156:139;;25883:419;;;:::o;26308:::-;26474:4;26512:2;26501:9;26497:18;26489:26;;26561:9;26555:4;26551:20;26547:1;26536:9;26532:17;26525:47;26589:131;26715:4;26589:131;:::i;:::-;26581:139;;26308:419;;;:::o;26733:::-;26899:4;26937:2;26926:9;26922:18;26914:26;;26986:9;26980:4;26976:20;26972:1;26961:9;26957:17;26950:47;27014:131;27140:4;27014:131;:::i;:::-;27006:139;;26733:419;;;:::o;27158:::-;27324:4;27362:2;27351:9;27347:18;27339:26;;27411:9;27405:4;27401:20;27397:1;27386:9;27382:17;27375:47;27439:131;27565:4;27439:131;:::i;:::-;27431:139;;27158:419;;;:::o;27583:::-;27749:4;27787:2;27776:9;27772:18;27764:26;;27836:9;27830:4;27826:20;27822:1;27811:9;27807:17;27800:47;27864:131;27990:4;27864:131;:::i;:::-;27856:139;;27583:419;;;:::o;28008:::-;28174:4;28212:2;28201:9;28197:18;28189:26;;28261:9;28255:4;28251:20;28247:1;28236:9;28232:17;28225:47;28289:131;28415:4;28289:131;:::i;:::-;28281:139;;28008:419;;;:::o;28433:::-;28599:4;28637:2;28626:9;28622:18;28614:26;;28686:9;28680:4;28676:20;28672:1;28661:9;28657:17;28650:47;28714:131;28840:4;28714:131;:::i;:::-;28706:139;;28433:419;;;:::o;28858:::-;29024:4;29062:2;29051:9;29047:18;29039:26;;29111:9;29105:4;29101:20;29097:1;29086:9;29082:17;29075:47;29139:131;29265:4;29139:131;:::i;:::-;29131:139;;28858:419;;;:::o;29283:::-;29449:4;29487:2;29476:9;29472:18;29464:26;;29536:9;29530:4;29526:20;29522:1;29511:9;29507:17;29500:47;29564:131;29690:4;29564:131;:::i;:::-;29556:139;;29283:419;;;:::o;29708:::-;29874:4;29912:2;29901:9;29897:18;29889:26;;29961:9;29955:4;29951:20;29947:1;29936:9;29932:17;29925:47;29989:131;30115:4;29989:131;:::i;:::-;29981:139;;29708:419;;;:::o;30133:::-;30299:4;30337:2;30326:9;30322:18;30314:26;;30386:9;30380:4;30376:20;30372:1;30361:9;30357:17;30350:47;30414:131;30540:4;30414:131;:::i;:::-;30406:139;;30133:419;;;:::o;30558:::-;30724:4;30762:2;30751:9;30747:18;30739:26;;30811:9;30805:4;30801:20;30797:1;30786:9;30782:17;30775:47;30839:131;30965:4;30839:131;:::i;:::-;30831:139;;30558:419;;;:::o;30983:222::-;31076:4;31114:2;31103:9;31099:18;31091:26;;31127:71;31195:1;31184:9;31180:17;31171:6;31127:71;:::i;:::-;30983:222;;;;:::o;31211:129::-;31245:6;31272:20;;:::i;:::-;31262:30;;31301:33;31329:4;31321:6;31301:33;:::i;:::-;31211:129;;;:::o;31346:75::-;31379:6;31412:2;31406:9;31396:19;;31346:75;:::o;31427:311::-;31504:4;31594:18;31586:6;31583:30;31580:56;;;31616:18;;:::i;:::-;31580:56;31666:4;31658:6;31654:17;31646:25;;31726:4;31720;31716:15;31708:23;;31427:311;;;:::o;31744:::-;31821:4;31911:18;31903:6;31900:30;31897:56;;;31933:18;;:::i;:::-;31897:56;31983:4;31975:6;31971:17;31963:25;;32043:4;32037;32033:15;32025:23;;31744:311;;;:::o;32061:::-;32138:4;32228:18;32220:6;32217:30;32214:56;;;32250:18;;:::i;:::-;32214:56;32300:4;32292:6;32288:17;32280:25;;32360:4;32354;32350:15;32342:23;;32061:311;;;:::o;32378:307::-;32439:4;32529:18;32521:6;32518:30;32515:56;;;32551:18;;:::i;:::-;32515:56;32589:29;32611:6;32589:29;:::i;:::-;32581:37;;32673:4;32667;32663:15;32655:23;;32378:307;;;:::o;32691:132::-;32758:4;32781:3;32773:11;;32811:4;32806:3;32802:14;32794:22;;32691:132;;;:::o;32829:141::-;32878:4;32901:3;32893:11;;32924:3;32921:1;32914:14;32958:4;32955:1;32945:18;32937:26;;32829:141;;;:::o;32976:114::-;33043:6;33077:5;33071:12;33061:22;;32976:114;;;:::o;33096:98::-;33147:6;33181:5;33175:12;33165:22;;33096:98;;;:::o;33200:99::-;33252:6;33286:5;33280:12;33270:22;;33200:99;;;:::o;33305:113::-;33375:4;33407;33402:3;33398:14;33390:22;;33305:113;;;:::o;33424:184::-;33523:11;33557:6;33552:3;33545:19;33597:4;33592:3;33588:14;33573:29;;33424:184;;;;:::o;33614:168::-;33697:11;33731:6;33726:3;33719:19;33771:4;33766:3;33762:14;33747:29;;33614:168;;;;:::o;33788:169::-;33872:11;33906:6;33901:3;33894:19;33946:4;33941:3;33937:14;33922:29;;33788:169;;;;:::o;33963:148::-;34065:11;34102:3;34087:18;;33963:148;;;;:::o;34117:305::-;34157:3;34176:20;34194:1;34176:20;:::i;:::-;34171:25;;34210:20;34228:1;34210:20;:::i;:::-;34205:25;;34364:1;34296:66;34292:74;34289:1;34286:81;34283:107;;;34370:18;;:::i;:::-;34283:107;34414:1;34411;34407:9;34400:16;;34117:305;;;;:::o;34428:185::-;34468:1;34485:20;34503:1;34485:20;:::i;:::-;34480:25;;34519:20;34537:1;34519:20;:::i;:::-;34514:25;;34558:1;34548:35;;34563:18;;:::i;:::-;34548:35;34605:1;34602;34598:9;34593:14;;34428:185;;;;:::o;34619:191::-;34659:4;34679:20;34697:1;34679:20;:::i;:::-;34674:25;;34713:20;34731:1;34713:20;:::i;:::-;34708:25;;34752:1;34749;34746:8;34743:34;;;34757:18;;:::i;:::-;34743:34;34802:1;34799;34795:9;34787:17;;34619:191;;;;:::o;34816:96::-;34853:7;34882:24;34900:5;34882:24;:::i;:::-;34871:35;;34816:96;;;:::o;34918:90::-;34952:7;34995:5;34988:13;34981:21;34970:32;;34918:90;;;:::o;35014:77::-;35051:7;35080:5;35069:16;;35014:77;;;:::o;35097:149::-;35133:7;35173:66;35166:5;35162:78;35151:89;;35097:149;;;:::o;35252:126::-;35289:7;35329:42;35322:5;35318:54;35307:65;;35252:126;;;:::o;35384:77::-;35421:7;35450:5;35439:16;;35384:77;;;:::o;35467:145::-;35536:9;35569:37;35600:5;35569:37;:::i;:::-;35556:50;;35467:145;;;:::o;35618:126::-;35668:9;35701:37;35732:5;35701:37;:::i;:::-;35688:50;;35618:126;;;:::o;35750:113::-;35800:9;35833:24;35851:5;35833:24;:::i;:::-;35820:37;;35750:113;;;:::o;35869:154::-;35953:6;35948:3;35943;35930:30;36015:1;36006:6;36001:3;35997:16;35990:27;35869:154;;;:::o;36029:307::-;36097:1;36107:113;36121:6;36118:1;36115:13;36107:113;;;36206:1;36201:3;36197:11;36191:18;36187:1;36182:3;36178:11;36171:39;36143:2;36140:1;36136:10;36131:15;;36107:113;;;36238:6;36235:1;36232:13;36229:101;;;36318:1;36309:6;36304:3;36300:16;36293:27;36229:101;36078:258;36029:307;;;:::o;36342:320::-;36386:6;36423:1;36417:4;36413:12;36403:22;;36470:1;36464:4;36460:12;36491:18;36481:81;;36547:4;36539:6;36535:17;36525:27;;36481:81;36609:2;36601:6;36598:14;36578:18;36575:38;36572:84;;;36628:18;;:::i;:::-;36572:84;36393:269;36342:320;;;:::o;36668:281::-;36751:27;36773:4;36751:27;:::i;:::-;36743:6;36739:40;36881:6;36869:10;36866:22;36845:18;36833:10;36830:34;36827:62;36824:88;;;36892:18;;:::i;:::-;36824:88;36932:10;36928:2;36921:22;36711:238;36668:281;;:::o;36955:233::-;36994:3;37017:24;37035:5;37017:24;:::i;:::-;37008:33;;37063:66;37056:5;37053:77;37050:103;;;37133:18;;:::i;:::-;37050:103;37180:1;37173:5;37169:13;37162:20;;36955:233;;;:::o;37194:100::-;37233:7;37262:26;37282:5;37262:26;:::i;:::-;37251:37;;37194:100;;;:::o;37300:94::-;37339:7;37368:20;37382:5;37368:20;:::i;:::-;37357:31;;37300:94;;;:::o;37400:79::-;37439:7;37468:5;37457:16;;37400:79;;;:::o;37485:176::-;37517:1;37534:20;37552:1;37534:20;:::i;:::-;37529:25;;37568:20;37586:1;37568:20;:::i;:::-;37563:25;;37607:1;37597:35;;37612:18;;:::i;:::-;37597:35;37653:1;37650;37646:9;37641:14;;37485:176;;;;:::o;37667:180::-;37715:77;37712:1;37705:88;37812:4;37809:1;37802:15;37836:4;37833:1;37826:15;37853:180;37901:77;37898:1;37891:88;37998:4;37995:1;37988:15;38022:4;38019:1;38012:15;38039:180;38087:77;38084:1;38077:88;38184:4;38181:1;38174:15;38208:4;38205:1;38198:15;38225:180;38273:77;38270:1;38263:88;38370:4;38367:1;38360:15;38394:4;38391:1;38384:15;38411:180;38459:77;38456:1;38449:88;38556:4;38553:1;38546:15;38580:4;38577:1;38570:15;38597:117;38706:1;38703;38696:12;38720:117;38829:1;38826;38819:12;38843:117;38952:1;38949;38942:12;38966:117;39075:1;39072;39065:12;39089:117;39198:1;39195;39188:12;39212:117;39321:1;39318;39311:12;39335:102;39376:6;39427:2;39423:7;39418:2;39411:5;39407:14;39403:28;39393:38;;39335:102;;;:::o;39443:94::-;39476:8;39524:5;39520:2;39516:14;39495:35;;39443:94;;;:::o;39543:166::-;39683:18;39679:1;39671:6;39667:14;39660:42;39543:166;:::o;39715:179::-;39855:31;39851:1;39843:6;39839:14;39832:55;39715:179;:::o;39900:169::-;40040:21;40036:1;40028:6;40024:14;40017:45;39900:169;:::o;40075:225::-;40215:34;40211:1;40203:6;40199:14;40192:58;40284:8;40279:2;40271:6;40267:15;40260:33;40075:225;:::o;40306:177::-;40446:29;40442:1;40434:6;40430:14;40423:53;40306:177;:::o;40489:179::-;40629:31;40625:1;40617:6;40613:14;40606:55;40489:179;:::o;40674:170::-;40814:22;40810:1;40802:6;40798:14;40791:46;40674:170;:::o;40850:182::-;40990:34;40986:1;40978:6;40974:14;40967:58;40850:182;:::o;41038:177::-;41178:29;41174:1;41166:6;41162:14;41155:53;41038:177;:::o;41221:167::-;41361:19;41357:1;41349:6;41345:14;41338:43;41221:167;:::o;41394:171::-;41534:23;41530:1;41522:6;41518:14;41511:47;41394:171;:::o;41571:163::-;41711:15;41707:1;41699:6;41695:14;41688:39;41571:163;:::o;41740:122::-;41813:24;41831:5;41813:24;:::i;:::-;41806:5;41803:35;41793:63;;41852:1;41849;41842:12;41793:63;41740:122;:::o;41868:116::-;41938:21;41953:5;41938:21;:::i;:::-;41931:5;41928:32;41918:60;;41974:1;41971;41964:12;41918:60;41868:116;:::o;41990:122::-;42063:24;42081:5;42063:24;:::i;:::-;42056:5;42053:35;42043:63;;42102:1;42099;42092:12;42043:63;41990:122;:::o;42118:120::-;42190:23;42207:5;42190:23;:::i;:::-;42183:5;42180:34;42170:62;;42228:1;42225;42218:12;42170:62;42118:120;:::o;42244:122::-;42317:24;42335:5;42317:24;:::i;:::-;42310:5;42307:35;42297:63;;42356:1;42353;42346:12;42297:63;42244:122;:::o

Swarm Source

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