ETH Price: $3,298.99 (-3.29%)
Gas: 15 Gwei

Token

Chublins (CHUBLIN)
 

Overview

Max Total Supply

4,444 CHUBLIN

Holders

553

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
gogarci.eth
Balance
1 CHUBLIN
0x6216a53dfb956e3f86056fc515f70e6c0c21217a
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
Chublins

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/*
  ___  _   _  __  __  ____  __    ____  _  _  ___
 / __)( )_( )(  )(  )(  _ \(  )  (_  _)( \( )/ __)
( (__  ) _ (  )(__)(  ) _ < )(__  _)(_  )  ( \__ \
 \___)(_) (_)(______)(____/(____)(____)(_)\_)(___/


By Christian Montoya
m0nt0y4.eth

*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

    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;
        // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`.
        uint24 extraData;
    }

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

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

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`,
     * as defined in the ERC2309 standard. See `_mintERC2309` for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

/**
 * @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 bit position of `extraData` in packed ownership.
    uint256 private constant BITPOS_EXTRA_DATA = 232;

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

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

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

    // The 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`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

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

    // Mapping from token ID to approved address.
    mapping(uint256 => 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 (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

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

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

    /**
     * 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;
        ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA);
    }

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

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

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

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

        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-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 {
        transferFrom(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.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity);

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

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

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

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

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

            uint256 tokenId = startTokenId;
            uint256 end = startTokenId + quantity;
            do {
                emit Transfer(address(0), to, tokenId++);
            } while (tokenId < end);

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

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

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

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

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

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

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

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals;
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            // Compute the slot.
            mstore(0x00, tokenId)
            mstore(0x20, tokenApprovalsPtr.slot)
            approvedAddressSlot := keccak256(0x00, 0x40)
            // Load the slot's value from storage.
            approvedAddress := sload(approvedAddressSlot)
        }
    }

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

    /**
     * @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 transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

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

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

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

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

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

    /**
     * @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 Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

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

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

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

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

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

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

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

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

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

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

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

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

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

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

// Base64 Contract
// Creator: Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// Chublins Contract v0.0.4
// Creator: Christian Montoya

contract Chublins is Ownable, ERC721A, ReentrancyGuard {
    constructor() ERC721A("Chublins", "CHUBLIN") {}

    uint256 private _maxSupply = 0; // default supply = 0 which means no minting!
    uint256 private _basePrice = 10000000; // 0.024 ETH

    bool private _pngsAvailable = false;
    string private _baseTokenURI = "https://chublins.xyz/pngs/"; // for NFTs rendered off-chain (to be compatible with Twitter, etc.)
    uint8[8888] private _licenses; // will hold license status of all NFTs
    bool[8888] private _returnPNG; // if true for an ID, then return a hosted PNG instead of onchain SVG

    // this can only be done once (to start the mint)
    function enableMinting(uint256 supply) external onlyOwner {
        require(_maxSupply == 0); 
        _maxSupply = supply; 
    }

    function mint(uint256 quantity) external payable {
        require(_maxSupply >= (totalSupply() + quantity));
        require(quantity < 11); // max 10 per transaction 
        require(msg.sender==tx.origin); 
        require(msg.value >= (_basePrice * quantity));
        _mint(msg.sender, quantity);
    }

    struct chubData {
        string bgColor;
        string bgColorId;
        string ears;
        string earsId;
        string hat;
        string hatId;
        string eyes; 
        string eyesId; 
        string cheeks; 
        string cheeksId; 
        string mouth; 
        string mouthId; 
        string accessory; 
        string accessoryId; 
        string filter; 
        string filterId; 
        string license;
    }

    string[8] private _bgColors = ["c0caff","ff6b6b","ffdd59","0be881","fd9644","a55eea","778ca3","f8a5c2"];
    string[8] private _bgColorIds = ["sky","tomato","lemon","jade","clementine","royal","slate","sakura"];
    string[3] private _ears = [
        '',
		'<path d="M-46 -140 -26 -170 -6 -140" class="lnft"/><path d="M124 -137 144 -167 164 -137" class="lnft"/>',
		'<path d="M-48,-142 a0.9,1 0 0,1 60,-8" class="lnft th"/><path d="M116,-146 a0.9,1 0 0,1 60,12" class="lnft th"/>'
	];
    string[3] private _earIds = ["none","cat","bear"];
    string[4] private _hats = [
        '',
        '<ellipse cx="62" cy="-128" rx="50" ry="15"/><path d="M27,-130 a1,1 0 0,1 70,0"/><path d="M27,-130 a6,1 0 1,0 70,0" stroke="gray" stroke-width="2"/>',
        '<path d="M16 -112a1 1 0 0 1 100 0"/><path d="M17-112h99" stroke="#000" stroke-width="2"/><path d="M16 -112a2.5 1.5 18 1 0 100 0"/><path d="M16-112a50 6.25 0 1 0 100 0" stroke="#555" stroke-width="2" stroke-linecap="round"/><text x="52" y="-117" fill="#ddd">chub</text>',
        '<path d="m62-146 4-58-40-20" class="lnrt"/><circle cx="26" cy="-224" r="14"/>'
    ];
    string[4] private _hatIds = ["none","bowl","cap","antenna"];
    string[11] private _eyes = [
        '<circle cx="10" cy="10" r="10"/><circle cx="130" cy="10" r="10"/>',
        '<g id="eye" transform="scale(2)"><path d="M5-7v4.522m-8.334-.87L-.422.112m13.756-3.46L10.422.112" class="lnrt tn"/><circle r="8" cy="5" cx="5"/></g><use xlink:href="#eye" transform="translate(120,0)"/>',
        '<g id="eye"><circle cx="10" cy="10" r="30"/><circle cx="25" cy="5" r="8" fill="#fff"/><circle cx="-8" cy="20" r="4" fill="#fff"/></g><use xlink:href="#eye" transform="translate(120,0)"/>',
        '<g id="eye"><circle cx="10" cy="10" r="30"/><circle cx="10" cy="10" r="24" class="wlrt"/></g><use xlink:href="#eye" transform="translate(120,0)"/>',
        '<rect x="24" y="-18" width="16" height="48" ry="8"/><rect x="100" y="-18" width="16" height="48" ry="8"/>', 
        '<path d="M40 10 A10 10 10 10 0 13 10" class="lnrt"/><path d="M140 11 A10 10 10 10 100 12 10" class="lnrt"/>',
        '<path class="lnrt" d="M-5 0h50"/><circle cx="28" cy="12" r="13"/><path class="lnrt" d="M90 0h50"/><circle cx="123" cy="12" r="13"/>', 
        '<path class="lnrt" d="m-12 18 25-36m0 0 25 36m62 0 25-36m0 0 25 36"/>', 
        '<path d="m0-18 42 42M0 24l42-42m54 0 42 42m-42 0 42-42" class="lnrt"/>', 
        '<path stroke="#000" class="th" d="M-4-30 44-6"/><circle cx="23" cy="12" r="13"/><path stroke="#000" class="th" d="m108-6 48-24"/><circle cx="128" cy="12" r="13"/>',
        '<path id="eye" d="M299.348 296.348a18.83 18.83 0 0 1-20.378-17.1 18.835 18.835 0 0 1 17.098-20.382 11.605 11.605 0 0 1 12.562 10.545 11.605 11.605 0 0 1-10.546 12.557 4.375 4.375 0 0 1-.762-8.716 2.85 2.85 0 0 0-.496-5.669 10.075 10.075 0 0 0-9.135 10.903c.484 5.529 5.375 9.628 10.899 9.145a17.3 17.3 0 0 0 15.708-18.72 17.3 17.3 0 0 0-18.725-15.708 24.525 24.525 0 0 0-22.272 26.542 4.375 4.375 0 0 1-8.716.762 33.285 33.285 0 0 1 30.23-36.021 26.055 26.055 0 0 1 28.2 23.662 26.05 26.05 0 0 1-23.662 28.2z" transform="translate(-286,-260)"/><use xlink:href="#eye" transform="rotate(180,70,10)"/>'
    ]; 
    string[11] private _eyeIds = [
        "tiny",
        "lashes",
        "bubble",
        "froyo",
        "socket",
        "chuffed",
        "displeased",
        "kitty", 
        "deceased", 
        "angry",
        "dizzy"
    ];
    string[5] private _cheeks = [
        '', 
        '<ellipse cx="10" cy="60" rx="20" ry="10" fill="pink"/><ellipse cx="130" cy="60" rx="20" ry="10" fill="pink"/>', 
        '<path d="m15 6 10 12a12.8 12.8 0 1 1-20 0L15 6z" fill="#8af" transform="rotate(5 -432.172 -87.711)"/>', 
        '<path d="m15 6 10 12a12.8 12.8 0 1 1-20 0L15 6z" fill="none" stroke="black" stroke-width="3" transform="rotate(5 -432.172 -87.711)"/>',
        '<path id="chk" fill="#ffaafc" d="M-8 24c.568-3.85 4.951-3.909 6.844-1.609 1.892-2.3 6.275-2.241 6.843 1.61.506 3.436-4.012 6.23-6.843 8.058-2.832-1.829-7.35-4.622-6.844-8.059z" transform="matrix(2 0 0 2.4 0 0)"/><use xlink:href="#chk" transform="translate(148,0)"/>'
    ]; 
    string[5] private _cheekIds = [
        "plain",
        "pink",
        "tear",
        "tattoo",
        "hearts"
    ]; 
    string[9] private _mouths = [
        '<path d="M40,100 a1,1 0 0,0 60,0"/>',
        '<path d="m40 116 60-0" class="lnrt"/>',
        '<path d="M-100 -124a1 .9 0 0 0 60 0" class="lnrt" transform="rotate(180)"/>',
        '<path d="M40,100 a1,0.9 0 0,0 60,0" class="lnrt"/>', 
        '<path d="M40 100a1 .8 0 0 0 64 0" class="lnrt"/><path d="M-30 104a1 .2 0 0 0 26 0" class="lnrt" transform="rotate(-30)"/>',
        '<path d="m24 120 14-10 14 10 14-10 14 10 14-10 14 10" class="lnrt"/>', 
        '<ellipse cx="70" cy="114" rx="18" ry="24"/>',
        '<path d="M27,105 a1,1 0 0,0 40,0" class="lnrt"/><path d="M68,105 a1,1 0 0,0 40,0" class="lnrt"/>', 
        '<path d="M67,120 a0.6,0.6 0 0,0 0,-20" class="lnrt tn"/><path d="M67,140 a1.2,1 0 0,0 0,-20" class="lnrt tn"/>' 
    ]; 
    string[9] private _mouthIds = [
        "happy",
        "uncertain",
        "sad",
        "elated",
        "chuffed",
        "angry", 
        "shocked",
        "goopy",
        "kissy"
    ]; 
    string[5] private _accessories = [
        '',
        '<path id="ac" d="m 62.75,68.40197 c -12.39952,0.86941 -12.32504,13.72601 -29.25,12.25 7.34151,13.53549 24.42044,13.43629 34.25,6.75 9.82956,-6.68629 4.81982,-19.68853 -5,-19 z"/><use xlink:href="#ac" transform="scale(-1,1),translate(-142,0)"/>',
        '<path fill="red" stroke="red" stroke-width="7" stroke-linejoin="round" d="m-44-82 20 15 20-15v30l-20-15-20 15z"/><rect x="-34.5" y="-77.5" width="21" height="21" rx="4" fill="red" stroke="#fff" stroke-width="2"/>',
        '<path d="M-12 -53c-3.73-2.115-6.055-6.2-6.06-10.643 0-4.447 2.327-8.537 6.06-10.655m-37.738 0c3.73 2.115 6.055 6.2 6.06 10.643 0 4.448-2.326 8.538-6.06 10.655m8.22 8.22c2.116-3.73 6.2-6.055 10.643-6.06 4.448 0 8.538 2.327 10.655 6.06m0-37.738c-2.115 3.73-6.2 6.055-10.643 6.06-4.447 0-8.537-2.326-10.655-6.06" class="lnrt tn"/>',
        '<path d="m2.45 10.806 1.488.469.444 1.56.44-1.56 1.487-.469-1.488-.48-.439-1.547-.444 1.547zM.523 3.496l2.063.658.647 2.188.604-2.188 2.087-.658-2.087-.652L3.232.668l-.646 2.176zm8.11-2.028L7.626 5.263l-2.61 1.079 2.61 1.08 1.007 3.794L9.701 7.42l2.525-1.079-2.525-1.08z" fill="#ffc502" transform="translate(-88,-18)scale(4.5)"/>'
    ]; 
    string[5] private _accessoryIds = [
        "none",
        "mustache",
        "bow",
        "pop",
        "sparkle"
    ]; 
    string[3] private _filters = [
        '', 
        '<filter id="wavy" x="-50%" y="-50%" width="200%" height="200%"><feTurbulence baseFrequency="0" type="fractalNoise" stitchTiles="noStitch"><animate id="waves" attributeName="baseFrequency" dur="6s" begin="1.5s;waves.end+1.5s" values="0;0.03;0" keyTimes="0;0.5;1" easing="ease-in-out"/></feTurbulence><feDisplacementMap in="SourceGraphic" scale="14"/></filter>',
        '<filter id="glitchy" x="-50%" y="-50%" width="200%" height="200%"><feTurbulence baseFrequency="0.6" type="fractalNoise"/><feDisplacementMap in="SourceGraphic" scale="0"><animate id="glitch" attributeName="scale" dur="2.5s" begin="1.5s;glitch.end+3s" values="36.72;58.84;36.90;14.99;13.26;47.30;58.24;21.58;46.51;40.17;35.83;36.08;42.74;32.16;46.57;33.67;17.31;52.09;30.80;40.37;43.99;36.21;16.18;20.04;15.72;50.92;30.81"/></feDisplacementMap></filter>'
    ]; 
    string[3] private _filterIds = [
        "none",
        "wavy",
        "glitchy"
    ]; 

    function makeChub(uint256 id) internal view returns (chubData memory) {
        chubData memory chub;

        // random background color
        uint256 rand = uint256(keccak256(abi.encodePacked(id, address(this), "4"))) % _bgColors.length;
        chub.bgColorId = _bgColorIds[rand];
        chub.bgColor = _bgColors[rand];

        // random ears
        rand = uint256(keccak256(abi.encodePacked(id, address(this), "5"))) % 10;
        if(rand >= _ears.length) { rand = 0; } 
        chub.ears = _ears[rand];
        chub.earsId = _earIds[rand];

        // random hats
        rand = uint256(keccak256(abi.encodePacked(id, address(this), "6"))) % 12;
        if(rand >= _hats.length) { rand = 0; }
        chub.hat = _hats[rand];
        chub.hatId = _hatIds[rand];

        // random eyes 
        rand = uint256(keccak256(abi.encodePacked(id, address(this), "7"))) % _eyes.length;
        chub.eyes = _eyes[rand]; 
        chub.eyesId = _eyeIds[rand]; 

        // random cheeks 
        rand = uint256(keccak256(abi.encodePacked(id, address(this), "8"))) % 48;
        if(rand >= _cheeks.length) { rand = 0; }
        chub.cheeks = _cheeks[rand]; 
        chub.cheeksId = _cheekIds[rand]; 

        // random mouths
        rand = uint256(keccak256(abi.encodePacked(id, address(this), "9"))) % _mouths.length;
        chub.mouth = _mouths[rand]; 
        chub.mouthId = _mouthIds[rand]; 

        // random accessories 
        rand = uint256(keccak256(abi.encodePacked(id, address(this), "0"))) % 60;
        if(rand >= _accessories.length) { rand = 0; }
        chub.accessory = _accessories[rand]; 
        chub.accessoryId = _accessoryIds[rand]; 

        // random filters 
        rand = uint256(keccak256(abi.encodePacked(id, address(this), "3"))) % 100;
        if(rand >= _filters.length) { rand = 0; }
        chub.filter = _filters[rand]; 
        chub.filterId = _filterIds[rand]; 

        chub.license = "CC0";
        if(_licenses[id]==0) {
            chub.license = "ARR";
        }
        else if(_licenses[id]==1) {
            chub.license = "CC BY-NC";
        }

        return chub;
    }

    function makeSVG(chubData memory chub) internal pure returns (string memory) {
        string[17] memory parts;

        string memory filterUrl = ''; 
        if(bytes(chub.filter).length > 0) { 
            filterUrl = string(abi.encodePacked(" filter='url(#",chub.filterId,")'"));
        }

        parts[0] = "<svg width='600' height='600' viewBox='0 0 600 600' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'>";
        parts[1] = "<style>.lnft,.lnrt{stroke:#000;stroke-linecap:round}.lnft{fill:gray;stroke-width:8;}.lnrt{fill:none;stroke-width:7;stroke-linejoin:bezel}";
        parts[2] = ".th{stroke-width:12}.tn{stroke-width:4}.wlrt{stroke:#fff;stroke-width:3}text{font-family:'Comic Sans MS','Comic Sans','Chalkboard SE','Comic Neue',cursive;font-size:12pt}</style><defs>";
        parts[3] = chub.filter; 
        parts[4] = "</defs><rect width='100%' height='100%' fill='#";
        parts[5] = chub.bgColor;
        parts[6] = "'/><g id='chub'"; 
        parts[7] = filterUrl; 
        parts[8] = "><ellipse cx='300' cy='460' rx='160' ry='50' fill='#fff'/><path fill='#fff' d='M140 140h320v320H140z'/>";
        parts[9] = "<ellipse cx='300' cy='140' rx='160' ry='50' fill='#F8F4F4'/><g id='face' transform='rotate(-5 3422.335 -2819.49)'>";
        parts[10] = chub.ears;
        parts[11] = chub.hat;
        parts[12] = chub.eyes; 
        parts[13] = chub.mouth; 
        parts[14] = chub.cheeks; 
        parts[15] = chub.accessory; 
        parts[16] = "</g></g></svg>";

        string memory output = string(abi.encodePacked(parts[0],parts[1],parts[2],parts[3],parts[4],parts[5],parts[6],parts[7]));
        output = string(abi.encodePacked(output,parts[8],parts[9],parts[10],parts[11],parts[12],parts[13],parts[14],parts[15],parts[16]));

        return output;
    }

    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        require(ownerOf(tokenId) != address(0), "ERC721: tokenURI query for nonexistent token");

        chubData memory chub = makeChub(tokenId);
        string memory output;

        if(_returnPNG[tokenId] == true && _pngsAvailable == true) {
            // don't return on-chain SVG
            output = string(abi.encodePacked(_baseTokenURI, _toString(tokenId), '.png'));
        }
        else {
            output = makeSVG(chub);
            output = string(abi.encodePacked('data:image/svg+xml;base64,', Base64.encode(bytes(output))));
        }

        string[19] memory parts;

        parts[0] = '[{"trait_type":"BG Color","value":"';
        parts[1] = chub.bgColorId;
        parts[2] = '"},{"trait_type":"Ears","value":"';
        parts[3] = chub.earsId;
        parts[4] = '"},{"trait_type":"Hat","value":"';
        parts[5] = chub.hatId;
        parts[6] = '"},{"trait_type":"Eyes","value":"';
        parts[7] = chub.eyesId; 
        parts[8] = '"},{"trait_type":"Mouth","value":"';
        parts[9] = chub.mouthId; 
        parts[10] = '"},{"trait_type":"Cheeks","value":"';
        parts[11] = chub.cheeksId; 
        parts[12] = '"},{"trait_type":"Accessory","value":"';
        parts[13] = chub.accessoryId; 
        parts[14] = '"},{"trait_type":"Filter","value":"';
        parts[15] = chub.filterId; 
        parts[16] = '"},{"trait_type":"License","value":"';
        parts[17] = chub.license;
        parts[18] = '"}]';

        string memory json = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8]));
        json = string(abi.encodePacked(json,parts[9],parts[10],parts[11],parts[12],parts[13],parts[14],parts[15],parts[16],parts[17],parts[18]));

        json = string(abi.encodePacked('{"name":"Chublin #',_toString(tokenId),'", "description":"A Chublin born of the blockchain.","attributes":',json));
        json = Base64.encode(bytes(string(abi.encodePacked(json, ', "image":"', output, '"}'))));
        output = string(abi.encodePacked('data:application/json;base64,', json));

        return output;
    }

    function maxSupply() public view returns (uint256) {
        return _maxSupply;
    }

    function reduceSupply(uint256 value) public onlyOwner {
        require(value >= totalSupply() && value < _maxSupply, "Value not in required bounds");
        _maxSupply = value;
    }

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

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

    function setBaseURI(string calldata baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }

    function withdrawFunds() external onlyOwner nonReentrant {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed");
    }

    function togglePNGsAvailable() public onlyOwner returns(string memory) {
        if(_pngsAvailable == true) {
            _pngsAvailable = false;
            return("Indicating that PNGs are not available");
        }
        _pngsAvailable = true;
        return("Indicating that PNGs are available");
    }

    function toggleOnChainArt(uint256 tokenId) public returns(string memory){
        require(ownerOf(tokenId) == msg.sender, "Only the owner of this token can perform this action");
        if(_returnPNG[tokenId] == true) {
            _returnPNG[tokenId] = false;
            return("Toggled to on-chain SVG");
        }

        _returnPNG[tokenId] = true;
        return("Toggled to off-chain PNG");
    }

    function modifyLicense(uint256 tokenId, uint8 level) public returns(string memory){
        require(ownerOf(tokenId) == msg.sender, "Only the owner of this token can perform this action");
        require(level == 1 || level==2, "Allowed values for level can only be 1 or 2");
        if(_licenses[tokenId] == 0) {
            // if current level is 0, you can set it to 1 or 2
            _licenses[tokenId] = level;
            return("License level was raised successfully");
        }
        else if(level == 2) {
            // if current level is 1 or 2, you can set it to 2
            _licenses[tokenId] = level;
            return("License level was raised successfully");
        }
        revert("License level was not changed");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":"supply","type":"uint256"}],"name":"enableMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint8","name":"level","type":"uint8"}],"name":"modifyLicense","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"reduceSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"toggleOnChainArt","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePNGsAvailable","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600a5562989680600b556000600c60006101000a81548160ff0219169083151502179055506040518060400160405280601a81526020017f68747470733a2f2f636875626c696e732e78797a2f706e67732f000000000000815250600d908162000071919062001a9c565b506040518061010001604052806040518060400160405280600681526020017f633063616666000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f666636623662000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f666664643539000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f306265383831000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f666439363434000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f613535656561000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f373738636133000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f663861356332000000000000000000000000000000000000000000000000000081525081525061023a90600862000267929190620015a3565b506040518061010001604052806040518060400160405280600381526020017f736b79000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f746f6d61746f000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6c656d6f6e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6a6164650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f636c656d656e74696e650000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f726f79616c00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f736c61746500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f73616b75726100000000000000000000000000000000000000000000000000008152508152506102429060086200045d929190620015a3565b5060405180606001604052806040518060200160405280600081525081526020016040518060a0016040528060678152602001620086816067913981526020016040518060a001604052806070815260200162008f4f6070913981525061024a906003620004cd929190620015f6565b5060405180606001604052806040518060400160405280600481526020017f6e6f6e650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f636174000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f626561720000000000000000000000000000000000000000000000000000000081525081525061024d9060036200059b929190620015f6565b5060405180608001604052806040518060200160405280600081525081526020016040518060c00160405280609381526020016200819160939139815260200160405180610140016040528061010c81526020016200806261010c913981526020016040518060800160405280604d8152602001620083de604d91398152506102509060046200062d92919062001649565b5060405180608001604052806040518060400160405280600481526020017f6e6f6e650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f626f776c0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f636170000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f616e74656e6e61000000000000000000000000000000000000000000000000008152508152506102549060046200073692919062001649565b5060405180610160016040528060405180608001604052806041815260200162007d7260419139815260200160405180610100016040528060c981526020016200889460c9913981526020016040518060e0016040528060ba8152602001620086e860ba913981526020016040518060c0016040528060928152602001620087a26092913981526020016040518060a0016040528060698152602001620091626069913981526020016040518060a00160405280606b815260200162008c54606b913981526020016040518060c0016040528060838152602001620089cb60839139815260200160405180608001604052806045815260200162008fbf60459139815260200160405180608001604052806046815260200162008ac76046913981526020016040518060e0016040528060a2815260200162008ead60a29139815260200160405180610280016040528061025681526020016200842b610256913981525061025890600b620008ad9291906200169c565b506040518061016001604052806040518060400160405280600481526020017f74696e790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f6c6173686573000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f627562626c65000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f66726f796f00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f736f636b6574000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f636875666665640000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f646973706c65617365640000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6b6974747900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f646563656173656400000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f616e67727900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f64697a7a7900000000000000000000000000000000000000000000000000000081525081525061026390600b62000b549291906200169c565b506040518060a001604052806040518060200160405280600081525081526020016040518060a00160405280606d815260200162008224606d913981526020016040518060a0016040528060658152602001620090296065913981526020016040518060c001604052806085815260200162008dfd6085913981526020016040518061014001604052806101098152602001620082d5610109913981525061026e90600562000c05929190620016ef565b506040518060a001604052806040518060400160405280600581526020017f706c61696e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f70696e6b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f746561720000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f746174746f6f000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f686561727473000000000000000000000000000000000000000000000000000081525081525061027390600562000d49929190620016ef565b506040518061012001604052806040518060600160405280602381526020016200816e602391398152602001604051806060016040528060258152602001620090046025913981526020016040518060800160405280604b815260200162008db2604b9139815260200160405180606001604052806032815260200162007d406032913981526020016040518060a001604052806079815260200162008a4e607991398152602001604051806080016040528060448152602001620082916044913981526020016040518060600160405280602b815260200162008e82602b91398152602001604051806080016040528060608152602001620088346060913981526020016040518060a00160405280606e81526020016200895d606e913981525061027890600962000e7e92919062001742565b506040518061012001604052806040518060400160405280600581526020017f686170707900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f756e6365727461696e000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f736164000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f656c61746564000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f636875666665640000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f616e67727900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f73686f636b65640000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f676f6f707900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6b69737379000000000000000000000000000000000000000000000000000000815250815250610281906009620010af92919062001742565b506040518060a0016040528060405180602001604052806000815250815260200160405180610120016040528060f3815260200162008cbf60f39139815260200160405180610100016040528060d481526020016200908e60d491398152602001604051806101800160405280610147815260200162008b0d61014791398152602001604051806101800160405280610149815260200162007db3610149913981525061028a90600562001165929190620016ef565b506040518060a001604052806040518060400160405280600481526020017f6e6f6e650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f6d7573746163686500000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626f77000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f706f70000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f737061726b6c650000000000000000000000000000000000000000000000000081525081525061028f906005620012a9929190620016ef565b506040518060600160405280604051806020016040528060008152508152602001604051806101a00160405280610166815260200162007efc610166913981526020016040518061020001604052806101c3815260200162007b7d6101c391398152506102949060036200131f929190620015f6565b5060405180606001604052806040518060400160405280600481526020017f6e6f6e650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f776176790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f676c697463687900000000000000000000000000000000000000000000000000815250815250610297906003620013ed929190620015f6565b50348015620013fb57600080fd5b506040518060400160405280600881526020017f436875626c696e730000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f434855424c494e00000000000000000000000000000000000000000000000000815250620014886200147c620014d260201b60201c565b620014da60201b60201c565b816003908162001499919062001a9c565b508060049081620014ab919062001a9c565b50620014bc6200159e60201b60201c565b6001819055505050600160098190555062001b83565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b8260088101928215620015e3579160200282015b82811115620015e2578251829081620015d1919062001a9c565b5091602001919060010190620015b7565b5b509050620015f2919062001795565b5090565b826003810192821562001636579160200282015b828111156200163557825182908162001624919062001a9c565b50916020019190600101906200160a565b5b50905062001645919062001795565b5090565b826004810192821562001689579160200282015b828111156200168857825182908162001677919062001a9c565b50916020019190600101906200165d565b5b50905062001698919062001795565b5090565b82600b8101928215620016dc579160200282015b82811115620016db578251829081620016ca919062001a9c565b5091602001919060010190620016b0565b5b509050620016eb919062001795565b5090565b82600581019282156200172f579160200282015b828111156200172e5782518290816200171d919062001a9c565b509160200191906001019062001703565b5b5090506200173e919062001795565b5090565b826009810192821562001782579160200282015b828111156200178157825182908162001770919062001a9c565b509160200191906001019062001756565b5b50905062001791919062001795565b5090565b5b80821115620017b95760008181620017af9190620017bd565b5060010162001796565b5090565b508054620017cb906200188b565b6000825580601f10620017df575062001800565b601f016020900490600052602060002090810190620017ff919062001803565b5b50565b5b808211156200181e57600081600090555060010162001804565b5090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620018a457607f821691505b602082108103620018ba57620018b96200185c565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620019247fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620018e5565b620019308683620018e5565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200197d62001977620019718462001948565b62001952565b62001948565b9050919050565b6000819050919050565b62001999836200195c565b620019b1620019a88262001984565b848454620018f2565b825550505050565b600090565b620019c8620019b9565b620019d58184846200198e565b505050565b5b81811015620019fd57620019f1600082620019be565b600181019050620019db565b5050565b601f82111562001a4c5762001a1681620018c0565b62001a2184620018d5565b8101602085101562001a31578190505b62001a4962001a4085620018d5565b830182620019da565b50505b505050565b600082821c905092915050565b600062001a716000198460080262001a51565b1980831691505092915050565b600062001a8c838362001a5e565b9150826002028217905092915050565b62001aa78262001822565b67ffffffffffffffff81111562001ac35762001ac26200182d565b5b62001acf82546200188b565b62001adc82828562001a01565b600060209050601f83116001811462001b14576000841562001aff578287015190505b62001b0b858262001a7e565b86555062001b7b565b601f19841662001b2486620018c0565b60005b8281101562001b4e5784890151825560018201915060208501945060208101905062001b27565b8683101562001b6e578489015162001b6a601f89168262001a5e565b8355505b6001600288020188555050505b505050505050565b615fea8062001b936000396000f3fe60806040526004361061019c5760003560e01c8063715018a6116100ec578063b88d4fde1161008a578063e985e9c511610064578063e985e9c5146105a3578063ed5e4e2b146105e0578063f173f78e1461061d578063f2fde38b146106465761019c565b8063b88d4fde14610512578063c87b56dd1461053b578063d5abeb01146105785761019c565b806391b7f5ed116100c657806391b7f5ed1461047957806395d89b41146104a2578063a0712d68146104cd578063a22cb465146104e95761019c565b8063715018a61461040e57806380623444146104255780638da5cb5b1461044e5761019c565b806318160ddd1161015957806342842e0e1161013357806342842e0e1461034257806355f804b31461036b5780636352211e1461039457806370a08231146103d15761019c565b806318160ddd146102d757806323b872dd1461030257806324600fc31461032b5761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b3146102465780630a85202e1461026f5780630e87c971146102ac575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190613f5e565b61066f565b6040516101d59190613fa6565b60405180910390f35b3480156101ea57600080fd5b506101f3610701565b6040516102009190614051565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b91906140a9565b610793565b60405161023d9190614117565b60405180910390f35b34801561025257600080fd5b5061026d6004803603810190610268919061415e565b61080f565b005b34801561027b57600080fd5b50610296600480360381019061029191906141d7565b610950565b6040516102a39190614051565b60405180910390f35b3480156102b857600080fd5b506102c1610b49565b6040516102ce9190614051565b60405180910390f35b3480156102e357600080fd5b506102ec610c57565b6040516102f99190614226565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190614241565b610c6e565b005b34801561033757600080fd5b50610340610f90565b005b34801561034e57600080fd5b5061036960048036038101906103649190614241565b611110565b005b34801561037757600080fd5b50610392600480360381019061038d91906142f9565b611130565b005b3480156103a057600080fd5b506103bb60048036038101906103b691906140a9565b6111c2565b6040516103c89190614117565b60405180910390f35b3480156103dd57600080fd5b506103f860048036038101906103f39190614346565b6111d4565b6040516104059190614226565b60405180910390f35b34801561041a57600080fd5b5061042361128c565b005b34801561043157600080fd5b5061044c600480360381019061044791906140a9565b611314565b005b34801561045a57600080fd5b506104636113f1565b6040516104709190614117565b60405180910390f35b34801561048557600080fd5b506104a0600480360381019061049b91906140a9565b61141a565b005b3480156104ae57600080fd5b506104b76114a0565b6040516104c49190614051565b60405180910390f35b6104e760048036038101906104e291906140a9565b611532565b005b3480156104f557600080fd5b50610510600480360381019061050b919061439f565b6115bf565b005b34801561051e57600080fd5b506105396004803603810190610534919061450f565b611736565b005b34801561054757600080fd5b50610562600480360381019061055d91906140a9565b6117a9565b60405161056f9190614051565b60405180910390f35b34801561058457600080fd5b5061058d611f2a565b60405161059a9190614226565b60405180910390f35b3480156105af57600080fd5b506105ca60048036038101906105c59190614592565b611f34565b6040516105d79190613fa6565b60405180910390f35b3480156105ec57600080fd5b50610607600480360381019061060291906140a9565b611fc8565b6040516106149190614051565b60405180910390f35b34801561062957600080fd5b50610644600480360381019061063f91906140a9565b612160565b005b34801561065257600080fd5b5061066d60048036038101906106689190614346565b6121f5565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106ca57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106fa5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606003805461071090614601565b80601f016020809104026020016040519081016040528092919081815260200182805461073c90614601565b80156107895780601f1061075e57610100808354040283529160200191610789565b820191906000526020600020905b81548152906001019060200180831161076c57829003601f168201915b5050505050905090565b600061079e826122ec565b6107d4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061081a826111c2565b90508073ffffffffffffffffffffffffffffffffffffffff1661083b61234b565b73ffffffffffffffffffffffffffffffffffffffff161461089e576108678161086261234b565b611f34565b61089d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60603373ffffffffffffffffffffffffffffffffffffffff16610972846111c2565b73ffffffffffffffffffffffffffffffffffffffff16146109c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bf906146a4565b60405180910390fd5b60018260ff1614806109dd575060028260ff16145b610a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1390614736565b60405180910390fd5b6000600e846122b88110610a3357610a32614756565b5b602091828204019190069054906101000a900460ff1660ff1603610aa75781600e846122b88110610a6757610a66614756565b5b602091828204019190066101000a81548160ff021916908360ff160217905550604051806060016040528060258152602001615e05602591399050610b43565b60028260ff1603610b085781600e846122b88110610ac857610ac7614756565b5b602091828204019190066101000a81548160ff021916908360ff160217905550604051806060016040528060258152602001615e05602591399050610b43565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3a906147d1565b60405180910390fd5b92915050565b6060610b53612353565b73ffffffffffffffffffffffffffffffffffffffff16610b716113f1565b73ffffffffffffffffffffffffffffffffffffffff1614610bc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbe9061483d565b60405180910390fd5b60011515600c60009054906101000a900460ff16151503610c1d576000600c60006101000a81548160ff021916908315150217905550604051806060016040528060268152602001615f6e602691399050610c54565b6001600c60006101000a81548160ff021916908315150217905550604051806060016040528060228152602001615dc06022913990505b90565b6000610c6161235b565b6002546001540303905090565b6000610c7982612360565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ce0576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610cec8461242c565b91509150610d028187610cfd61234b565b61244e565b610d4e57610d1786610d1261234b565b611f34565b610d4d576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610db4576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610dc18686866001612492565b8015610dcc57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610e9a85610e76888887612498565b7c0200000000000000000000000000000000000000000000000000000000176124c0565b600560008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610f205760006001850190506000600560008381526020019081526020016000205403610f1e576001548114610f1d578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f8886868660016124eb565b505050505050565b610f98612353565b73ffffffffffffffffffffffffffffffffffffffff16610fb66113f1565b73ffffffffffffffffffffffffffffffffffffffff161461100c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110039061483d565b60405180910390fd5b600260095403611051576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611048906148a9565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff164760405161107f906148fa565b60006040518083038185875af1925050503d80600081146110bc576040519150601f19603f3d011682016040523d82523d6000602084013e6110c1565b606091505b5050905080611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc9061495b565b60405180910390fd5b506001600981905550565b61112b83838360405180602001604052806000815250611736565b505050565b611138612353565b73ffffffffffffffffffffffffffffffffffffffff166111566113f1565b73ffffffffffffffffffffffffffffffffffffffff16146111ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a39061483d565b60405180910390fd5b8181600d91826111bd929190614b32565b505050565b60006111cd82612360565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361123b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611294612353565b73ffffffffffffffffffffffffffffffffffffffff166112b26113f1565b73ffffffffffffffffffffffffffffffffffffffff1614611308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ff9061483d565b60405180910390fd5b61131260006124f1565b565b61131c612353565b73ffffffffffffffffffffffffffffffffffffffff1661133a6113f1565b73ffffffffffffffffffffffffffffffffffffffff1614611390576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113879061483d565b60405180910390fd5b611398610c57565b81101580156113a85750600a5481105b6113e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113de90614c4e565b60405180910390fd5b80600a8190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611422612353565b73ffffffffffffffffffffffffffffffffffffffff166114406113f1565b73ffffffffffffffffffffffffffffffffffffffff1614611496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148d9061483d565b60405180910390fd5b80600b8190555050565b6060600480546114af90614601565b80601f01602080910402602001604051908101604052809291908181526020018280546114db90614601565b80156115285780601f106114fd57610100808354040283529160200191611528565b820191906000526020600020905b81548152906001019060200180831161150b57829003601f168201915b5050505050905090565b8061153b610c57565b6115459190614c9d565b600a54101561155357600080fd5b600b811061156057600080fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461159857600080fd5b80600b546115a69190614cd1565b3410156115b257600080fd5b6115bc33826125b5565b50565b6115c761234b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361162b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806008600061163861234b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116e561234b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161172a9190613fa6565b60405180910390a35050565b611741848484610c6e565b60008373ffffffffffffffffffffffffffffffffffffffff163b146117a35761176c84848484612788565b6117a2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600073ffffffffffffffffffffffffffffffffffffffff166117cc836111c2565b73ffffffffffffffffffffffffffffffffffffffff1603611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614d9d565b60405180910390fd5b600061182d836128d8565b9050606060011515610124856122b8811061184b5761184a614756565b5b602091828204019190069054906101000a900460ff161515148015611883575060011515600c60009054906101000a900460ff161515145b156118ba57600d611893856136ab565b6040516020016118a4929190614ec8565b60405160208183030381529060405290506118f0565b6118c382613705565b90506118ce81613c6e565b6040516020016118de9190614f43565b60405160208183030381529060405290505b6118f8613e1e565b604051806060016040528060238152602001615de2602391398160006013811061192557611924614756565b5b602002018190525082602001518160016013811061194657611945614756565b5b6020020181905250604051806060016040528060218152602001615f94602191398160026013811061197b5761197a614756565b5b602002018190525082606001518160036013811061199c5761199b614756565b5b60200201819052506040518060400160405280602081526020017f227d2c7b2274726169745f74797065223a22486174222c2276616c7565223a22815250816004601381106119ee576119ed614756565b5b60200201819052508260a0015181600560138110611a0f57611a0e614756565b5b6020020181905250604051806060016040528060218152602001615c1a6021913981600660138110611a4457611a43614756565b5b60200201819052508260e0015181600760138110611a6557611a64614756565b5b6020020181905250604051806060016040528060228152602001615ec36022913981600860138110611a9a57611a99614756565b5b602002018190525082610160015181600960138110611abc57611abb614756565b5b6020020181905250604051806060016040528060238152602001615ea06023913981600a60138110611af157611af0614756565b5b602002018190525082610120015181600b60138110611b1357611b12614756565b5b6020020181905250604051806060016040528060268152602001615ca26026913981600c60138110611b4857611b47614756565b5b6020020181905250826101a0015181600d60138110611b6a57611b69614756565b5b6020020181905250604051806060016040528060238152602001615e4e6023913981600e60138110611b9f57611b9e614756565b5b6020020181905250826101e0015181600f60138110611bc157611bc0614756565b5b6020020181905250604051806060016040528060248152602001615e2a6024913981601060138110611bf657611bf5614756565b5b602002018190525082610200015181601160138110611c1857611c17614756565b5b60200201819052506040518060400160405280600381526020017f227d5d000000000000000000000000000000000000000000000000000000000081525081601260138110611c6a57611c69614756565b5b6020020181905250600081600060138110611c8857611c87614756565b5b602002015182600160138110611ca157611ca0614756565b5b602002015183600260138110611cba57611cb9614756565b5b602002015184600360138110611cd357611cd2614756565b5b602002015185600460138110611cec57611ceb614756565b5b602002015186600560138110611d0557611d04614756565b5b602002015187600660138110611d1e57611d1d614756565b5b602002015188600760138110611d3757611d36614756565b5b602002015189600860138110611d5057611d4f614756565b5b6020020151604051602001611d6d99989796959493929190614f65565b60405160208183030381529060405290508082600960138110611d9357611d92614756565b5b602002015183600a60138110611dac57611dab614756565b5b602002015184600b60138110611dc557611dc4614756565b5b602002015185600c60138110611dde57611ddd614756565b5b602002015186600d60138110611df757611df6614756565b5b602002015187600e60138110611e1057611e0f614756565b5b602002015188600f60138110611e2957611e28614756565b5b602002015189601060138110611e4257611e41614756565b5b60200201518a601160138110611e5b57611e5a614756565b5b60200201518b601260138110611e7457611e73614756565b5b6020020151604051602001611e939b9a99989796959493929190614fe4565b6040516020818303038152906040529050611ead866136ab565b81604051602001611ebf929190615161565b6040516020818303038152906040529050611efa8184604051602001611ee6929190615233565b604051602081830303815290604052613c6e565b905080604051602001611f0d91906152b9565b604051602081830303815290604052925082945050505050919050565b6000600a54905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60603373ffffffffffffffffffffffffffffffffffffffff16611fea836111c2565b73ffffffffffffffffffffffffffffffffffffffff1614612040576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612037906146a4565b60405180910390fd5b60011515610124836122b8811061205a57612059614756565b5b602091828204019190069054906101000a900460ff161515036120eb576000610124836122b8811061208f5761208e614756565b5b602091828204019190066101000a81548160ff0219169083151502179055506040518060400160405280601781526020017f546f67676c656420746f206f6e2d636861696e20535647000000000000000000815250905061215b565b6001610124836122b8811061210357612102614756565b5b602091828204019190066101000a81548160ff0219169083151502179055506040518060400160405280601881526020017f546f67676c656420746f206f66662d636861696e20504e47000000000000000081525090505b919050565b612168612353565b73ffffffffffffffffffffffffffffffffffffffff166121866113f1565b73ffffffffffffffffffffffffffffffffffffffff16146121dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d39061483d565b60405180910390fd5b6000600a54146121eb57600080fd5b80600a8190555050565b6121fd612353565b73ffffffffffffffffffffffffffffffffffffffff1661221b6113f1565b73ffffffffffffffffffffffffffffffffffffffff1614612271576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122689061483d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036122e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d79061534d565b60405180910390fd5b6122e9816124f1565b50565b6000816122f761235b565b11158015612306575060015482105b8015612344575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600033905090565b600090565b6000808290508061236f61235b565b116123f5576001548110156123f45760006005600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036123f2575b600081036123e85760056000836001900393508381526020019081526020016000205490506123be565b8092505050612427565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600790508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86124af868684613e05565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612622576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000820361265c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126696000848385612492565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506126e0836126d16000866000612498565b6126da85613e0e565b176124c0565b60056000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106127045780600181905550505061278360008483856124eb565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127ae61234b565b8786866040518563ffffffff1660e01b81526004016127d094939291906153c2565b6020604051808303816000875af192505050801561280c57506040513d601f19601f820116820180604052508101906128099190615423565b60015b612885573d806000811461283c576040519150601f19603f3d011682016040523d82523d6000602084013e612841565b606091505b50600081510361287d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6128e0613e46565b6128e8613e46565b6000600884306040516020016128ff929190615505565b6040516020818303038152906040528051906020012060001c612922919061556b565b9050610242816008811061293957612938614756565b5b01805461294590614601565b80601f016020809104026020016040519081016040528092919081815260200182805461297190614601565b80156129be5780601f10612993576101008083540402835291602001916129be565b820191906000526020600020905b8154815290600101906020018083116129a157829003601f168201915b5050505050826020018190525061023a81600881106129e0576129df614756565b5b0180546129ec90614601565b80601f0160208091040260200160405190810160405280929190818152602001828054612a1890614601565b8015612a655780601f10612a3a57610100808354040283529160200191612a65565b820191906000526020600020905b815481529060010190602001808311612a4857829003601f168201915b50505050508260000181905250600a8430604051602001612a879291906155e8565b6040516020818303038152906040528051906020012060001c612aaa919061556b565b905060038110612ab957600090505b61024a8160038110612ace57612acd614756565b5b018054612ada90614601565b80601f0160208091040260200160405190810160405280929190818152602001828054612b0690614601565b8015612b535780601f10612b2857610100808354040283529160200191612b53565b820191906000526020600020905b815481529060010190602001808311612b3657829003601f168201915b5050505050826040018190525061024d8160038110612b7557612b74614756565b5b018054612b8190614601565b80601f0160208091040260200160405190810160405280929190818152602001828054612bad90614601565b8015612bfa5780601f10612bcf57610100808354040283529160200191612bfa565b820191906000526020600020905b815481529060010190602001808311612bdd57829003601f168201915b50505050508260600181905250600c8430604051602001612c1c92919061566b565b6040516020818303038152906040528051906020012060001c612c3f919061556b565b905060048110612c4e57600090505b6102508160048110612c6357612c62614756565b5b018054612c6f90614601565b80601f0160208091040260200160405190810160405280929190818152602001828054612c9b90614601565b8015612ce85780601f10612cbd57610100808354040283529160200191612ce8565b820191906000526020600020905b815481529060010190602001808311612ccb57829003601f168201915b505050505082608001819052506102548160048110612d0a57612d09614756565b5b018054612d1690614601565b80601f0160208091040260200160405190810160405280929190818152602001828054612d4290614601565b8015612d8f5780601f10612d6457610100808354040283529160200191612d8f565b820191906000526020600020905b815481529060010190602001808311612d7257829003601f168201915b50505050508260a00181905250600b8430604051602001612db19291906156ee565b6040516020818303038152906040528051906020012060001c612dd4919061556b565b905061025881600b8110612deb57612dea614756565b5b018054612df790614601565b80601f0160208091040260200160405190810160405280929190818152602001828054612e2390614601565b8015612e705780601f10612e4557610100808354040283529160200191612e70565b820191906000526020600020905b815481529060010190602001808311612e5357829003601f168201915b50505050508260c0018190525061026381600b8110612e9257612e91614756565b5b018054612e9e90614601565b80601f0160208091040260200160405190810160405280929190818152602001828054612eca90614601565b8015612f175780601f10612eec57610100808354040283529160200191612f17565b820191906000526020600020905b815481529060010190602001808311612efa57829003601f168201915b50505050508260e0018190525060308430604051602001612f39929190615771565b6040516020818303038152906040528051906020012060001c612f5c919061556b565b905060058110612f6b57600090505b61026e8160058110612f8057612f7f614756565b5b018054612f8c90614601565b80601f0160208091040260200160405190810160405280929190818152602001828054612fb890614601565b80156130055780601f10612fda57610100808354040283529160200191613005565b820191906000526020600020905b815481529060010190602001808311612fe857829003601f168201915b5050505050826101000181905250610273816005811061302857613027614756565b5b01805461303490614601565b80601f016020809104026020016040519081016040528092919081815260200182805461306090614601565b80156130ad5780601f10613082576101008083540402835291602001916130ad565b820191906000526020600020905b81548152906001019060200180831161309057829003601f168201915b5050505050826101200181905250600984306040516020016130d09291906157f4565b6040516020818303038152906040528051906020012060001c6130f3919061556b565b9050610278816009811061310a57613109614756565b5b01805461311690614601565b80601f016020809104026020016040519081016040528092919081815260200182805461314290614601565b801561318f5780601f106131645761010080835404028352916020019161318f565b820191906000526020600020905b81548152906001019060200180831161317257829003601f168201915b505050505082610140018190525061028181600981106131b2576131b1614756565b5b0180546131be90614601565b80601f01602080910402602001604051908101604052809291908181526020018280546131ea90614601565b80156132375780601f1061320c57610100808354040283529160200191613237565b820191906000526020600020905b81548152906001019060200180831161321a57829003601f168201915b5050505050826101600181905250603c843060405160200161325a929190615877565b6040516020818303038152906040528051906020012060001c61327d919061556b565b90506005811061328c57600090505b61028a81600581106132a1576132a0614756565b5b0180546132ad90614601565b80601f01602080910402602001604051908101604052809291908181526020018280546132d990614601565b80156133265780601f106132fb57610100808354040283529160200191613326565b820191906000526020600020905b81548152906001019060200180831161330957829003601f168201915b505050505082610180018190525061028f816005811061334957613348614756565b5b01805461335590614601565b80601f016020809104026020016040519081016040528092919081815260200182805461338190614601565b80156133ce5780601f106133a3576101008083540402835291602001916133ce565b820191906000526020600020905b8154815290600101906020018083116133b157829003601f168201915b5050505050826101a00181905250606484306040516020016133f19291906158fa565b6040516020818303038152906040528051906020012060001c613414919061556b565b90506003811061342357600090505b610294816003811061343857613437614756565b5b01805461344490614601565b80601f016020809104026020016040519081016040528092919081815260200182805461347090614601565b80156134bd5780601f10613492576101008083540402835291602001916134bd565b820191906000526020600020905b8154815290600101906020018083116134a057829003601f168201915b5050505050826101c0018190525061029781600381106134e0576134df614756565b5b0180546134ec90614601565b80601f016020809104026020016040519081016040528092919081815260200182805461351890614601565b80156135655780601f1061353a57610100808354040283529160200191613565565b820191906000526020600020905b81548152906001019060200180831161354857829003601f168201915b5050505050826101e001819052506040518060400160405280600381526020017f43433000000000000000000000000000000000000000000000000000000000008152508261020001819052506000600e856122b881106135c9576135c8614756565b5b602091828204019190069054906101000a900460ff1660ff160361362b576040518060400160405280600381526020017f41525200000000000000000000000000000000000000000000000000000000008152508261020001819052506136a1565b6001600e856122b8811061364257613641614756565b5b602091828204019190069054906101000a900460ff1660ff16036136a0576040518060400160405280600881526020017f43432042592d4e430000000000000000000000000000000000000000000000008152508261020001819052505b5b8192505050919050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156136f157600183039250600a81066030018353600a810490506136d1565b508181036020830392508083525050919050565b606061370f613eca565b60006040518060200160405280600081525090506000846101c0015151111561375a57836101e0015160405160200161374891906159c9565b60405160208183030381529060405290505b6040518060c0016040528060828152602001615b26608291398260006011811061378757613786614756565b5b60200201819052506040518060c0016040528060898152602001615ee560899139826001601181106137bc576137bb614756565b5b60200201819052506040518060e0016040528060b88152602001615cc860b89139826002601181106137f1576137f0614756565b5b6020020181905250836101c001518260036011811061381357613812614756565b5b60200201819052506040518060600160405280602f8152602001615e71602f91398260046011811061384857613847614756565b5b602002018190525083600001518260056011811061386957613868614756565b5b60200201819052506040518060400160405280600f81526020017f272f3e3c672069643d2763687562270000000000000000000000000000000000815250826006601181106138bb576138ba614756565b5b602002018190525080826007601181106138d8576138d7614756565b5b60200201819052506040518060a0016040528060678152602001615c3b606791398260086011811061390d5761390c614756565b5b60200201819052506040518060a0016040528060728152602001615ba8607291398260096011811061394257613941614756565b5b6020020181905250836040015182600a6011811061396357613962614756565b5b6020020181905250836080015182600b6011811061398457613983614756565b5b60200201819052508360c0015182600c601181106139a5576139a4614756565b5b602002018190525083610140015182600d601181106139c7576139c6614756565b5b602002018190525083610100015182600e601181106139e9576139e8614756565b5b602002018190525083610180015182600f60118110613a0b57613a0a614756565b5b60200201819052506040518060400160405280600e81526020017f3c2f673e3c2f673e3c2f7376673e00000000000000000000000000000000000081525082601060118110613a5d57613a5c614756565b5b6020020181905250600082600060118110613a7b57613a7a614756565b5b602002015183600160118110613a9457613a93614756565b5b602002015184600260118110613aad57613aac614756565b5b602002015185600360118110613ac657613ac5614756565b5b602002015186600460118110613adf57613ade614756565b5b602002015187600560118110613af857613af7614756565b5b602002015188600660118110613b1157613b10614756565b5b602002015189600760118110613b2a57613b29614756565b5b6020020151604051602001613b469897969594939291906159f6565b60405160208183030381529060405290508083600860118110613b6c57613b6b614756565b5b602002015184600960118110613b8557613b84614756565b5b602002015185600a60118110613b9e57613b9d614756565b5b602002015186600b60118110613bb757613bb6614756565b5b602002015187600c60118110613bd057613bcf614756565b5b602002015188600d60118110613be957613be8614756565b5b602002015189600e60118110613c0257613c01614756565b5b60200201518a600f60118110613c1b57613c1a614756565b5b60200201518b601060118110613c3457613c33614756565b5b6020020151604051602001613c529a99989796959493929190615a68565b6040516020818303038152906040529050809350505050919050565b606060008251905060008103613c965760405180602001604052806000815250915050613e00565b60006003600283613ca79190614c9d565b613cb19190615af4565b6004613cbd9190614cd1565b90506000602082613cce9190614c9d565b67ffffffffffffffff811115613ce757613ce66143e4565b5b6040519080825280601f01601f191660200182016040528015613d195781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001615d80604091399050600181016020830160005b86811015613dbd5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050613d44565b506003860660018114613dd75760028114613de757613df2565b613d3d60f01b6002830352613df2565b603d60f81b60018303525b508484525050819450505050505b919050565b60009392505050565b60006001821460e11b9050919050565b6040518061026001604052806013905b6060815260200190600190039081613e2e5790505090565b60405180610220016040528060608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081525090565b6040518061022001604052806011905b6060815260200190600190039081613eda5790505090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613f3b81613f06565b8114613f4657600080fd5b50565b600081359050613f5881613f32565b92915050565b600060208284031215613f7457613f73613efc565b5b6000613f8284828501613f49565b91505092915050565b60008115159050919050565b613fa081613f8b565b82525050565b6000602082019050613fbb6000830184613f97565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ffb578082015181840152602081019050613fe0565b60008484015250505050565b6000601f19601f8301169050919050565b600061402382613fc1565b61402d8185613fcc565b935061403d818560208601613fdd565b61404681614007565b840191505092915050565b6000602082019050818103600083015261406b8184614018565b905092915050565b6000819050919050565b61408681614073565b811461409157600080fd5b50565b6000813590506140a38161407d565b92915050565b6000602082840312156140bf576140be613efc565b5b60006140cd84828501614094565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614101826140d6565b9050919050565b614111816140f6565b82525050565b600060208201905061412c6000830184614108565b92915050565b61413b816140f6565b811461414657600080fd5b50565b60008135905061415881614132565b92915050565b6000806040838503121561417557614174613efc565b5b600061418385828601614149565b925050602061419485828601614094565b9150509250929050565b600060ff82169050919050565b6141b48161419e565b81146141bf57600080fd5b50565b6000813590506141d1816141ab565b92915050565b600080604083850312156141ee576141ed613efc565b5b60006141fc85828601614094565b925050602061420d858286016141c2565b9150509250929050565b61422081614073565b82525050565b600060208201905061423b6000830184614217565b92915050565b60008060006060848603121561425a57614259613efc565b5b600061426886828701614149565b935050602061427986828701614149565b925050604061428a86828701614094565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f8401126142b9576142b8614294565b5b8235905067ffffffffffffffff8111156142d6576142d5614299565b5b6020830191508360018202830111156142f2576142f161429e565b5b9250929050565b600080602083850312156143105761430f613efc565b5b600083013567ffffffffffffffff81111561432e5761432d613f01565b5b61433a858286016142a3565b92509250509250929050565b60006020828403121561435c5761435b613efc565b5b600061436a84828501614149565b91505092915050565b61437c81613f8b565b811461438757600080fd5b50565b60008135905061439981614373565b92915050565b600080604083850312156143b6576143b5613efc565b5b60006143c485828601614149565b92505060206143d58582860161438a565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61441c82614007565b810181811067ffffffffffffffff8211171561443b5761443a6143e4565b5b80604052505050565b600061444e613ef2565b905061445a8282614413565b919050565b600067ffffffffffffffff82111561447a576144796143e4565b5b61448382614007565b9050602081019050919050565b82818337600083830152505050565b60006144b26144ad8461445f565b614444565b9050828152602081018484840111156144ce576144cd6143df565b5b6144d9848285614490565b509392505050565b600082601f8301126144f6576144f5614294565b5b813561450684826020860161449f565b91505092915050565b6000806000806080858703121561452957614528613efc565b5b600061453787828801614149565b945050602061454887828801614149565b935050604061455987828801614094565b925050606085013567ffffffffffffffff81111561457a57614579613f01565b5b614586878288016144e1565b91505092959194509250565b600080604083850312156145a9576145a8613efc565b5b60006145b785828601614149565b92505060206145c885828601614149565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061461957607f821691505b60208210810361462c5761462b6145d2565b5b50919050565b7f4f6e6c7920746865206f776e6572206f66207468697320746f6b656e2063616e60008201527f20706572666f726d207468697320616374696f6e000000000000000000000000602082015250565b600061468e603483613fcc565b915061469982614632565b604082019050919050565b600060208201905081810360008301526146bd81614681565b9050919050565b7f416c6c6f7765642076616c75657320666f72206c6576656c2063616e206f6e6c60008201527f792062652031206f722032000000000000000000000000000000000000000000602082015250565b6000614720602b83613fcc565b915061472b826146c4565b604082019050919050565b6000602082019050818103600083015261474f81614713565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4c6963656e7365206c6576656c20776173206e6f74206368616e676564000000600082015250565b60006147bb601d83613fcc565b91506147c682614785565b602082019050919050565b600060208201905081810360008301526147ea816147ae565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614827602083613fcc565b9150614832826147f1565b602082019050919050565b600060208201905081810360008301526148568161481a565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614893601f83613fcc565b915061489e8261485d565b602082019050919050565b600060208201905081810360008301526148c281614886565b9050919050565b600081905092915050565b50565b60006148e46000836148c9565b91506148ef826148d4565b600082019050919050565b6000614905826148d7565b9150819050919050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614945600f83613fcc565b91506149508261490f565b602082019050919050565b6000602082019050818103600083015261497481614938565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026149e87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826149ab565b6149f286836149ab565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614a2f614a2a614a2584614073565b614a0a565b614073565b9050919050565b6000819050919050565b614a4983614a14565b614a5d614a5582614a36565b8484546149b8565b825550505050565b600090565b614a72614a65565b614a7d818484614a40565b505050565b5b81811015614aa157614a96600082614a6a565b600181019050614a83565b5050565b601f821115614ae657614ab781614986565b614ac08461499b565b81016020851015614acf578190505b614ae3614adb8561499b565b830182614a82565b50505b505050565b600082821c905092915050565b6000614b0960001984600802614aeb565b1980831691505092915050565b6000614b228383614af8565b9150826002028217905092915050565b614b3c838361497b565b67ffffffffffffffff811115614b5557614b546143e4565b5b614b5f8254614601565b614b6a828285614aa5565b6000601f831160018114614b995760008415614b87578287013590505b614b918582614b16565b865550614bf9565b601f198416614ba786614986565b60005b82811015614bcf57848901358255600182019150602085019450602081019050614baa565b86831015614bec5784890135614be8601f891682614af8565b8355505b6001600288020188555050505b50505050505050565b7f56616c7565206e6f7420696e20726571756972656420626f756e647300000000600082015250565b6000614c38601c83613fcc565b9150614c4382614c02565b602082019050919050565b60006020820190508181036000830152614c6781614c2b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614ca882614073565b9150614cb383614073565b9250828201905080821115614ccb57614cca614c6e565b5b92915050565b6000614cdc82614073565b9150614ce783614073565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d2057614d1f614c6e565b5b828202905092915050565b7f4552433732313a20746f6b656e55524920717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614d87602c83613fcc565b9150614d9282614d2b565b604082019050919050565b60006020820190508181036000830152614db681614d7a565b9050919050565b600081905092915050565b60008154614dd581614601565b614ddf8186614dbd565b94506001821660008114614dfa5760018114614e0f57614e42565b60ff1983168652811515820286019350614e42565b614e1885614986565b60005b83811015614e3a57815481890152600182019150602081019050614e1b565b838801955050505b50505092915050565b6000614e5682613fc1565b614e608185614dbd565b9350614e70818560208601613fdd565b80840191505092915050565b7f2e706e6700000000000000000000000000000000000000000000000000000000600082015250565b6000614eb2600483614dbd565b9150614ebd82614e7c565b600482019050919050565b6000614ed48285614dc8565b9150614ee08284614e4b565b9150614eeb82614ea5565b91508190509392505050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000600082015250565b6000614f2d601a83614dbd565b9150614f3882614ef7565b601a82019050919050565b6000614f4e82614f20565b9150614f5a8284614e4b565b915081905092915050565b6000614f71828c614e4b565b9150614f7d828b614e4b565b9150614f89828a614e4b565b9150614f958289614e4b565b9150614fa18288614e4b565b9150614fad8287614e4b565b9150614fb98286614e4b565b9150614fc58285614e4b565b9150614fd18284614e4b565b91508190509a9950505050505050505050565b6000614ff0828e614e4b565b9150614ffc828d614e4b565b9150615008828c614e4b565b9150615014828b614e4b565b9150615020828a614e4b565b915061502c8289614e4b565b91506150388288614e4b565b91506150448287614e4b565b91506150508286614e4b565b915061505c8285614e4b565b91506150688284614e4b565b91508190509c9b505050505050505050505050565b7f7b226e616d65223a22436875626c696e20230000000000000000000000000000600082015250565b60006150b3601283614dbd565b91506150be8261507d565b601282019050919050565b7f222c20226465736372697074696f6e223a224120436875626c696e20626f726e60008201527f206f662074686520626c6f636b636861696e2e222c226174747269627574657360208201527f223a000000000000000000000000000000000000000000000000000000000000604082015250565b600061514b604283614dbd565b9150615156826150c9565b604282019050919050565b600061516c826150a6565b91506151788285614e4b565b91506151838261513e565b915061518f8284614e4b565b91508190509392505050565b7f2c2022696d616765223a22000000000000000000000000000000000000000000600082015250565b60006151d1600b83614dbd565b91506151dc8261519b565b600b82019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b600061521d600283614dbd565b9150615228826151e7565b600282019050919050565b600061523f8285614e4b565b915061524a826151c4565b91506152568284614e4b565b915061526182615210565b91508190509392505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b60006152a3601d83614dbd565b91506152ae8261526d565b601d82019050919050565b60006152c482615296565b91506152d08284614e4b565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615337602683613fcc565b9150615342826152db565b604082019050919050565b600060208201905081810360008301526153668161532a565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006153948261536d565b61539e8185615378565b93506153ae818560208601613fdd565b6153b781614007565b840191505092915050565b60006080820190506153d76000830187614108565b6153e46020830186614108565b6153f16040830185614217565b81810360608301526154038184615389565b905095945050505050565b60008151905061541d81613f32565b92915050565b60006020828403121561543957615438613efc565b5b60006154478482850161540e565b91505092915050565b6000819050919050565b61546b61546682614073565b615450565b82525050565b60008160601b9050919050565b600061548982615471565b9050919050565b600061549b8261547e565b9050919050565b6154b36154ae826140f6565b615490565b82525050565b7f3400000000000000000000000000000000000000000000000000000000000000600082015250565b60006154ef600183614dbd565b91506154fa826154b9565b600182019050919050565b6000615511828561545a565b60208201915061552182846154a2565b601482019150615530826154e2565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061557682614073565b915061558183614073565b9250826155915761559061553c565b5b828206905092915050565b7f3500000000000000000000000000000000000000000000000000000000000000600082015250565b60006155d2600183614dbd565b91506155dd8261559c565b600182019050919050565b60006155f4828561545a565b60208201915061560482846154a2565b601482019150615613826155c5565b91508190509392505050565b7f3600000000000000000000000000000000000000000000000000000000000000600082015250565b6000615655600183614dbd565b91506156608261561f565b600182019050919050565b6000615677828561545a565b60208201915061568782846154a2565b60148201915061569682615648565b91508190509392505050565b7f3700000000000000000000000000000000000000000000000000000000000000600082015250565b60006156d8600183614dbd565b91506156e3826156a2565b600182019050919050565b60006156fa828561545a565b60208201915061570a82846154a2565b601482019150615719826156cb565b91508190509392505050565b7f3800000000000000000000000000000000000000000000000000000000000000600082015250565b600061575b600183614dbd565b915061576682615725565b600182019050919050565b600061577d828561545a565b60208201915061578d82846154a2565b60148201915061579c8261574e565b91508190509392505050565b7f3900000000000000000000000000000000000000000000000000000000000000600082015250565b60006157de600183614dbd565b91506157e9826157a8565b600182019050919050565b6000615800828561545a565b60208201915061581082846154a2565b60148201915061581f826157d1565b91508190509392505050565b7f3000000000000000000000000000000000000000000000000000000000000000600082015250565b6000615861600183614dbd565b915061586c8261582b565b600182019050919050565b6000615883828561545a565b60208201915061589382846154a2565b6014820191506158a282615854565b91508190509392505050565b7f3300000000000000000000000000000000000000000000000000000000000000600082015250565b60006158e4600183614dbd565b91506158ef826158ae565b600182019050919050565b6000615906828561545a565b60208201915061591682846154a2565b601482019150615925826158d7565b91508190509392505050565b7f2066696c7465723d2775726c2823000000000000000000000000000000000000600082015250565b6000615967600e83614dbd565b915061597282615931565b600e82019050919050565b7f2927000000000000000000000000000000000000000000000000000000000000600082015250565b60006159b3600283614dbd565b91506159be8261597d565b600282019050919050565b60006159d48261595a565b91506159e08284614e4b565b91506159eb826159a6565b915081905092915050565b6000615a02828b614e4b565b9150615a0e828a614e4b565b9150615a1a8289614e4b565b9150615a268288614e4b565b9150615a328287614e4b565b9150615a3e8286614e4b565b9150615a4a8285614e4b565b9150615a568284614e4b565b91508190509998505050505050505050565b6000615a74828d614e4b565b9150615a80828c614e4b565b9150615a8c828b614e4b565b9150615a98828a614e4b565b9150615aa48289614e4b565b9150615ab08288614e4b565b9150615abc8287614e4b565b9150615ac88286614e4b565b9150615ad48285614e4b565b9150615ae08284614e4b565b91508190509b9a5050505050505050505050565b6000615aff82614073565b9150615b0a83614073565b925082615b1a57615b1961553c565b5b82820490509291505056fe3c7376672077696474683d2736303027206865696768743d27363030272076696577426f783d2730203020363030203630302720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f7376672720786d6c6e733a786c696e6b3d27687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b273e3c656c6c697073652063783d27333030272063793d27313430272072783d27313630272072793d273530272066696c6c3d2723463846344634272f3e3c672069643d276661636527207472616e73666f726d3d27726f74617465282d3520333432322e333335202d323831392e343929273e227d2c7b2274726169745f74797065223a2245796573222c2276616c7565223a223e3c656c6c697073652063783d27333030272063793d27343630272072783d27313630272072793d273530272066696c6c3d2723666666272f3e3c706174682066696c6c3d27236666662720643d274d313430203134306833323076333230483134307a272f3e227d2c7b2274726169745f74797065223a224163636573736f7279222c2276616c7565223a222e74687b7374726f6b652d77696474683a31327d2e746e7b7374726f6b652d77696474683a347d2e776c72747b7374726f6b653a236666663b7374726f6b652d77696474683a337d746578747b666f6e742d66616d696c793a27436f6d69632053616e73204d53272c27436f6d69632053616e73272c274368616c6b626f617264205345272c27436f6d6963204e657565272c637572736976653b666f6e742d73697a653a313270747d3c2f7374796c653e3c646566733e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f496e6469636174696e67207468617420504e47732061726520617661696c61626c655b7b2274726169745f74797065223a22424720436f6c6f72222c2276616c7565223a224c6963656e7365206c6576656c2077617320726169736564207375636365737366756c6c79227d2c7b2274726169745f74797065223a224c6963656e7365222c2276616c7565223a22227d2c7b2274726169745f74797065223a2246696c746572222c2276616c7565223a223c2f646566733e3c726563742077696474683d273130302527206865696768743d2731303025272066696c6c3d2723227d2c7b2274726169745f74797065223a22436865656b73222c2276616c7565223a22227d2c7b2274726169745f74797065223a224d6f757468222c2276616c7565223a223c7374796c653e2e6c6e66742c2e6c6e72747b7374726f6b653a233030303b7374726f6b652d6c696e656361703a726f756e647d2e6c6e66747b66696c6c3a677261793b7374726f6b652d77696474683a383b7d2e6c6e72747b66696c6c3a6e6f6e653b7374726f6b652d77696474683a373b7374726f6b652d6c696e656a6f696e3a62657a656c7d496e6469636174696e67207468617420504e477320617265206e6f7420617661696c61626c65227d2c7b2274726169745f74797065223a2245617273222c2276616c7565223a22a2646970667358221220345938aad35acbd137cb017dc2378af2585fb233a2fb73a83137992de37a187364736f6c634300081000333c66696c7465722069643d22676c69746368792220783d222d3530252220793d222d353025222077696474683d223230302522206865696768743d2232303025223e3c666554757262756c656e636520626173654672657175656e63793d22302e362220747970653d226672616374616c4e6f697365222f3e3c6665446973706c6163656d656e744d617020696e3d22536f757263654772617068696322207363616c653d2230223e3c616e696d6174652069643d22676c6974636822206174747269627574654e616d653d227363616c6522206475723d22322e35732220626567696e3d22312e35733b676c697463682e656e642b3373222076616c7565733d2233362e37323b35382e38343b33362e39303b31342e39393b31332e32363b34372e33303b35382e32343b32312e35383b34362e35313b34302e31373b33352e38333b33362e30383b34322e37343b33322e31363b34362e35373b33332e36373b31372e33313b35322e30393b33302e38303b34302e33373b34332e39393b33362e32313b31362e31383b32302e30343b31352e37323b35302e39323b33302e3831222f3e3c2f6665446973706c6163656d656e744d61703e3c2f66696c7465723e3c7061746820643d224d34302c3130302061312c302e39203020302c302036302c302220636c6173733d226c6e7274222f3e3c636972636c652063783d223130222063793d2231302220723d223130222f3e3c636972636c652063783d22313330222063793d2231302220723d223130222f3e3c7061746820643d226d322e34352031302e38303620312e3438382e3436392e34343420312e35362e34342d312e353620312e3438372d2e3436392d312e3438382d2e34382d2e3433392d312e3534372d2e34343420312e3534377a4d2e35323320332e3439366c322e3036332e3635382e36343720322e3138382e3630342d322e31383820322e3038372d2e3635382d322e3038372d2e3635324c332e3233322e3636386c2d2e36343620322e3137367a6d382e31312d322e3032384c372e36323620352e3236336c2d322e363120312e30373920322e363120312e303820312e30303720332e3739344c392e37303120372e34326c322e3532352d312e3037392d322e3532352d312e30387a222066696c6c3d222366666335303222207472616e73666f726d3d227472616e736c617465282d38382c2d3138297363616c6528342e3529222f3e3c66696c7465722069643d22776176792220783d222d3530252220793d222d353025222077696474683d223230302522206865696768743d2232303025223e3c666554757262756c656e636520626173654672657175656e63793d22302220747970653d226672616374616c4e6f697365222073746974636854696c65733d226e6f537469746368223e3c616e696d6174652069643d22776176657322206174747269627574654e616d653d22626173654672657175656e637922206475723d2236732220626567696e3d22312e35733b77617665732e656e642b312e3573222076616c7565733d22303b302e30333b3022206b657954696d65733d22303b302e353b312220656173696e673d22656173652d696e2d6f7574222f3e3c2f666554757262756c656e63653e3c6665446973706c6163656d656e744d617020696e3d22536f757263654772617068696322207363616c653d223134222f3e3c2f66696c7465723e3c7061746820643d224d3136202d31313261312031203020302031203130302030222f3e3c7061746820643d224d31372d31313268393922207374726f6b653d222330303022207374726f6b652d77696474683d2232222f3e3c7061746820643d224d3136202d31313261322e3520312e3520313820312030203130302030222f3e3c7061746820643d224d31362d31313261353020362e323520302031203020313030203022207374726f6b653d222335353522207374726f6b652d77696474683d223222207374726f6b652d6c696e656361703d22726f756e64222f3e3c7465787420783d2235322220793d222d313137222066696c6c3d2223646464223e636875623c2f746578743e3c7061746820643d224d34302c3130302061312c31203020302c302036302c30222f3e3c656c6c697073652063783d223632222063793d222d313238222072783d223530222072793d223135222f3e3c7061746820643d224d32372c2d3133302061312c31203020302c312037302c30222f3e3c7061746820643d224d32372c2d3133302061362c31203020312c302037302c3022207374726f6b653d226772617922207374726f6b652d77696474683d2232222f3e3c656c6c697073652063783d223130222063793d223630222072783d223230222072793d223130222066696c6c3d2270696e6b222f3e3c656c6c697073652063783d22313330222063793d223630222072783d223230222072793d223130222066696c6c3d2270696e6b222f3e3c7061746820643d226d3234203132302031342d31302031342031302031342d31302031342031302031342d31302031342031302220636c6173733d226c6e7274222f3e3c706174682069643d2263686b222066696c6c3d22236666616166632220643d224d2d38203234632e3536382d332e383520342e3935312d332e39303920362e3834342d312e36303920312e3839322d322e3320362e3237352d322e32343120362e38343320312e36312e35303620332e3433362d342e30313220362e32332d362e38343320382e3035382d322e3833322d312e3832392d372e33352d342e3632322d362e3834342d382e3035397a22207472616e73666f726d3d226d617472697828322030203020322e342030203029222f3e3c75736520786c696e6b3a687265663d222363686b22207472616e73666f726d3d227472616e736c617465283134382c3029222f3e3c7061746820643d226d36322d31343620342d35382d34302d32302220636c6173733d226c6e7274222f3e3c636972636c652063783d223236222063793d222d3232342220723d223134222f3e3c706174682069643d226579652220643d224d3239392e333438203239362e3334386131382e38332031382e38332030203020312d32302e3337382d31372e312031382e3833352031382e3833352030203020312031372e3039382d32302e3338322031312e3630352031312e3630352030203020312031322e3536322031302e3534352031312e3630352031312e3630352030203020312d31302e3534362031322e35353720342e33373520342e3337352030203020312d2e3736322d382e37313620322e383520322e38352030203020302d2e3439362d352e3636392031302e3037352031302e3037352030203020302d392e3133352031302e393033632e34383420352e35323920352e33373520392e3632382031302e38393920392e3134356131372e332031372e332030203020302031352e3730382d31382e37322031372e332031372e332030203020302d31382e3732352d31352e3730382032342e3532352032342e3532352030203020302d32322e3237322032362e35343220342e33373520342e3337352030203020312d382e3731362e3736322033332e3238352033332e3238352030203020312033302e32332d33362e3032312032362e3035352032362e3035352030203020312032382e322032332e3636322032362e30352032362e30352030203020312d32332e3636322032382e327a22207472616e73666f726d3d227472616e736c617465282d3238362c2d32363029222f3e3c75736520786c696e6b3a687265663d222365796522207472616e73666f726d3d22726f74617465283138302c37302c313029222f3e3c7061746820643d224d2d3436202d313430202d3236202d313730202d36202d3134302220636c6173733d226c6e6674222f3e3c7061746820643d224d313234202d31333720313434202d31363720313634202d3133372220636c6173733d226c6e6674222f3e3c672069643d22657965223e3c636972636c652063783d223130222063793d2231302220723d223330222f3e3c636972636c652063783d223235222063793d22352220723d2238222066696c6c3d2223666666222f3e3c636972636c652063783d222d38222063793d2232302220723d2234222066696c6c3d2223666666222f3e3c2f673e3c75736520786c696e6b3a687265663d222365796522207472616e73666f726d3d227472616e736c617465283132302c3029222f3e3c672069643d22657965223e3c636972636c652063783d223130222063793d2231302220723d223330222f3e3c636972636c652063783d223130222063793d2231302220723d2232342220636c6173733d22776c7274222f3e3c2f673e3c75736520786c696e6b3a687265663d222365796522207472616e73666f726d3d227472616e736c617465283132302c3029222f3e3c7061746820643d224d32372c3130352061312c31203020302c302034302c302220636c6173733d226c6e7274222f3e3c7061746820643d224d36382c3130352061312c31203020302c302034302c302220636c6173733d226c6e7274222f3e3c672069643d2265796522207472616e73666f726d3d227363616c65283229223e3c7061746820643d224d352d3776342e3532326d2d382e3333342d2e38374c2d2e3432322e3131326d31332e3735362d332e34364c31302e3432322e3131322220636c6173733d226c6e727420746e222f3e3c636972636c6520723d2238222063793d2235222063783d2235222f3e3c2f673e3c75736520786c696e6b3a687265663d222365796522207472616e73666f726d3d227472616e736c617465283132302c3029222f3e3c7061746820643d224d36372c3132302061302e362c302e36203020302c3020302c2d32302220636c6173733d226c6e727420746e222f3e3c7061746820643d224d36372c3134302061312e322c31203020302c3020302c2d32302220636c6173733d226c6e727420746e222f3e3c7061746820636c6173733d226c6e72742220643d224d2d352030683530222f3e3c636972636c652063783d223238222063793d2231322220723d223133222f3e3c7061746820636c6173733d226c6e72742220643d224d39302030683530222f3e3c636972636c652063783d22313233222063793d2231322220723d223133222f3e3c7061746820643d224d3430203130306131202e3820302030203020363420302220636c6173733d226c6e7274222f3e3c7061746820643d224d2d3330203130346131202e3220302030203020323620302220636c6173733d226c6e727422207472616e73666f726d3d22726f74617465282d333029222f3e3c7061746820643d226d302d31382034322034324d302032346c34322d34326d353420302034322034326d2d343220302034322d34322220636c6173733d226c6e7274222f3e3c7061746820643d224d2d3132202d3533632d332e37332d322e3131352d362e3035352d362e322d362e30362d31302e36343320302d342e34343720322e3332372d382e35333720362e30362d31302e3635356d2d33372e373338203063332e373320322e31313520362e30353520362e3220362e30362031302e363433203020342e3434382d322e33323620382e3533382d362e30362031302e3635356d382e323220382e323263322e3131362d332e373320362e322d362e3035352031302e3634332d362e303620342e343438203020382e35333820322e3332372031302e36353520362e30366d302d33372e373338632d322e31313520332e37332d362e3220362e3035352d31302e36343320362e30362d342e34343720302d382e3533372d322e3332362d31302e3635352d362e30362220636c6173733d226c6e727420746e222f3e3c7061746820643d224d34302031302041313020313020313020313020302031332031302220636c6173733d226c6e7274222f3e3c7061746820643d224d31343020313120413130203130203130203130203130302031322031302220636c6173733d226c6e7274222f3e3c706174682069643d2261632220643d226d2036322e37352c36382e34303139372063202d31322e33393935322c302e3836393431202d31322e33323530342c31332e3732363031202d32392e32352c31322e323520372e33343135312c31332e35333534392032342e34323034342c31332e34333632392033342e32352c362e373520392e38323935362c2d362e363836323920342e38313938322c2d31392e3638383533202d352c2d3139207a222f3e3c75736520786c696e6b3a687265663d2223616322207472616e73666f726d3d227363616c65282d312c31292c7472616e736c617465282d3134322c3029222f3e3c7061746820643d224d2d313030202d3132346131202e3920302030203020363020302220636c6173733d226c6e727422207472616e73666f726d3d22726f746174652831383029222f3e3c7061746820643d226d313520362031302031326131322e382031322e382030203120312d323020304c313520367a222066696c6c3d226e6f6e6522207374726f6b653d22626c61636b22207374726f6b652d77696474683d223322207472616e73666f726d3d22726f746174652835202d3433322e313732202d38372e37313129222f3e3c656c6c697073652063783d223730222063793d22313134222072783d223138222072793d223234222f3e3c70617468207374726f6b653d22233030302220636c6173733d2274682220643d224d2d342d33302034342d36222f3e3c636972636c652063783d223233222063793d2231322220723d223133222f3e3c70617468207374726f6b653d22233030302220636c6173733d2274682220643d226d3130382d362034382d3234222f3e3c636972636c652063783d22313238222063793d2231322220723d223133222f3e3c7061746820643d224d2d34382c2d3134322061302e392c31203020302c312036302c2d382220636c6173733d226c6e6674207468222f3e3c7061746820643d224d3131362c2d3134362061302e392c31203020302c312036302c31322220636c6173733d226c6e6674207468222f3e3c7061746820636c6173733d226c6e72742220643d226d2d31322031382032352d33366d3020302032352033366d363220302032352d33366d302030203235203336222f3e3c7061746820643d226d3430203131362036302d302220636c6173733d226c6e7274222f3e3c7061746820643d226d313520362031302031326131322e382031322e382030203120312d323020304c313520367a222066696c6c3d222338616622207472616e73666f726d3d22726f746174652835202d3433322e313732202d38372e37313129222f3e3c706174682066696c6c3d2272656422207374726f6b653d2272656422207374726f6b652d77696474683d223722207374726f6b652d6c696e656a6f696e3d22726f756e642220643d226d2d34342d38322032302031352032302d31357633306c2d32302d31352d32302031357a222f3e3c7265637420783d222d33342e352220793d222d37372e35222077696474683d22323122206865696768743d223231222072783d2234222066696c6c3d2272656422207374726f6b653d222366666622207374726f6b652d77696474683d2232222f3e3c7265637420783d2232342220793d222d3138222077696474683d22313622206865696768743d223438222072793d2238222f3e3c7265637420783d223130302220793d222d3138222077696474683d22313622206865696768743d223438222072793d2238222f3e

Deployed Bytecode

0x60806040526004361061019c5760003560e01c8063715018a6116100ec578063b88d4fde1161008a578063e985e9c511610064578063e985e9c5146105a3578063ed5e4e2b146105e0578063f173f78e1461061d578063f2fde38b146106465761019c565b8063b88d4fde14610512578063c87b56dd1461053b578063d5abeb01146105785761019c565b806391b7f5ed116100c657806391b7f5ed1461047957806395d89b41146104a2578063a0712d68146104cd578063a22cb465146104e95761019c565b8063715018a61461040e57806380623444146104255780638da5cb5b1461044e5761019c565b806318160ddd1161015957806342842e0e1161013357806342842e0e1461034257806355f804b31461036b5780636352211e1461039457806370a08231146103d15761019c565b806318160ddd146102d757806323b872dd1461030257806324600fc31461032b5761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b3146102465780630a85202e1461026f5780630e87c971146102ac575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190613f5e565b61066f565b6040516101d59190613fa6565b60405180910390f35b3480156101ea57600080fd5b506101f3610701565b6040516102009190614051565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b91906140a9565b610793565b60405161023d9190614117565b60405180910390f35b34801561025257600080fd5b5061026d6004803603810190610268919061415e565b61080f565b005b34801561027b57600080fd5b50610296600480360381019061029191906141d7565b610950565b6040516102a39190614051565b60405180910390f35b3480156102b857600080fd5b506102c1610b49565b6040516102ce9190614051565b60405180910390f35b3480156102e357600080fd5b506102ec610c57565b6040516102f99190614226565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190614241565b610c6e565b005b34801561033757600080fd5b50610340610f90565b005b34801561034e57600080fd5b5061036960048036038101906103649190614241565b611110565b005b34801561037757600080fd5b50610392600480360381019061038d91906142f9565b611130565b005b3480156103a057600080fd5b506103bb60048036038101906103b691906140a9565b6111c2565b6040516103c89190614117565b60405180910390f35b3480156103dd57600080fd5b506103f860048036038101906103f39190614346565b6111d4565b6040516104059190614226565b60405180910390f35b34801561041a57600080fd5b5061042361128c565b005b34801561043157600080fd5b5061044c600480360381019061044791906140a9565b611314565b005b34801561045a57600080fd5b506104636113f1565b6040516104709190614117565b60405180910390f35b34801561048557600080fd5b506104a0600480360381019061049b91906140a9565b61141a565b005b3480156104ae57600080fd5b506104b76114a0565b6040516104c49190614051565b60405180910390f35b6104e760048036038101906104e291906140a9565b611532565b005b3480156104f557600080fd5b50610510600480360381019061050b919061439f565b6115bf565b005b34801561051e57600080fd5b506105396004803603810190610534919061450f565b611736565b005b34801561054757600080fd5b50610562600480360381019061055d91906140a9565b6117a9565b60405161056f9190614051565b60405180910390f35b34801561058457600080fd5b5061058d611f2a565b60405161059a9190614226565b60405180910390f35b3480156105af57600080fd5b506105ca60048036038101906105c59190614592565b611f34565b6040516105d79190613fa6565b60405180910390f35b3480156105ec57600080fd5b50610607600480360381019061060291906140a9565b611fc8565b6040516106149190614051565b60405180910390f35b34801561062957600080fd5b50610644600480360381019061063f91906140a9565b612160565b005b34801561065257600080fd5b5061066d60048036038101906106689190614346565b6121f5565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106ca57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106fa5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606003805461071090614601565b80601f016020809104026020016040519081016040528092919081815260200182805461073c90614601565b80156107895780601f1061075e57610100808354040283529160200191610789565b820191906000526020600020905b81548152906001019060200180831161076c57829003601f168201915b5050505050905090565b600061079e826122ec565b6107d4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061081a826111c2565b90508073ffffffffffffffffffffffffffffffffffffffff1661083b61234b565b73ffffffffffffffffffffffffffffffffffffffff161461089e576108678161086261234b565b611f34565b61089d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60603373ffffffffffffffffffffffffffffffffffffffff16610972846111c2565b73ffffffffffffffffffffffffffffffffffffffff16146109c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bf906146a4565b60405180910390fd5b60018260ff1614806109dd575060028260ff16145b610a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1390614736565b60405180910390fd5b6000600e846122b88110610a3357610a32614756565b5b602091828204019190069054906101000a900460ff1660ff1603610aa75781600e846122b88110610a6757610a66614756565b5b602091828204019190066101000a81548160ff021916908360ff160217905550604051806060016040528060258152602001615e05602591399050610b43565b60028260ff1603610b085781600e846122b88110610ac857610ac7614756565b5b602091828204019190066101000a81548160ff021916908360ff160217905550604051806060016040528060258152602001615e05602591399050610b43565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3a906147d1565b60405180910390fd5b92915050565b6060610b53612353565b73ffffffffffffffffffffffffffffffffffffffff16610b716113f1565b73ffffffffffffffffffffffffffffffffffffffff1614610bc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbe9061483d565b60405180910390fd5b60011515600c60009054906101000a900460ff16151503610c1d576000600c60006101000a81548160ff021916908315150217905550604051806060016040528060268152602001615f6e602691399050610c54565b6001600c60006101000a81548160ff021916908315150217905550604051806060016040528060228152602001615dc06022913990505b90565b6000610c6161235b565b6002546001540303905090565b6000610c7982612360565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ce0576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610cec8461242c565b91509150610d028187610cfd61234b565b61244e565b610d4e57610d1786610d1261234b565b611f34565b610d4d576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610db4576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610dc18686866001612492565b8015610dcc57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610e9a85610e76888887612498565b7c0200000000000000000000000000000000000000000000000000000000176124c0565b600560008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610f205760006001850190506000600560008381526020019081526020016000205403610f1e576001548114610f1d578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f8886868660016124eb565b505050505050565b610f98612353565b73ffffffffffffffffffffffffffffffffffffffff16610fb66113f1565b73ffffffffffffffffffffffffffffffffffffffff161461100c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110039061483d565b60405180910390fd5b600260095403611051576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611048906148a9565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff164760405161107f906148fa565b60006040518083038185875af1925050503d80600081146110bc576040519150601f19603f3d011682016040523d82523d6000602084013e6110c1565b606091505b5050905080611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc9061495b565b60405180910390fd5b506001600981905550565b61112b83838360405180602001604052806000815250611736565b505050565b611138612353565b73ffffffffffffffffffffffffffffffffffffffff166111566113f1565b73ffffffffffffffffffffffffffffffffffffffff16146111ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a39061483d565b60405180910390fd5b8181600d91826111bd929190614b32565b505050565b60006111cd82612360565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361123b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611294612353565b73ffffffffffffffffffffffffffffffffffffffff166112b26113f1565b73ffffffffffffffffffffffffffffffffffffffff1614611308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ff9061483d565b60405180910390fd5b61131260006124f1565b565b61131c612353565b73ffffffffffffffffffffffffffffffffffffffff1661133a6113f1565b73ffffffffffffffffffffffffffffffffffffffff1614611390576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113879061483d565b60405180910390fd5b611398610c57565b81101580156113a85750600a5481105b6113e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113de90614c4e565b60405180910390fd5b80600a8190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611422612353565b73ffffffffffffffffffffffffffffffffffffffff166114406113f1565b73ffffffffffffffffffffffffffffffffffffffff1614611496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148d9061483d565b60405180910390fd5b80600b8190555050565b6060600480546114af90614601565b80601f01602080910402602001604051908101604052809291908181526020018280546114db90614601565b80156115285780601f106114fd57610100808354040283529160200191611528565b820191906000526020600020905b81548152906001019060200180831161150b57829003601f168201915b5050505050905090565b8061153b610c57565b6115459190614c9d565b600a54101561155357600080fd5b600b811061156057600080fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461159857600080fd5b80600b546115a69190614cd1565b3410156115b257600080fd5b6115bc33826125b5565b50565b6115c761234b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361162b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806008600061163861234b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116e561234b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161172a9190613fa6565b60405180910390a35050565b611741848484610c6e565b60008373ffffffffffffffffffffffffffffffffffffffff163b146117a35761176c84848484612788565b6117a2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600073ffffffffffffffffffffffffffffffffffffffff166117cc836111c2565b73ffffffffffffffffffffffffffffffffffffffff1603611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614d9d565b60405180910390fd5b600061182d836128d8565b9050606060011515610124856122b8811061184b5761184a614756565b5b602091828204019190069054906101000a900460ff161515148015611883575060011515600c60009054906101000a900460ff161515145b156118ba57600d611893856136ab565b6040516020016118a4929190614ec8565b60405160208183030381529060405290506118f0565b6118c382613705565b90506118ce81613c6e565b6040516020016118de9190614f43565b60405160208183030381529060405290505b6118f8613e1e565b604051806060016040528060238152602001615de2602391398160006013811061192557611924614756565b5b602002018190525082602001518160016013811061194657611945614756565b5b6020020181905250604051806060016040528060218152602001615f94602191398160026013811061197b5761197a614756565b5b602002018190525082606001518160036013811061199c5761199b614756565b5b60200201819052506040518060400160405280602081526020017f227d2c7b2274726169745f74797065223a22486174222c2276616c7565223a22815250816004601381106119ee576119ed614756565b5b60200201819052508260a0015181600560138110611a0f57611a0e614756565b5b6020020181905250604051806060016040528060218152602001615c1a6021913981600660138110611a4457611a43614756565b5b60200201819052508260e0015181600760138110611a6557611a64614756565b5b6020020181905250604051806060016040528060228152602001615ec36022913981600860138110611a9a57611a99614756565b5b602002018190525082610160015181600960138110611abc57611abb614756565b5b6020020181905250604051806060016040528060238152602001615ea06023913981600a60138110611af157611af0614756565b5b602002018190525082610120015181600b60138110611b1357611b12614756565b5b6020020181905250604051806060016040528060268152602001615ca26026913981600c60138110611b4857611b47614756565b5b6020020181905250826101a0015181600d60138110611b6a57611b69614756565b5b6020020181905250604051806060016040528060238152602001615e4e6023913981600e60138110611b9f57611b9e614756565b5b6020020181905250826101e0015181600f60138110611bc157611bc0614756565b5b6020020181905250604051806060016040528060248152602001615e2a6024913981601060138110611bf657611bf5614756565b5b602002018190525082610200015181601160138110611c1857611c17614756565b5b60200201819052506040518060400160405280600381526020017f227d5d000000000000000000000000000000000000000000000000000000000081525081601260138110611c6a57611c69614756565b5b6020020181905250600081600060138110611c8857611c87614756565b5b602002015182600160138110611ca157611ca0614756565b5b602002015183600260138110611cba57611cb9614756565b5b602002015184600360138110611cd357611cd2614756565b5b602002015185600460138110611cec57611ceb614756565b5b602002015186600560138110611d0557611d04614756565b5b602002015187600660138110611d1e57611d1d614756565b5b602002015188600760138110611d3757611d36614756565b5b602002015189600860138110611d5057611d4f614756565b5b6020020151604051602001611d6d99989796959493929190614f65565b60405160208183030381529060405290508082600960138110611d9357611d92614756565b5b602002015183600a60138110611dac57611dab614756565b5b602002015184600b60138110611dc557611dc4614756565b5b602002015185600c60138110611dde57611ddd614756565b5b602002015186600d60138110611df757611df6614756565b5b602002015187600e60138110611e1057611e0f614756565b5b602002015188600f60138110611e2957611e28614756565b5b602002015189601060138110611e4257611e41614756565b5b60200201518a601160138110611e5b57611e5a614756565b5b60200201518b601260138110611e7457611e73614756565b5b6020020151604051602001611e939b9a99989796959493929190614fe4565b6040516020818303038152906040529050611ead866136ab565b81604051602001611ebf929190615161565b6040516020818303038152906040529050611efa8184604051602001611ee6929190615233565b604051602081830303815290604052613c6e565b905080604051602001611f0d91906152b9565b604051602081830303815290604052925082945050505050919050565b6000600a54905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60603373ffffffffffffffffffffffffffffffffffffffff16611fea836111c2565b73ffffffffffffffffffffffffffffffffffffffff1614612040576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612037906146a4565b60405180910390fd5b60011515610124836122b8811061205a57612059614756565b5b602091828204019190069054906101000a900460ff161515036120eb576000610124836122b8811061208f5761208e614756565b5b602091828204019190066101000a81548160ff0219169083151502179055506040518060400160405280601781526020017f546f67676c656420746f206f6e2d636861696e20535647000000000000000000815250905061215b565b6001610124836122b8811061210357612102614756565b5b602091828204019190066101000a81548160ff0219169083151502179055506040518060400160405280601881526020017f546f67676c656420746f206f66662d636861696e20504e47000000000000000081525090505b919050565b612168612353565b73ffffffffffffffffffffffffffffffffffffffff166121866113f1565b73ffffffffffffffffffffffffffffffffffffffff16146121dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d39061483d565b60405180910390fd5b6000600a54146121eb57600080fd5b80600a8190555050565b6121fd612353565b73ffffffffffffffffffffffffffffffffffffffff1661221b6113f1565b73ffffffffffffffffffffffffffffffffffffffff1614612271576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122689061483d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036122e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d79061534d565b60405180910390fd5b6122e9816124f1565b50565b6000816122f761235b565b11158015612306575060015482105b8015612344575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600033905090565b600090565b6000808290508061236f61235b565b116123f5576001548110156123f45760006005600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036123f2575b600081036123e85760056000836001900393508381526020019081526020016000205490506123be565b8092505050612427565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600790508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86124af868684613e05565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612622576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000820361265c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126696000848385612492565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506126e0836126d16000866000612498565b6126da85613e0e565b176124c0565b60056000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106127045780600181905550505061278360008483856124eb565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127ae61234b565b8786866040518563ffffffff1660e01b81526004016127d094939291906153c2565b6020604051808303816000875af192505050801561280c57506040513d601f19601f820116820180604052508101906128099190615423565b60015b612885573d806000811461283c576040519150601f19603f3d011682016040523d82523d6000602084013e612841565b606091505b50600081510361287d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6128e0613e46565b6128e8613e46565b6000600884306040516020016128ff929190615505565b6040516020818303038152906040528051906020012060001c612922919061556b565b9050610242816008811061293957612938614756565b5b01805461294590614601565b80601f016020809104026020016040519081016040528092919081815260200182805461297190614601565b80156129be5780601f10612993576101008083540402835291602001916129be565b820191906000526020600020905b8154815290600101906020018083116129a157829003601f168201915b5050505050826020018190525061023a81600881106129e0576129df614756565b5b0180546129ec90614601565b80601f0160208091040260200160405190810160405280929190818152602001828054612a1890614601565b8015612a655780601f10612a3a57610100808354040283529160200191612a65565b820191906000526020600020905b815481529060010190602001808311612a4857829003601f168201915b50505050508260000181905250600a8430604051602001612a879291906155e8565b6040516020818303038152906040528051906020012060001c612aaa919061556b565b905060038110612ab957600090505b61024a8160038110612ace57612acd614756565b5b018054612ada90614601565b80601f0160208091040260200160405190810160405280929190818152602001828054612b0690614601565b8015612b535780601f10612b2857610100808354040283529160200191612b53565b820191906000526020600020905b815481529060010190602001808311612b3657829003601f168201915b5050505050826040018190525061024d8160038110612b7557612b74614756565b5b018054612b8190614601565b80601f0160208091040260200160405190810160405280929190818152602001828054612bad90614601565b8015612bfa5780601f10612bcf57610100808354040283529160200191612bfa565b820191906000526020600020905b815481529060010190602001808311612bdd57829003601f168201915b50505050508260600181905250600c8430604051602001612c1c92919061566b565b6040516020818303038152906040528051906020012060001c612c3f919061556b565b905060048110612c4e57600090505b6102508160048110612c6357612c62614756565b5b018054612c6f90614601565b80601f0160208091040260200160405190810160405280929190818152602001828054612c9b90614601565b8015612ce85780601f10612cbd57610100808354040283529160200191612ce8565b820191906000526020600020905b815481529060010190602001808311612ccb57829003601f168201915b505050505082608001819052506102548160048110612d0a57612d09614756565b5b018054612d1690614601565b80601f0160208091040260200160405190810160405280929190818152602001828054612d4290614601565b8015612d8f5780601f10612d6457610100808354040283529160200191612d8f565b820191906000526020600020905b815481529060010190602001808311612d7257829003601f168201915b50505050508260a00181905250600b8430604051602001612db19291906156ee565b6040516020818303038152906040528051906020012060001c612dd4919061556b565b905061025881600b8110612deb57612dea614756565b5b018054612df790614601565b80601f0160208091040260200160405190810160405280929190818152602001828054612e2390614601565b8015612e705780601f10612e4557610100808354040283529160200191612e70565b820191906000526020600020905b815481529060010190602001808311612e5357829003601f168201915b50505050508260c0018190525061026381600b8110612e9257612e91614756565b5b018054612e9e90614601565b80601f0160208091040260200160405190810160405280929190818152602001828054612eca90614601565b8015612f175780601f10612eec57610100808354040283529160200191612f17565b820191906000526020600020905b815481529060010190602001808311612efa57829003601f168201915b50505050508260e0018190525060308430604051602001612f39929190615771565b6040516020818303038152906040528051906020012060001c612f5c919061556b565b905060058110612f6b57600090505b61026e8160058110612f8057612f7f614756565b5b018054612f8c90614601565b80601f0160208091040260200160405190810160405280929190818152602001828054612fb890614601565b80156130055780601f10612fda57610100808354040283529160200191613005565b820191906000526020600020905b815481529060010190602001808311612fe857829003601f168201915b5050505050826101000181905250610273816005811061302857613027614756565b5b01805461303490614601565b80601f016020809104026020016040519081016040528092919081815260200182805461306090614601565b80156130ad5780601f10613082576101008083540402835291602001916130ad565b820191906000526020600020905b81548152906001019060200180831161309057829003601f168201915b5050505050826101200181905250600984306040516020016130d09291906157f4565b6040516020818303038152906040528051906020012060001c6130f3919061556b565b9050610278816009811061310a57613109614756565b5b01805461311690614601565b80601f016020809104026020016040519081016040528092919081815260200182805461314290614601565b801561318f5780601f106131645761010080835404028352916020019161318f565b820191906000526020600020905b81548152906001019060200180831161317257829003601f168201915b505050505082610140018190525061028181600981106131b2576131b1614756565b5b0180546131be90614601565b80601f01602080910402602001604051908101604052809291908181526020018280546131ea90614601565b80156132375780601f1061320c57610100808354040283529160200191613237565b820191906000526020600020905b81548152906001019060200180831161321a57829003601f168201915b5050505050826101600181905250603c843060405160200161325a929190615877565b6040516020818303038152906040528051906020012060001c61327d919061556b565b90506005811061328c57600090505b61028a81600581106132a1576132a0614756565b5b0180546132ad90614601565b80601f01602080910402602001604051908101604052809291908181526020018280546132d990614601565b80156133265780601f106132fb57610100808354040283529160200191613326565b820191906000526020600020905b81548152906001019060200180831161330957829003601f168201915b505050505082610180018190525061028f816005811061334957613348614756565b5b01805461335590614601565b80601f016020809104026020016040519081016040528092919081815260200182805461338190614601565b80156133ce5780601f106133a3576101008083540402835291602001916133ce565b820191906000526020600020905b8154815290600101906020018083116133b157829003601f168201915b5050505050826101a00181905250606484306040516020016133f19291906158fa565b6040516020818303038152906040528051906020012060001c613414919061556b565b90506003811061342357600090505b610294816003811061343857613437614756565b5b01805461344490614601565b80601f016020809104026020016040519081016040528092919081815260200182805461347090614601565b80156134bd5780601f10613492576101008083540402835291602001916134bd565b820191906000526020600020905b8154815290600101906020018083116134a057829003601f168201915b5050505050826101c0018190525061029781600381106134e0576134df614756565b5b0180546134ec90614601565b80601f016020809104026020016040519081016040528092919081815260200182805461351890614601565b80156135655780601f1061353a57610100808354040283529160200191613565565b820191906000526020600020905b81548152906001019060200180831161354857829003601f168201915b5050505050826101e001819052506040518060400160405280600381526020017f43433000000000000000000000000000000000000000000000000000000000008152508261020001819052506000600e856122b881106135c9576135c8614756565b5b602091828204019190069054906101000a900460ff1660ff160361362b576040518060400160405280600381526020017f41525200000000000000000000000000000000000000000000000000000000008152508261020001819052506136a1565b6001600e856122b8811061364257613641614756565b5b602091828204019190069054906101000a900460ff1660ff16036136a0576040518060400160405280600881526020017f43432042592d4e430000000000000000000000000000000000000000000000008152508261020001819052505b5b8192505050919050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156136f157600183039250600a81066030018353600a810490506136d1565b508181036020830392508083525050919050565b606061370f613eca565b60006040518060200160405280600081525090506000846101c0015151111561375a57836101e0015160405160200161374891906159c9565b60405160208183030381529060405290505b6040518060c0016040528060828152602001615b26608291398260006011811061378757613786614756565b5b60200201819052506040518060c0016040528060898152602001615ee560899139826001601181106137bc576137bb614756565b5b60200201819052506040518060e0016040528060b88152602001615cc860b89139826002601181106137f1576137f0614756565b5b6020020181905250836101c001518260036011811061381357613812614756565b5b60200201819052506040518060600160405280602f8152602001615e71602f91398260046011811061384857613847614756565b5b602002018190525083600001518260056011811061386957613868614756565b5b60200201819052506040518060400160405280600f81526020017f272f3e3c672069643d2763687562270000000000000000000000000000000000815250826006601181106138bb576138ba614756565b5b602002018190525080826007601181106138d8576138d7614756565b5b60200201819052506040518060a0016040528060678152602001615c3b606791398260086011811061390d5761390c614756565b5b60200201819052506040518060a0016040528060728152602001615ba8607291398260096011811061394257613941614756565b5b6020020181905250836040015182600a6011811061396357613962614756565b5b6020020181905250836080015182600b6011811061398457613983614756565b5b60200201819052508360c0015182600c601181106139a5576139a4614756565b5b602002018190525083610140015182600d601181106139c7576139c6614756565b5b602002018190525083610100015182600e601181106139e9576139e8614756565b5b602002018190525083610180015182600f60118110613a0b57613a0a614756565b5b60200201819052506040518060400160405280600e81526020017f3c2f673e3c2f673e3c2f7376673e00000000000000000000000000000000000081525082601060118110613a5d57613a5c614756565b5b6020020181905250600082600060118110613a7b57613a7a614756565b5b602002015183600160118110613a9457613a93614756565b5b602002015184600260118110613aad57613aac614756565b5b602002015185600360118110613ac657613ac5614756565b5b602002015186600460118110613adf57613ade614756565b5b602002015187600560118110613af857613af7614756565b5b602002015188600660118110613b1157613b10614756565b5b602002015189600760118110613b2a57613b29614756565b5b6020020151604051602001613b469897969594939291906159f6565b60405160208183030381529060405290508083600860118110613b6c57613b6b614756565b5b602002015184600960118110613b8557613b84614756565b5b602002015185600a60118110613b9e57613b9d614756565b5b602002015186600b60118110613bb757613bb6614756565b5b602002015187600c60118110613bd057613bcf614756565b5b602002015188600d60118110613be957613be8614756565b5b602002015189600e60118110613c0257613c01614756565b5b60200201518a600f60118110613c1b57613c1a614756565b5b60200201518b601060118110613c3457613c33614756565b5b6020020151604051602001613c529a99989796959493929190615a68565b6040516020818303038152906040529050809350505050919050565b606060008251905060008103613c965760405180602001604052806000815250915050613e00565b60006003600283613ca79190614c9d565b613cb19190615af4565b6004613cbd9190614cd1565b90506000602082613cce9190614c9d565b67ffffffffffffffff811115613ce757613ce66143e4565b5b6040519080825280601f01601f191660200182016040528015613d195781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001615d80604091399050600181016020830160005b86811015613dbd5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050613d44565b506003860660018114613dd75760028114613de757613df2565b613d3d60f01b6002830352613df2565b603d60f81b60018303525b508484525050819450505050505b919050565b60009392505050565b60006001821460e11b9050919050565b6040518061026001604052806013905b6060815260200190600190039081613e2e5790505090565b60405180610220016040528060608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081525090565b6040518061022001604052806011905b6060815260200190600190039081613eda5790505090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613f3b81613f06565b8114613f4657600080fd5b50565b600081359050613f5881613f32565b92915050565b600060208284031215613f7457613f73613efc565b5b6000613f8284828501613f49565b91505092915050565b60008115159050919050565b613fa081613f8b565b82525050565b6000602082019050613fbb6000830184613f97565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ffb578082015181840152602081019050613fe0565b60008484015250505050565b6000601f19601f8301169050919050565b600061402382613fc1565b61402d8185613fcc565b935061403d818560208601613fdd565b61404681614007565b840191505092915050565b6000602082019050818103600083015261406b8184614018565b905092915050565b6000819050919050565b61408681614073565b811461409157600080fd5b50565b6000813590506140a38161407d565b92915050565b6000602082840312156140bf576140be613efc565b5b60006140cd84828501614094565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614101826140d6565b9050919050565b614111816140f6565b82525050565b600060208201905061412c6000830184614108565b92915050565b61413b816140f6565b811461414657600080fd5b50565b60008135905061415881614132565b92915050565b6000806040838503121561417557614174613efc565b5b600061418385828601614149565b925050602061419485828601614094565b9150509250929050565b600060ff82169050919050565b6141b48161419e565b81146141bf57600080fd5b50565b6000813590506141d1816141ab565b92915050565b600080604083850312156141ee576141ed613efc565b5b60006141fc85828601614094565b925050602061420d858286016141c2565b9150509250929050565b61422081614073565b82525050565b600060208201905061423b6000830184614217565b92915050565b60008060006060848603121561425a57614259613efc565b5b600061426886828701614149565b935050602061427986828701614149565b925050604061428a86828701614094565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f8401126142b9576142b8614294565b5b8235905067ffffffffffffffff8111156142d6576142d5614299565b5b6020830191508360018202830111156142f2576142f161429e565b5b9250929050565b600080602083850312156143105761430f613efc565b5b600083013567ffffffffffffffff81111561432e5761432d613f01565b5b61433a858286016142a3565b92509250509250929050565b60006020828403121561435c5761435b613efc565b5b600061436a84828501614149565b91505092915050565b61437c81613f8b565b811461438757600080fd5b50565b60008135905061439981614373565b92915050565b600080604083850312156143b6576143b5613efc565b5b60006143c485828601614149565b92505060206143d58582860161438a565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61441c82614007565b810181811067ffffffffffffffff8211171561443b5761443a6143e4565b5b80604052505050565b600061444e613ef2565b905061445a8282614413565b919050565b600067ffffffffffffffff82111561447a576144796143e4565b5b61448382614007565b9050602081019050919050565b82818337600083830152505050565b60006144b26144ad8461445f565b614444565b9050828152602081018484840111156144ce576144cd6143df565b5b6144d9848285614490565b509392505050565b600082601f8301126144f6576144f5614294565b5b813561450684826020860161449f565b91505092915050565b6000806000806080858703121561452957614528613efc565b5b600061453787828801614149565b945050602061454887828801614149565b935050604061455987828801614094565b925050606085013567ffffffffffffffff81111561457a57614579613f01565b5b614586878288016144e1565b91505092959194509250565b600080604083850312156145a9576145a8613efc565b5b60006145b785828601614149565b92505060206145c885828601614149565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061461957607f821691505b60208210810361462c5761462b6145d2565b5b50919050565b7f4f6e6c7920746865206f776e6572206f66207468697320746f6b656e2063616e60008201527f20706572666f726d207468697320616374696f6e000000000000000000000000602082015250565b600061468e603483613fcc565b915061469982614632565b604082019050919050565b600060208201905081810360008301526146bd81614681565b9050919050565b7f416c6c6f7765642076616c75657320666f72206c6576656c2063616e206f6e6c60008201527f792062652031206f722032000000000000000000000000000000000000000000602082015250565b6000614720602b83613fcc565b915061472b826146c4565b604082019050919050565b6000602082019050818103600083015261474f81614713565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4c6963656e7365206c6576656c20776173206e6f74206368616e676564000000600082015250565b60006147bb601d83613fcc565b91506147c682614785565b602082019050919050565b600060208201905081810360008301526147ea816147ae565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614827602083613fcc565b9150614832826147f1565b602082019050919050565b600060208201905081810360008301526148568161481a565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614893601f83613fcc565b915061489e8261485d565b602082019050919050565b600060208201905081810360008301526148c281614886565b9050919050565b600081905092915050565b50565b60006148e46000836148c9565b91506148ef826148d4565b600082019050919050565b6000614905826148d7565b9150819050919050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614945600f83613fcc565b91506149508261490f565b602082019050919050565b6000602082019050818103600083015261497481614938565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026149e87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826149ab565b6149f286836149ab565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614a2f614a2a614a2584614073565b614a0a565b614073565b9050919050565b6000819050919050565b614a4983614a14565b614a5d614a5582614a36565b8484546149b8565b825550505050565b600090565b614a72614a65565b614a7d818484614a40565b505050565b5b81811015614aa157614a96600082614a6a565b600181019050614a83565b5050565b601f821115614ae657614ab781614986565b614ac08461499b565b81016020851015614acf578190505b614ae3614adb8561499b565b830182614a82565b50505b505050565b600082821c905092915050565b6000614b0960001984600802614aeb565b1980831691505092915050565b6000614b228383614af8565b9150826002028217905092915050565b614b3c838361497b565b67ffffffffffffffff811115614b5557614b546143e4565b5b614b5f8254614601565b614b6a828285614aa5565b6000601f831160018114614b995760008415614b87578287013590505b614b918582614b16565b865550614bf9565b601f198416614ba786614986565b60005b82811015614bcf57848901358255600182019150602085019450602081019050614baa565b86831015614bec5784890135614be8601f891682614af8565b8355505b6001600288020188555050505b50505050505050565b7f56616c7565206e6f7420696e20726571756972656420626f756e647300000000600082015250565b6000614c38601c83613fcc565b9150614c4382614c02565b602082019050919050565b60006020820190508181036000830152614c6781614c2b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614ca882614073565b9150614cb383614073565b9250828201905080821115614ccb57614cca614c6e565b5b92915050565b6000614cdc82614073565b9150614ce783614073565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d2057614d1f614c6e565b5b828202905092915050565b7f4552433732313a20746f6b656e55524920717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614d87602c83613fcc565b9150614d9282614d2b565b604082019050919050565b60006020820190508181036000830152614db681614d7a565b9050919050565b600081905092915050565b60008154614dd581614601565b614ddf8186614dbd565b94506001821660008114614dfa5760018114614e0f57614e42565b60ff1983168652811515820286019350614e42565b614e1885614986565b60005b83811015614e3a57815481890152600182019150602081019050614e1b565b838801955050505b50505092915050565b6000614e5682613fc1565b614e608185614dbd565b9350614e70818560208601613fdd565b80840191505092915050565b7f2e706e6700000000000000000000000000000000000000000000000000000000600082015250565b6000614eb2600483614dbd565b9150614ebd82614e7c565b600482019050919050565b6000614ed48285614dc8565b9150614ee08284614e4b565b9150614eeb82614ea5565b91508190509392505050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000600082015250565b6000614f2d601a83614dbd565b9150614f3882614ef7565b601a82019050919050565b6000614f4e82614f20565b9150614f5a8284614e4b565b915081905092915050565b6000614f71828c614e4b565b9150614f7d828b614e4b565b9150614f89828a614e4b565b9150614f958289614e4b565b9150614fa18288614e4b565b9150614fad8287614e4b565b9150614fb98286614e4b565b9150614fc58285614e4b565b9150614fd18284614e4b565b91508190509a9950505050505050505050565b6000614ff0828e614e4b565b9150614ffc828d614e4b565b9150615008828c614e4b565b9150615014828b614e4b565b9150615020828a614e4b565b915061502c8289614e4b565b91506150388288614e4b565b91506150448287614e4b565b91506150508286614e4b565b915061505c8285614e4b565b91506150688284614e4b565b91508190509c9b505050505050505050505050565b7f7b226e616d65223a22436875626c696e20230000000000000000000000000000600082015250565b60006150b3601283614dbd565b91506150be8261507d565b601282019050919050565b7f222c20226465736372697074696f6e223a224120436875626c696e20626f726e60008201527f206f662074686520626c6f636b636861696e2e222c226174747269627574657360208201527f223a000000000000000000000000000000000000000000000000000000000000604082015250565b600061514b604283614dbd565b9150615156826150c9565b604282019050919050565b600061516c826150a6565b91506151788285614e4b565b91506151838261513e565b915061518f8284614e4b565b91508190509392505050565b7f2c2022696d616765223a22000000000000000000000000000000000000000000600082015250565b60006151d1600b83614dbd565b91506151dc8261519b565b600b82019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b600061521d600283614dbd565b9150615228826151e7565b600282019050919050565b600061523f8285614e4b565b915061524a826151c4565b91506152568284614e4b565b915061526182615210565b91508190509392505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b60006152a3601d83614dbd565b91506152ae8261526d565b601d82019050919050565b60006152c482615296565b91506152d08284614e4b565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615337602683613fcc565b9150615342826152db565b604082019050919050565b600060208201905081810360008301526153668161532a565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006153948261536d565b61539e8185615378565b93506153ae818560208601613fdd565b6153b781614007565b840191505092915050565b60006080820190506153d76000830187614108565b6153e46020830186614108565b6153f16040830185614217565b81810360608301526154038184615389565b905095945050505050565b60008151905061541d81613f32565b92915050565b60006020828403121561543957615438613efc565b5b60006154478482850161540e565b91505092915050565b6000819050919050565b61546b61546682614073565b615450565b82525050565b60008160601b9050919050565b600061548982615471565b9050919050565b600061549b8261547e565b9050919050565b6154b36154ae826140f6565b615490565b82525050565b7f3400000000000000000000000000000000000000000000000000000000000000600082015250565b60006154ef600183614dbd565b91506154fa826154b9565b600182019050919050565b6000615511828561545a565b60208201915061552182846154a2565b601482019150615530826154e2565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061557682614073565b915061558183614073565b9250826155915761559061553c565b5b828206905092915050565b7f3500000000000000000000000000000000000000000000000000000000000000600082015250565b60006155d2600183614dbd565b91506155dd8261559c565b600182019050919050565b60006155f4828561545a565b60208201915061560482846154a2565b601482019150615613826155c5565b91508190509392505050565b7f3600000000000000000000000000000000000000000000000000000000000000600082015250565b6000615655600183614dbd565b91506156608261561f565b600182019050919050565b6000615677828561545a565b60208201915061568782846154a2565b60148201915061569682615648565b91508190509392505050565b7f3700000000000000000000000000000000000000000000000000000000000000600082015250565b60006156d8600183614dbd565b91506156e3826156a2565b600182019050919050565b60006156fa828561545a565b60208201915061570a82846154a2565b601482019150615719826156cb565b91508190509392505050565b7f3800000000000000000000000000000000000000000000000000000000000000600082015250565b600061575b600183614dbd565b915061576682615725565b600182019050919050565b600061577d828561545a565b60208201915061578d82846154a2565b60148201915061579c8261574e565b91508190509392505050565b7f3900000000000000000000000000000000000000000000000000000000000000600082015250565b60006157de600183614dbd565b91506157e9826157a8565b600182019050919050565b6000615800828561545a565b60208201915061581082846154a2565b60148201915061581f826157d1565b91508190509392505050565b7f3000000000000000000000000000000000000000000000000000000000000000600082015250565b6000615861600183614dbd565b915061586c8261582b565b600182019050919050565b6000615883828561545a565b60208201915061589382846154a2565b6014820191506158a282615854565b91508190509392505050565b7f3300000000000000000000000000000000000000000000000000000000000000600082015250565b60006158e4600183614dbd565b91506158ef826158ae565b600182019050919050565b6000615906828561545a565b60208201915061591682846154a2565b601482019150615925826158d7565b91508190509392505050565b7f2066696c7465723d2775726c2823000000000000000000000000000000000000600082015250565b6000615967600e83614dbd565b915061597282615931565b600e82019050919050565b7f2927000000000000000000000000000000000000000000000000000000000000600082015250565b60006159b3600283614dbd565b91506159be8261597d565b600282019050919050565b60006159d48261595a565b91506159e08284614e4b565b91506159eb826159a6565b915081905092915050565b6000615a02828b614e4b565b9150615a0e828a614e4b565b9150615a1a8289614e4b565b9150615a268288614e4b565b9150615a328287614e4b565b9150615a3e8286614e4b565b9150615a4a8285614e4b565b9150615a568284614e4b565b91508190509998505050505050505050565b6000615a74828d614e4b565b9150615a80828c614e4b565b9150615a8c828b614e4b565b9150615a98828a614e4b565b9150615aa48289614e4b565b9150615ab08288614e4b565b9150615abc8287614e4b565b9150615ac88286614e4b565b9150615ad48285614e4b565b9150615ae08284614e4b565b91508190509b9a5050505050505050505050565b6000615aff82614073565b9150615b0a83614073565b925082615b1a57615b1961553c565b5b82820490509291505056fe3c7376672077696474683d2736303027206865696768743d27363030272076696577426f783d2730203020363030203630302720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f7376672720786d6c6e733a786c696e6b3d27687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b273e3c656c6c697073652063783d27333030272063793d27313430272072783d27313630272072793d273530272066696c6c3d2723463846344634272f3e3c672069643d276661636527207472616e73666f726d3d27726f74617465282d3520333432322e333335202d323831392e343929273e227d2c7b2274726169745f74797065223a2245796573222c2276616c7565223a223e3c656c6c697073652063783d27333030272063793d27343630272072783d27313630272072793d273530272066696c6c3d2723666666272f3e3c706174682066696c6c3d27236666662720643d274d313430203134306833323076333230483134307a272f3e227d2c7b2274726169745f74797065223a224163636573736f7279222c2276616c7565223a222e74687b7374726f6b652d77696474683a31327d2e746e7b7374726f6b652d77696474683a347d2e776c72747b7374726f6b653a236666663b7374726f6b652d77696474683a337d746578747b666f6e742d66616d696c793a27436f6d69632053616e73204d53272c27436f6d69632053616e73272c274368616c6b626f617264205345272c27436f6d6963204e657565272c637572736976653b666f6e742d73697a653a313270747d3c2f7374796c653e3c646566733e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f496e6469636174696e67207468617420504e47732061726520617661696c61626c655b7b2274726169745f74797065223a22424720436f6c6f72222c2276616c7565223a224c6963656e7365206c6576656c2077617320726169736564207375636365737366756c6c79227d2c7b2274726169745f74797065223a224c6963656e7365222c2276616c7565223a22227d2c7b2274726169745f74797065223a2246696c746572222c2276616c7565223a223c2f646566733e3c726563742077696474683d273130302527206865696768743d2731303025272066696c6c3d2723227d2c7b2274726169745f74797065223a22436865656b73222c2276616c7565223a22227d2c7b2274726169745f74797065223a224d6f757468222c2276616c7565223a223c7374796c653e2e6c6e66742c2e6c6e72747b7374726f6b653a233030303b7374726f6b652d6c696e656361703a726f756e647d2e6c6e66747b66696c6c3a677261793b7374726f6b652d77696474683a383b7d2e6c6e72747b66696c6c3a6e6f6e653b7374726f6b652d77696474683a373b7374726f6b652d6c696e656a6f696e3a62657a656c7d496e6469636174696e67207468617420504e477320617265206e6f7420617661696c61626c65227d2c7b2274726169745f74797065223a2245617273222c2276616c7565223a22a2646970667358221220345938aad35acbd137cb017dc2378af2585fb233a2fb73a83137992de37a187364736f6c63430008100033

Deployed Bytecode Sourcemap

60118:17914:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14712:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20359:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22305:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21853:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77268:761;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76523:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13766;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31570:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76325:190;;;;;;;;;;;;;:::i;:::-;;23195:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76211:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20148:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15391:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47158:94;;;;;;;;;;;;;:::i;:::-;;75806:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46507:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76001:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20528:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60934:313;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22581:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23451:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73468:2235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75711:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22960:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76846:414;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60793:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47407:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14712:615;14797:4;15112:10;15097:25;;:11;:25;;;;:102;;;;15189:10;15174:25;;:11;:25;;;;15097:102;:179;;;;15266:10;15251:25;;:11;:25;;;;15097:179;15077:199;;14712:615;;;:::o;20359:100::-;20413:13;20446:5;20439:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20359:100;:::o;22305:204::-;22373:7;22398:16;22406:7;22398;:16::i;:::-;22393:64;;22423:34;;;;;;;;;;;;;;22393:64;22477:15;:24;22493:7;22477:24;;;;;;;;;;;;;;;;;;;;;22470:31;;22305:204;;;:::o;21853:386::-;21926:13;21942:16;21950:7;21942;:16::i;:::-;21926:32;;21998:5;21975:28;;:19;:17;:19::i;:::-;:28;;;21971:175;;22023:44;22040:5;22047:19;:17;:19::i;:::-;22023:16;:44::i;:::-;22018:128;;22095:35;;;;;;;;;;;;;;22018:128;21971:175;22185:2;22158:15;:24;22174:7;22158:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;22223:7;22219:2;22203:28;;22212:5;22203:28;;;;;;;;;;;;21915:324;21853:386;;:::o;77268:761::-;77336:13;77389:10;77369:30;;:16;77377:7;77369;:16::i;:::-;:30;;;77361:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;77484:1;77475:5;:10;;;:22;;;;77496:1;77489:5;:8;;;77475:22;77467:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;77581:1;77559:9;77569:7;77559:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:23;;;77556:416;;77684:5;77663:9;77673:7;77663:18;;;;;;;:::i;:::-;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;77704:47;;;;;;;;;;;;;;;;;;;;;77556:416;77790:1;77781:5;:10;;;77778:194;;77893:5;77872:9;77882:7;77872:18;;;;;;;:::i;:::-;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;77913:47;;;;;;;;;;;;;;;;;;;;;77778:194;77982:39;;;;;;;;;;:::i;:::-;;;;;;;;77268:761;;;;;:::o;76523:315::-;76579:13;46738:12;:10;:12::i;:::-;46727:23;;:7;:5;:7::i;:::-;:23;;;46719:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76626:4:::1;76608:22;;:14;;;;;;;;;;;:22;;::::0;76605:139:::1;;76664:5;76647:14;;:22;;;;;;;;;;;;;;;;;;76684:48;;;;;;;;;;;;;;;;;;;;;76605:139;76771:4;76754:14;;:21;;;;;;;;;;;;;;;;;;76786:44;;;;;;;;;;;;;;;;;;;46798:1;76523:315:::0;:::o;13766:::-;13819:7;14047:15;:13;:15::i;:::-;14032:12;;14016:13;;:28;:46;14009:53;;13766:315;:::o;31570:2800::-;31704:27;31734;31753:7;31734:18;:27::i;:::-;31704:57;;31819:4;31778:45;;31794:19;31778:45;;;31774:86;;31832:28;;;;;;;;;;;;;;31774:86;31874:27;31903:23;31930:28;31950:7;31930:19;:28::i;:::-;31873:85;;;;32058:62;32077:15;32094:4;32100:19;:17;:19::i;:::-;32058:18;:62::i;:::-;32053:174;;32140:43;32157:4;32163:19;:17;:19::i;:::-;32140:16;:43::i;:::-;32135:92;;32192:35;;;;;;;;;;;;;;32135:92;32053:174;32258:1;32244:16;;:2;:16;;;32240:52;;32269:23;;;;;;;;;;;;;;32240:52;32305:43;32327:4;32333:2;32337:7;32346:1;32305:21;:43::i;:::-;32441:15;32438:160;;;32581:1;32560:19;32553:30;32438:160;32976:18;:24;32995:4;32976:24;;;;;;;;;;;;;;;;32974:26;;;;;;;;;;;;33045:18;:22;33064:2;33045:22;;;;;;;;;;;;;;;;33043:24;;;;;;;;;;;33367:145;33404:2;33452:45;33467:4;33473:2;33477:19;33452:14;:45::i;:::-;10994:8;33425:72;33367:18;:145::i;:::-;33338:17;:26;33356:7;33338:26;;;;;;;;;;;:174;;;;33682:1;10994:8;33632:19;:46;:51;33628:626;;33704:19;33736:1;33726:7;:11;33704:33;;33893:1;33859:17;:30;33877:11;33859:30;;;;;;;;;;;;:35;33855:384;;33997:13;;33982:11;:28;33978:242;;34177:19;34144:17;:30;34162:11;34144:30;;;;;;;;;;;:52;;;;33978:242;33855:384;33685:569;33628:626;34301:7;34297:2;34282:27;;34291:4;34282:27;;;;;;;;;;;;34320:42;34341:4;34347:2;34351:7;34360:1;34320:20;:42::i;:::-;31693:2677;;;31570:2800;;;:::o;76325:190::-;46738:12;:10;:12::i;:::-;46727:23;;:7;:5;:7::i;:::-;:23;;;46719:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49438:1:::1;50034:7;;:19:::0;50026:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;49438:1;50167:7;:18;;;;76394:12:::2;76412:10;:15;;76435:21;76412:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76393:68;;;76480:7;76472:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;76382:133;49394:1:::1;50346:7;:22;;;;76325:190::o:0;23195:185::-;23333:39;23350:4;23356:2;23360:7;23333:39;;;;;;;;;;;;:16;:39::i;:::-;23195:185;;;:::o;76211:106::-;46738:12;:10;:12::i;:::-;46727:23;;:7;:5;:7::i;:::-;:23;;;46719:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76302:7:::1;;76286:13;:23;;;;;;;:::i;:::-;;76211:106:::0;;:::o;20148:144::-;20212:7;20255:27;20274:7;20255:18;:27::i;:::-;20232:52;;20148:144;;;:::o;15391:224::-;15455:7;15496:1;15479:19;;:5;:19;;;15475:60;;15507:28;;;;;;;;;;;;;;15475:60;9946:13;15553:18;:25;15572:5;15553:25;;;;;;;;;;;;;;;;:54;15546:61;;15391:224;;;:::o;47158:94::-;46738:12;:10;:12::i;:::-;46727:23;;:7;:5;:7::i;:::-;:23;;;46719:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47223:21:::1;47241:1;47223:9;:21::i;:::-;47158:94::o:0;75806:187::-;46738:12;:10;:12::i;:::-;46727:23;;:7;:5;:7::i;:::-;:23;;;46719:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75888:13:::1;:11;:13::i;:::-;75879:5;:22;;:44;;;;;75913:10;;75905:5;:18;75879:44;75871:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;75980:5;75967:10;:18;;;;75806:187:::0;:::o;46507:87::-;46553:7;46580:6;;;;;;;;;;;46573:13;;46507:87;:::o;76001:80::-;46738:12;:10;:12::i;:::-;46727:23;;:7;:5;:7::i;:::-;:23;;;46719:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76070:5:::1;76057:10;:18;;;;76001:80:::0;:::o;20528:104::-;20584:13;20617:7;20610:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20528:104;:::o;60934:313::-;61033:8;61017:13;:11;:13::i;:::-;:24;;;;:::i;:::-;61002:10;;:40;;60994:49;;;;;;61073:2;61062:8;:13;61054:22;;;;;;61134:9;61122:21;;:10;:21;;;61114:30;;;;;;61191:8;61178:10;;:21;;;;:::i;:::-;61164:9;:36;;61156:45;;;;;;61212:27;61218:10;61230:8;61212:5;:27::i;:::-;60934:313;:::o;22581:308::-;22692:19;:17;:19::i;:::-;22680:31;;:8;:31;;;22676:61;;22720:17;;;;;;;;;;;;;;22676:61;22802:8;22750:18;:39;22769:19;:17;:19::i;:::-;22750:39;;;;;;;;;;;;;;;:49;22790:8;22750:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;22862:8;22826:55;;22841:19;:17;:19::i;:::-;22826:55;;;22872:8;22826:55;;;;;;:::i;:::-;;;;;;;;22581:308;;:::o;23451:399::-;23618:31;23631:4;23637:2;23641:7;23618:12;:31::i;:::-;23682:1;23664:2;:14;;;:19;23660:183;;23703:56;23734:4;23740:2;23744:7;23753:5;23703:30;:56::i;:::-;23698:145;;23787:40;;;;;;;;;;;;;;23698:145;23660:183;23451:399;;;;:::o;73468:2235::-;73533:13;73595:1;73567:30;;:16;73575:7;73567;:16::i;:::-;:30;;;73559:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;73659:20;73682:17;73691:7;73682:8;:17::i;:::-;73659:40;;73710:20;73769:4;73746:27;;:10;73757:7;73746:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:27;;;:53;;;;;73795:4;73777:22;;:14;;;;;;;;;;;:22;;;73746:53;73743:375;;;73891:13;73906:18;73916:7;73906:9;:18::i;:::-;73874:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;73858:76;;73743:375;;;73985:13;73993:4;73985:7;:13::i;:::-;73976:22;;74076:28;74096:6;74076:13;:28::i;:::-;74029:76;;;;;;;;:::i;:::-;;;;;;;;;;;;;74013:93;;73743:375;74130:23;;:::i;:::-;74166:48;;;;;;;;;;;;;;;;;:5;74172:1;74166:8;;;;;;;:::i;:::-;;;;;:48;;;;74236:4;:14;;;74225:5;74231:1;74225:8;;;;;;;:::i;:::-;;;;;:25;;;;74261:46;;;;;;;;;;;;;;;;;:5;74267:1;74261:8;;;;;;;:::i;:::-;;;;;:46;;;;74329:4;:11;;;74318:5;74324:1;74318:8;;;;;;;:::i;:::-;;;;;:22;;;;74351:45;;;;;;;;;;;;;;;;;:5;74357:1;74351:8;;;;;;;:::i;:::-;;;;;:45;;;;74418:4;:10;;;74407:5;74413:1;74407:8;;;;;;;:::i;:::-;;;;;:21;;;;74439:46;;;;;;;;;;;;;;;;;:5;74445:1;74439:8;;;;;;;:::i;:::-;;;;;:46;;;;74507:4;:11;;;74496:5;74502:1;74496:8;;;;;;;:::i;:::-;;;;;:22;;;;74530:47;;;;;;;;;;;;;;;;;:5;74536:1;74530:8;;;;;;;:::i;:::-;;;;;:47;;;;74599:4;:12;;;74588:5;74594:1;74588:8;;;;;;;:::i;:::-;;;;;:23;;;;74623:49;;;;;;;;;;;;;;;;;:5;74629:2;74623:9;;;;;;;:::i;:::-;;;;;:49;;;;74695:4;:13;;;74683:5;74689:2;74683:9;;;;;;;:::i;:::-;;;;;:25;;;;74720:52;;;;;;;;;;;;;;;;;:5;74726:2;74720:9;;;;;;;:::i;:::-;;;;;:52;;;;74795:4;:16;;;74783:5;74789:2;74783:9;;;;;;;:::i;:::-;;;;;:28;;;;74823:49;;;;;;;;;;;;;;;;;:5;74829:2;74823:9;;;;;;;:::i;:::-;;;;;:49;;;;74895:4;:13;;;74883:5;74889:2;74883:9;;;;;;;:::i;:::-;;;;;:25;;;;74920:50;;;;;;;;;;;;;;;;;:5;74926:2;74920:9;;;;;;;:::i;:::-;;;;;:50;;;;74993:4;:12;;;74981:5;74987:2;74981:9;;;;;;;:::i;:::-;;;;;:24;;;;75016:17;;;;;;;;;;;;;;;;;:5;75022:2;75016:9;;;;;;;:::i;:::-;;;;;:17;;;;75046:18;75091:5;75097:1;75091:8;;;;;;;:::i;:::-;;;;;;75101:5;75107:1;75101:8;;;;;;;:::i;:::-;;;;;;75111:5;75117:1;75111:8;;;;;;;:::i;:::-;;;;;;75121:5;75127:1;75121:8;;;;;;;:::i;:::-;;;;;;75131:5;75137:1;75131:8;;;;;;;:::i;:::-;;;;;;75141:5;75147:1;75141:8;;;;;;;:::i;:::-;;;;;;75151:5;75157:1;75151:8;;;;;;;:::i;:::-;;;;;;75161:5;75167:1;75161:8;;;;;;;:::i;:::-;;;;;;75171:5;75177:1;75171:8;;;;;;;:::i;:::-;;;;;;75074:106;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75046:135;;75223:4;75228:5;75234:1;75228:8;;;;;;;:::i;:::-;;;;;;75237:5;75243:2;75237:9;;;;;;;:::i;:::-;;;;;;75247:5;75253:2;75247:9;;;;;;;:::i;:::-;;;;;;75257:5;75263:2;75257:9;;;;;;;:::i;:::-;;;;;;75267:5;75273:2;75267:9;;;;;;;:::i;:::-;;;;;;75277:5;75283:2;75277:9;;;;;;;:::i;:::-;;;;;;75287:5;75293:2;75287:9;;;;;;;:::i;:::-;;;;;;75297:5;75303:2;75297:9;;;;;;;:::i;:::-;;;;;;75307:5;75313:2;75307:9;;;;;;;:::i;:::-;;;;;;75317:5;75323:2;75317:9;;;;;;;:::i;:::-;;;;;;75206:121;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75192:136;;75393:18;75403:7;75393:9;:18::i;:::-;75481:4;75355:131;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75341:146;;75505:81;75549:4;75570:6;75532:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75505:13;:81::i;:::-;75498:88;;75663:4;75613:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;75597:72;;75689:6;75682:13;;;;;;73468:2235;;;:::o;75711:87::-;75753:7;75780:10;;75773:17;;75711:87;:::o;22960:164::-;23057:4;23081:18;:25;23100:5;23081:25;;;;;;;;;;;;;;;:35;23107:8;23081:35;;;;;;;;;;;;;;;;;;;;;;;;;23074:42;;22960:164;;;;:::o;76846:414::-;76904:13;76957:10;76937:30;;:16;76945:7;76937;:16::i;:::-;:30;;;76929:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;77061:4;77038:27;;:10;77049:7;77038:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:27;;;77035:134;;77104:5;77082:10;77093:7;77082:19;;;;;;;:::i;:::-;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;77124:33;;;;;;;;;;;;;;;;;;;;;77035:134;77203:4;77181:10;77192:7;77181:19;;;;;;;:::i;:::-;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;77218:34;;;;;;;;;;;;;;;;;;;76846:414;;;;:::o;60793:133::-;46738:12;:10;:12::i;:::-;46727:23;;:7;:5;:7::i;:::-;:23;;;46719:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60884:1:::1;60870:10;;:15;60862:24;;;::::0;::::1;;60911:6;60898:10;:19;;;;60793:133:::0;:::o;47407:192::-;46738:12;:10;:12::i;:::-;46727:23;;:7;:5;:7::i;:::-;:23;;;46719:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47516:1:::1;47496:22;;:8;:22;;::::0;47488:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;47572:19;47582:8;47572:9;:19::i;:::-;47407:192:::0;:::o;24105:273::-;24162:4;24218:7;24199:15;:13;:15::i;:::-;:26;;:66;;;;;24252:13;;24242:7;:23;24199:66;:152;;;;;24350:1;10716:8;24303:17;:26;24321:7;24303:26;;;;;;;;;;;;:43;:48;24199:152;24179:172;;24105:273;;;:::o;42666:105::-;42726:7;42753:10;42746:17;;42666:105;:::o;45383:98::-;45436:7;45463:10;45456:17;;45383:98;:::o;13290:92::-;13346:7;13290:92;:::o;17065:1129::-;17132:7;17152:12;17167:7;17152:22;;17235:4;17216:15;:13;:15::i;:::-;:23;17212:915;;17269:13;;17262:4;:20;17258:869;;;17307:14;17324:17;:23;17342:4;17324:23;;;;;;;;;;;;17307:40;;17440:1;10716:8;17413:6;:23;:28;17409:699;;17932:113;17949:1;17939:6;:11;17932:113;;17992:17;:25;18010:6;;;;;;;17992:25;;;;;;;;;;;;17983:34;;17932:113;;;18078:6;18071:13;;;;;;17409:699;17284:843;17258:869;17212:915;18155:31;;;;;;;;;;;;;;17065:1129;;;;:::o;29906:652::-;30001:27;30030:23;30071:53;30127:15;30071:71;;30313:7;30307:4;30300:21;30348:22;30342:4;30335:36;30424:4;30418;30408:21;30385:44;;30520:19;30514:26;30495:45;;30251:300;29906:652;;;:::o;30671:645::-;30813:11;30975:15;30969:4;30965:26;30957:34;;31134:15;31123:9;31119:31;31106:44;;31281:15;31270:9;31267:30;31260:4;31249:9;31246:19;31243:55;31233:65;;30671:645;;;;;:::o;41499:159::-;;;;;:::o;39811:309::-;39946:7;39966:16;11117:3;39992:19;:40;;39966:67;;11117:3;40059:31;40070:4;40076:2;40080:9;40059:10;:31::i;:::-;40051:40;;:61;;40044:68;;;39811:309;;;;;:::o;19639:447::-;19719:14;19887:15;19880:5;19876:27;19867:36;;20061:5;20047:11;20023:22;20019:40;20016:51;20009:5;20006:62;19996:72;;19639:447;;;;:::o;42317:158::-;;;;;:::o;47607:173::-;47663:16;47682:6;;;;;;;;;;;47663:25;;47708:8;47699:6;;:17;;;;;;;;;;;;;;;;;;47763:8;47732:40;;47753:8;47732:40;;;;;;;;;;;;47652:128;47607:173;:::o;25936:1529::-;26001:20;26024:13;;26001:36;;26066:1;26052:16;;:2;:16;;;26048:48;;26077:19;;;;;;;;;;;;;;26048:48;26123:1;26111:8;:13;26107:44;;26133:18;;;;;;;;;;;;;;26107:44;26164:61;26194:1;26198:2;26202:12;26216:8;26164:21;:61::i;:::-;26707:1;10083:2;26678:1;:25;;26677:31;26665:8;:44;26639:18;:22;26658:2;26639:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;26986:139;27023:2;27077:33;27100:1;27104:2;27108:1;27077:14;:33::i;:::-;27044:30;27065:8;27044:20;:30::i;:::-;:66;26986:18;:139::i;:::-;26952:17;:31;26970:12;26952:31;;;;;;;;;;;:173;;;;27142:15;27160:12;27142:30;;27187:11;27216:8;27201:12;:23;27187:37;;27239:101;27291:9;;;;;;27287:2;27266:35;;27283:1;27266:35;;;;;;;;;;;;27335:3;27325:7;:13;27239:101;;27372:3;27356:13;:19;;;;26413:974;;27397:60;27426:1;27430:2;27434:12;27448:8;27397:20;:60::i;:::-;25990:1475;25936:1529;;:::o;38321:716::-;38484:4;38530:2;38505:45;;;38551:19;:17;:19::i;:::-;38572:4;38578:7;38587:5;38505:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38501:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38805:1;38788:6;:13;:18;38784:235;;38834:40;;;;;;;;;;;;;;38784:235;38977:6;38971:13;38962:6;38958:2;38954:15;38947:38;38501:529;38674:54;;;38664:64;;;:6;:64;;;;38657:71;;;38321:716;;;;;;:::o;69427:2177::-;69480:15;;:::i;:::-;69508:20;;:::i;:::-;69577:12;69655:16;69627:2;69639:4;69610:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69600:51;;;;;;69592:60;;:79;;;;:::i;:::-;69577:94;;69699:11;69711:4;69699:17;;;;;;;:::i;:::-;;;69682:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:14;;:34;;;;69742:9;69752:4;69742:15;;;;;;;:::i;:::-;;;69727:30;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:12;;:30;;;;69864:2;69836;69848:4;69819:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69809:51;;;;;;69801:60;;:65;;;;:::i;:::-;69794:72;;69888:12;69880:4;:20;69877:38;;69911:1;69904:8;;69877:38;69938:5;69944:4;69938:11;;;;;;;:::i;:::-;;;69926:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:9;;:23;;;;69974:7;69982:4;69974:13;;;;;;;:::i;:::-;;;69960:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:11;;:27;;;;70094:2;70066;70078:4;70049:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70039:51;;;;;;70031:60;;:65;;;;:::i;:::-;70024:72;;70118:12;70110:4;:20;70107:38;;70141:1;70134:8;;70107:38;70166:5;70172:4;70166:11;;;;;;;:::i;:::-;;;70155:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:8;;:22;;;;70201:7;70209:4;70201:13;;;;;;;:::i;:::-;;;70188:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:10;;:26;;;;70322:12;70294:2;70306:4;70277:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70267:51;;;;;;70259:60;;:75;;;;:::i;:::-;70252:82;;70357:5;70363:4;70357:11;;;;;;;:::i;:::-;;;70345:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:9;;:23;;;;70394:7;70402:4;70394:13;;;;;;;:::i;:::-;;;70380:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:11;;:27;;;;70518:2;70490;70502:4;70473:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70463:51;;;;;;70455:60;;:65;;;;:::i;:::-;70448:72;;70542:14;70534:4;:22;70531:40;;70567:1;70560:8;;70531:40;70595:7;70603:4;70595:13;;;;;;;:::i;:::-;;;70581:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:11;;:27;;;;70636:9;70646:4;70636:15;;;;;;;:::i;:::-;;;70620:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:13;;:31;;;;70761:14;70733:2;70745:4;70716:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70706:51;;;;;;70698:60;;:77;;;;:::i;:::-;70691:84;;70799:7;70807:4;70799:13;;;;;;;:::i;:::-;;;70786:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:10;;:26;;;;70839:9;70849:4;70839:15;;;;;;;:::i;:::-;;;70824:30;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:12;;:30;;;;70970:2;70942;70954:4;70925:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70915:51;;;;;;70907:60;;:65;;;;:::i;:::-;70900:72;;70994:19;70986:4;:27;70983:45;;71024:1;71017:8;;70983:45;71055:12;71068:4;71055:18;;;;;;;:::i;:::-;;;71038:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:14;;:35;;;;71104:13;71118:4;71104:19;;;;;;;:::i;:::-;;;71085:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:16;;:38;;;;71235:3;71207:2;71219:4;71190:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71180:51;;;;;;71172:60;;:66;;;;:::i;:::-;71165:73;;71260:15;71252:4;:23;71249:41;;71286:1;71279:8;;71249:41;71314:8;71323:4;71314:14;;;;;;;:::i;:::-;;;71300:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:11;;:28;;;;71356:10;71367:4;71356:16;;;;;;;:::i;:::-;;;71340:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:13;;:32;;;;71386:20;;;;;;;;;;;;;;;;;:4;:12;;:20;;;;71435:1;71420:9;71430:2;71420:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:16;;;71417:156;;71453:20;;;;;;;;;;;;;;;;;:4;:12;;:20;;;;71417:156;;;71518:1;71503:9;71513:2;71503:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:16;;;71500:73;;71536:25;;;;;;;;;;;;;;;;;:4;:12;;:25;;;;71500:73;71417:156;71592:4;71585:11;;;;69427:2177;;;:::o;42877:1960::-;42934:17;43353:3;43346:4;43340:11;43336:21;43329:28;;43444:3;43438:4;43431:17;43550:3;44006:5;44136:1;44131:3;44127:11;44120:18;;44273:2;44267:4;44263:13;44259:2;44255:22;44250:3;44242:36;44314:2;44308:4;44304:13;44296:21;;43898:697;44333:4;43898:697;;;44524:1;44519:3;44515:11;44508:18;;44575:2;44569:4;44565:13;44561:2;44557:22;44552:3;44544:36;44428:2;44422:4;44418:13;44410:21;;43898:697;;;43902:430;44634:3;44629;44625:13;44749:2;44744:3;44740:12;44733:19;;44812:6;44807:3;44800:19;42973:1857;;42877:1960;;;:::o;71612:1848::-;71674:13;71700:23;;:::i;:::-;71736;:28;;;;;;;;;;;;;;71807:1;71785:4;:11;;;71779:25;:29;71776:135;;;71879:4;:13;;;71845:53;;;;;;;;:::i;:::-;;;;;;;;;;;;;71826:73;;71776:135;71923:143;;;;;;;;;;;;;;;;;:5;71929:1;71923:8;;;;;;;:::i;:::-;;;;;:143;;;;72077:150;;;;;;;;;;;;;;;;;:5;72083:1;72077:8;;;;;;;:::i;:::-;;;;;:150;;;;72238:197;;;;;;;;;;;;;;;;;:5;72244:1;72238:8;;;;;;;:::i;:::-;;;;;:197;;;;72457:4;:11;;;72446:5;72452:1;72446:8;;;;;;;:::i;:::-;;;;;:22;;;;72480:60;;;;;;;;;;;;;;;;;:5;72486:1;72480:8;;;;;;;:::i;:::-;;;;;:60;;;;72562:4;:12;;;72551:5;72557:1;72551:8;;;;;;;:::i;:::-;;;;;:23;;;;72585:28;;;;;;;;;;;;;;;;;:5;72591:1;72585:8;;;;;;;:::i;:::-;;;;;:28;;;;72636:9;72625:5;72631:1;72625:8;;;;;;;:::i;:::-;;;;;:20;;;;72657:116;;;;;;;;;;;;;;;;;:5;72663:1;72657:8;;;;;;;:::i;:::-;;;;;:116;;;;72784:127;;;;;;;;;;;;;;;;;:5;72790:1;72784:8;;;;;;;:::i;:::-;;;;;:127;;;;72934:4;:9;;;72922:5;72928:2;72922:9;;;;;;;:::i;:::-;;;;;:21;;;;72966:4;:8;;;72954:5;72960:2;72954:9;;;;;;;:::i;:::-;;;;;:20;;;;72997:4;:9;;;72985:5;72991:2;72985:9;;;;;;;:::i;:::-;;;;;:21;;;;73030:4;:10;;;73018:5;73024:2;73018:9;;;;;;;:::i;:::-;;;;;:22;;;;73064:4;:11;;;73052:5;73058:2;73052:9;;;;;;;:::i;:::-;;;;;:23;;;;73099:4;:14;;;73087:5;73093:2;73087:9;;;;;;;:::i;:::-;;;;;:26;;;;73125:28;;;;;;;;;;;;;;;;;:5;73131:2;73125:9;;;;;;;:::i;:::-;;;;;:28;;;;73166:20;73213:5;73219:1;73213:8;;;;;;;:::i;:::-;;;;;;73222:5;73228:1;73222:8;;;;;;;:::i;:::-;;;;;;73231:5;73237:1;73231:8;;;;;;;:::i;:::-;;;;;;73240:5;73246:1;73240:8;;;;;;;:::i;:::-;;;;;;73249:5;73255:1;73249:8;;;;;;;:::i;:::-;;;;;;73258:5;73264:1;73258:8;;;;;;;:::i;:::-;;;;;;73267:5;73273:1;73267:8;;;;;;;:::i;:::-;;;;;;73276:5;73282:1;73276:8;;;;;;;:::i;:::-;;;;;;73196:89;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;73166:120;;73330:6;73337:5;73343:1;73337:8;;;;;;;:::i;:::-;;;;;;73346:5;73352:1;73346:8;;;;;;;:::i;:::-;;;;;;73355:5;73361:2;73355:9;;;;;;;:::i;:::-;;;;;;73365:5;73371:2;73365:9;;;;;;;:::i;:::-;;;;;;73375:5;73381:2;73375:9;;;;;;;:::i;:::-;;;;;;73385:5;73391:2;73385:9;;;;;;;:::i;:::-;;;;;;73395:5;73401:2;73395:9;;;;;;;:::i;:::-;;;;;;73405:5;73411:2;73405:9;;;;;;;:::i;:::-;;;;;;73415:5;73421:2;73415:9;;;;;;;:::i;:::-;;;;;;73313:112;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;73297:129;;73446:6;73439:13;;;;;71612:1848;;;:::o;50645:1607::-;50703:13;50729:11;50743:4;:11;50729:25;;50776:1;50769:3;:8;50765:23;;50779:9;;;;;;;;;;;;;;;;;50765:23;50840:18;50878:1;50873;50867:3;:7;;;;:::i;:::-;50866:13;;;;:::i;:::-;50861:1;:19;;;;:::i;:::-;50840:40;;50938:19;50983:2;50970:10;:15;;;;:::i;:::-;50960:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50938:48;;50999:18;51020:5;;;;;;;;;;;;;;;;;50999:26;;51089:1;51082:5;51078:13;51134:2;51126:6;51122:15;51185:1;51153:777;51208:3;51205:1;51202:10;51153:777;;;51263:1;51260;51256:9;51251:14;;51321:8;51316:1;51310:4;51306:12;51300:19;51296:34;51401:4;51393:5;51389:2;51385:14;51381:25;51371:8;51367:40;51361:47;51440:3;51437:1;51433:11;51426:18;;51531:4;51522;51514:5;51510:2;51506:14;51502:25;51492:8;51488:40;51482:47;51478:58;51473:3;51469:68;51462:75;;51569:3;51566:1;51562:11;51555:18;;51659:4;51650;51642:5;51639:1;51635:13;51631:24;51621:8;51617:39;51611:46;51607:57;51602:3;51598:67;51591:74;;51697:3;51694:1;51690:11;51683:18;;51779:4;51770;51763:5;51759:16;51749:8;51745:31;51739:38;51735:49;51730:3;51726:59;51719:66;;51819:3;51814;51810:13;51803:20;;51861:3;51850:9;51843:22;51913:1;51902:9;51898:17;51885:30;;51232:698;;51153:777;;;51157:44;51962:1;51957:3;51953:11;51983:1;51978:84;;;;52081:1;52076:82;;;;51946:212;;51978:84;52039:6;52034:3;52030:16;52026:1;52015:9;52011:17;52004:43;51978:84;;52076:82;52137:4;52132:3;52128:14;52124:1;52113:9;52109:17;52102:41;51946:212;;52189:10;52181:6;52174:26;51047:1164;;52237:6;52223:21;;;;;;50645:1607;;;;:::o;40696:147::-;40833:6;40696:147;;;;;:::o;21469:322::-;21539:14;21770:1;21760:8;21757:15;21732:23;21728:45;21718:55;;21469:322;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:86::-;4925:7;4965:4;4958:5;4954:16;4943:27;;4890:86;;;:::o;4982:118::-;5053:22;5069:5;5053:22;:::i;:::-;5046:5;5043:33;5033:61;;5090:1;5087;5080:12;5033:61;4982:118;:::o;5106:135::-;5150:5;5188:6;5175:20;5166:29;;5204:31;5229:5;5204:31;:::i;:::-;5106:135;;;;:::o;5247:470::-;5313:6;5321;5370:2;5358:9;5349:7;5345:23;5341:32;5338:119;;;5376:79;;:::i;:::-;5338:119;5496:1;5521:53;5566:7;5557:6;5546:9;5542:22;5521:53;:::i;:::-;5511:63;;5467:117;5623:2;5649:51;5692:7;5683:6;5672:9;5668:22;5649:51;:::i;:::-;5639:61;;5594:116;5247:470;;;;;:::o;5723:118::-;5810:24;5828:5;5810:24;:::i;:::-;5805:3;5798:37;5723:118;;:::o;5847:222::-;5940:4;5978:2;5967:9;5963:18;5955:26;;5991:71;6059:1;6048:9;6044:17;6035:6;5991:71;:::i;:::-;5847:222;;;;:::o;6075:619::-;6152:6;6160;6168;6217:2;6205:9;6196:7;6192:23;6188:32;6185:119;;;6223:79;;:::i;:::-;6185:119;6343:1;6368:53;6413:7;6404:6;6393:9;6389:22;6368:53;:::i;:::-;6358:63;;6314:117;6470:2;6496:53;6541:7;6532:6;6521:9;6517:22;6496:53;:::i;:::-;6486:63;;6441:118;6598:2;6624:53;6669:7;6660:6;6649:9;6645:22;6624:53;:::i;:::-;6614:63;;6569:118;6075:619;;;;;:::o;6700:117::-;6809:1;6806;6799:12;6823:117;6932:1;6929;6922:12;6946:117;7055:1;7052;7045:12;7083:553;7141:8;7151:6;7201:3;7194:4;7186:6;7182:17;7178:27;7168:122;;7209:79;;:::i;:::-;7168:122;7322:6;7309:20;7299:30;;7352:18;7344:6;7341:30;7338:117;;;7374:79;;:::i;:::-;7338:117;7488:4;7480:6;7476:17;7464:29;;7542:3;7534:4;7526:6;7522:17;7512:8;7508:32;7505:41;7502:128;;;7549:79;;:::i;:::-;7502:128;7083:553;;;;;:::o;7642:529::-;7713:6;7721;7770:2;7758:9;7749:7;7745:23;7741:32;7738:119;;;7776:79;;:::i;:::-;7738:119;7924:1;7913:9;7909:17;7896:31;7954:18;7946:6;7943:30;7940:117;;;7976:79;;:::i;:::-;7940:117;8089:65;8146:7;8137:6;8126:9;8122:22;8089:65;:::i;:::-;8071:83;;;;7867:297;7642:529;;;;;:::o;8177:329::-;8236:6;8285:2;8273:9;8264:7;8260:23;8256:32;8253:119;;;8291:79;;:::i;:::-;8253:119;8411:1;8436:53;8481:7;8472:6;8461:9;8457:22;8436:53;:::i;:::-;8426:63;;8382:117;8177:329;;;;:::o;8512:116::-;8582:21;8597:5;8582:21;:::i;:::-;8575:5;8572:32;8562:60;;8618:1;8615;8608:12;8562:60;8512:116;:::o;8634:133::-;8677:5;8715:6;8702:20;8693:29;;8731:30;8755:5;8731:30;:::i;:::-;8634:133;;;;:::o;8773:468::-;8838:6;8846;8895:2;8883:9;8874:7;8870:23;8866:32;8863:119;;;8901:79;;:::i;:::-;8863:119;9021:1;9046:53;9091:7;9082:6;9071:9;9067:22;9046:53;:::i;:::-;9036:63;;8992:117;9148:2;9174:50;9216:7;9207:6;9196:9;9192:22;9174:50;:::i;:::-;9164:60;;9119:115;8773:468;;;;;:::o;9247:117::-;9356:1;9353;9346:12;9370:180;9418:77;9415:1;9408:88;9515:4;9512:1;9505:15;9539:4;9536:1;9529:15;9556:281;9639:27;9661:4;9639:27;:::i;:::-;9631:6;9627:40;9769:6;9757:10;9754:22;9733:18;9721:10;9718:34;9715:62;9712:88;;;9780:18;;:::i;:::-;9712:88;9820:10;9816:2;9809:22;9599:238;9556:281;;:::o;9843:129::-;9877:6;9904:20;;:::i;:::-;9894:30;;9933:33;9961:4;9953:6;9933:33;:::i;:::-;9843:129;;;:::o;9978:307::-;10039:4;10129:18;10121:6;10118:30;10115:56;;;10151:18;;:::i;:::-;10115:56;10189:29;10211:6;10189:29;:::i;:::-;10181:37;;10273:4;10267;10263:15;10255:23;;9978:307;;;:::o;10291:146::-;10388:6;10383:3;10378;10365:30;10429:1;10420:6;10415:3;10411:16;10404:27;10291:146;;;:::o;10443:423::-;10520:5;10545:65;10561:48;10602:6;10561:48;:::i;:::-;10545:65;:::i;:::-;10536:74;;10633:6;10626:5;10619:21;10671:4;10664:5;10660:16;10709:3;10700:6;10695:3;10691:16;10688:25;10685:112;;;10716:79;;:::i;:::-;10685:112;10806:54;10853:6;10848:3;10843;10806:54;:::i;:::-;10526:340;10443:423;;;;;:::o;10885:338::-;10940:5;10989:3;10982:4;10974:6;10970:17;10966:27;10956:122;;10997:79;;:::i;:::-;10956:122;11114:6;11101:20;11139:78;11213:3;11205:6;11198:4;11190:6;11186:17;11139:78;:::i;:::-;11130:87;;10946:277;10885:338;;;;:::o;11229:943::-;11324:6;11332;11340;11348;11397:3;11385:9;11376:7;11372:23;11368:33;11365:120;;;11404:79;;:::i;:::-;11365:120;11524:1;11549:53;11594:7;11585:6;11574:9;11570:22;11549:53;:::i;:::-;11539:63;;11495:117;11651:2;11677:53;11722:7;11713:6;11702:9;11698:22;11677:53;:::i;:::-;11667:63;;11622:118;11779:2;11805:53;11850:7;11841:6;11830:9;11826:22;11805:53;:::i;:::-;11795:63;;11750:118;11935:2;11924:9;11920:18;11907:32;11966:18;11958:6;11955:30;11952:117;;;11988:79;;:::i;:::-;11952:117;12093:62;12147:7;12138:6;12127:9;12123:22;12093:62;:::i;:::-;12083:72;;11878:287;11229:943;;;;;;;:::o;12178:474::-;12246:6;12254;12303:2;12291:9;12282:7;12278:23;12274:32;12271:119;;;12309:79;;:::i;:::-;12271:119;12429:1;12454:53;12499:7;12490:6;12479:9;12475:22;12454:53;:::i;:::-;12444:63;;12400:117;12556:2;12582:53;12627:7;12618:6;12607:9;12603:22;12582:53;:::i;:::-;12572:63;;12527:118;12178:474;;;;;:::o;12658:180::-;12706:77;12703:1;12696:88;12803:4;12800:1;12793:15;12827:4;12824:1;12817:15;12844:320;12888:6;12925:1;12919:4;12915:12;12905:22;;12972:1;12966:4;12962:12;12993:18;12983:81;;13049:4;13041:6;13037:17;13027:27;;12983:81;13111:2;13103:6;13100:14;13080:18;13077:38;13074:84;;13130:18;;:::i;:::-;13074:84;12895:269;12844:320;;;:::o;13170:239::-;13310:34;13306:1;13298:6;13294:14;13287:58;13379:22;13374:2;13366:6;13362:15;13355:47;13170:239;:::o;13415:366::-;13557:3;13578:67;13642:2;13637:3;13578:67;:::i;:::-;13571:74;;13654:93;13743:3;13654:93;:::i;:::-;13772:2;13767:3;13763:12;13756:19;;13415:366;;;:::o;13787:419::-;13953:4;13991:2;13980:9;13976:18;13968:26;;14040:9;14034:4;14030:20;14026:1;14015:9;14011:17;14004:47;14068:131;14194:4;14068:131;:::i;:::-;14060:139;;13787:419;;;:::o;14212:230::-;14352:34;14348:1;14340:6;14336:14;14329:58;14421:13;14416:2;14408:6;14404:15;14397:38;14212:230;:::o;14448:366::-;14590:3;14611:67;14675:2;14670:3;14611:67;:::i;:::-;14604:74;;14687:93;14776:3;14687:93;:::i;:::-;14805:2;14800:3;14796:12;14789:19;;14448:366;;;:::o;14820:419::-;14986:4;15024:2;15013:9;15009:18;15001:26;;15073:9;15067:4;15063:20;15059:1;15048:9;15044:17;15037:47;15101:131;15227:4;15101:131;:::i;:::-;15093:139;;14820:419;;;:::o;15245:180::-;15293:77;15290:1;15283:88;15390:4;15387:1;15380:15;15414:4;15411:1;15404:15;15431:179;15571:31;15567:1;15559:6;15555:14;15548:55;15431:179;:::o;15616:366::-;15758:3;15779:67;15843:2;15838:3;15779:67;:::i;:::-;15772:74;;15855:93;15944:3;15855:93;:::i;:::-;15973:2;15968:3;15964:12;15957:19;;15616:366;;;:::o;15988:419::-;16154:4;16192:2;16181:9;16177:18;16169:26;;16241:9;16235:4;16231:20;16227:1;16216:9;16212:17;16205:47;16269:131;16395:4;16269:131;:::i;:::-;16261:139;;15988:419;;;:::o;16413:182::-;16553:34;16549:1;16541:6;16537:14;16530:58;16413:182;:::o;16601:366::-;16743:3;16764:67;16828:2;16823:3;16764:67;:::i;:::-;16757:74;;16840:93;16929:3;16840:93;:::i;:::-;16958:2;16953:3;16949:12;16942:19;;16601:366;;;:::o;16973:419::-;17139:4;17177:2;17166:9;17162:18;17154:26;;17226:9;17220:4;17216:20;17212:1;17201:9;17197:17;17190:47;17254:131;17380:4;17254:131;:::i;:::-;17246:139;;16973:419;;;:::o;17398:181::-;17538:33;17534:1;17526:6;17522:14;17515:57;17398:181;:::o;17585:366::-;17727:3;17748:67;17812:2;17807:3;17748:67;:::i;:::-;17741:74;;17824:93;17913:3;17824:93;:::i;:::-;17942:2;17937:3;17933:12;17926:19;;17585:366;;;:::o;17957:419::-;18123:4;18161:2;18150:9;18146:18;18138:26;;18210:9;18204:4;18200:20;18196:1;18185:9;18181:17;18174:47;18238:131;18364:4;18238:131;:::i;:::-;18230:139;;17957:419;;;:::o;18382:147::-;18483:11;18520:3;18505:18;;18382:147;;;;:::o;18535:114::-;;:::o;18655:398::-;18814:3;18835:83;18916:1;18911:3;18835:83;:::i;:::-;18828:90;;18927:93;19016:3;18927:93;:::i;:::-;19045:1;19040:3;19036:11;19029:18;;18655:398;;;:::o;19059:379::-;19243:3;19265:147;19408:3;19265:147;:::i;:::-;19258:154;;19429:3;19422:10;;19059:379;;;:::o;19444:165::-;19584:17;19580:1;19572:6;19568:14;19561:41;19444:165;:::o;19615:366::-;19757:3;19778:67;19842:2;19837:3;19778:67;:::i;:::-;19771:74;;19854:93;19943:3;19854:93;:::i;:::-;19972:2;19967:3;19963:12;19956:19;;19615:366;;;:::o;19987:419::-;20153:4;20191:2;20180:9;20176:18;20168:26;;20240:9;20234:4;20230:20;20226:1;20215:9;20211:17;20204:47;20268:131;20394:4;20268:131;:::i;:::-;20260:139;;19987:419;;;:::o;20412:97::-;20471:6;20499:3;20489:13;;20412:97;;;;:::o;20515:141::-;20564:4;20587:3;20579:11;;20610:3;20607:1;20600:14;20644:4;20641:1;20631:18;20623:26;;20515:141;;;:::o;20662:93::-;20699:6;20746:2;20741;20734:5;20730:14;20726:23;20716:33;;20662:93;;;:::o;20761:107::-;20805:8;20855:5;20849:4;20845:16;20824:37;;20761:107;;;;:::o;20874:393::-;20943:6;20993:1;20981:10;20977:18;21016:97;21046:66;21035:9;21016:97;:::i;:::-;21134:39;21164:8;21153:9;21134:39;:::i;:::-;21122:51;;21206:4;21202:9;21195:5;21191:21;21182:30;;21255:4;21245:8;21241:19;21234:5;21231:30;21221:40;;20950:317;;20874:393;;;;;:::o;21273:60::-;21301:3;21322:5;21315:12;;21273:60;;;:::o;21339:142::-;21389:9;21422:53;21440:34;21449:24;21467:5;21449:24;:::i;:::-;21440:34;:::i;:::-;21422:53;:::i;:::-;21409:66;;21339:142;;;:::o;21487:75::-;21530:3;21551:5;21544:12;;21487:75;;;:::o;21568:269::-;21678:39;21709:7;21678:39;:::i;:::-;21739:91;21788:41;21812:16;21788:41;:::i;:::-;21780:6;21773:4;21767:11;21739:91;:::i;:::-;21733:4;21726:105;21644:193;21568:269;;;:::o;21843:73::-;21888:3;21843:73;:::o;21922:189::-;21999:32;;:::i;:::-;22040:65;22098:6;22090;22084:4;22040:65;:::i;:::-;21975:136;21922:189;;:::o;22117:186::-;22177:120;22194:3;22187:5;22184:14;22177:120;;;22248:39;22285:1;22278:5;22248:39;:::i;:::-;22221:1;22214:5;22210:13;22201:22;;22177:120;;;22117:186;;:::o;22309:543::-;22410:2;22405:3;22402:11;22399:446;;;22444:38;22476:5;22444:38;:::i;:::-;22528:29;22546:10;22528:29;:::i;:::-;22518:8;22514:44;22711:2;22699:10;22696:18;22693:49;;;22732:8;22717:23;;22693:49;22755:80;22811:22;22829:3;22811:22;:::i;:::-;22801:8;22797:37;22784:11;22755:80;:::i;:::-;22414:431;;22399:446;22309:543;;;:::o;22858:117::-;22912:8;22962:5;22956:4;22952:16;22931:37;;22858:117;;;;:::o;22981:169::-;23025:6;23058:51;23106:1;23102:6;23094:5;23091:1;23087:13;23058:51;:::i;:::-;23054:56;23139:4;23133;23129:15;23119:25;;23032:118;22981:169;;;;:::o;23155:295::-;23231:4;23377:29;23402:3;23396:4;23377:29;:::i;:::-;23369:37;;23439:3;23436:1;23432:11;23426:4;23423:21;23415:29;;23155:295;;;;:::o;23455:1403::-;23579:44;23619:3;23614;23579:44;:::i;:::-;23688:18;23680:6;23677:30;23674:56;;;23710:18;;:::i;:::-;23674:56;23754:38;23786:4;23780:11;23754:38;:::i;:::-;23839:67;23899:6;23891;23885:4;23839:67;:::i;:::-;23933:1;23962:2;23954:6;23951:14;23979:1;23974:632;;;;24650:1;24667:6;24664:84;;;24723:9;24718:3;24714:19;24701:33;24692:42;;24664:84;24774:67;24834:6;24827:5;24774:67;:::i;:::-;24768:4;24761:81;24623:229;23944:908;;23974:632;24026:4;24022:9;24014:6;24010:22;24060:37;24092:4;24060:37;:::i;:::-;24119:1;24133:215;24147:7;24144:1;24141:14;24133:215;;;24233:9;24228:3;24224:19;24211:33;24203:6;24196:49;24284:1;24276:6;24272:14;24262:24;;24331:2;24320:9;24316:18;24303:31;;24170:4;24167:1;24163:12;24158:17;;24133:215;;;24376:6;24367:7;24364:19;24361:186;;;24441:9;24436:3;24432:19;24419:33;24484:48;24526:4;24518:6;24514:17;24503:9;24484:48;:::i;:::-;24476:6;24469:64;24384:163;24361:186;24593:1;24589;24581:6;24577:14;24573:22;24567:4;24560:36;23981:625;;;23944:908;;23554:1304;;;23455:1403;;;:::o;24864:178::-;25004:30;25000:1;24992:6;24988:14;24981:54;24864:178;:::o;25048:366::-;25190:3;25211:67;25275:2;25270:3;25211:67;:::i;:::-;25204:74;;25287:93;25376:3;25287:93;:::i;:::-;25405:2;25400:3;25396:12;25389:19;;25048:366;;;:::o;25420:419::-;25586:4;25624:2;25613:9;25609:18;25601:26;;25673:9;25667:4;25663:20;25659:1;25648:9;25644:17;25637:47;25701:131;25827:4;25701:131;:::i;:::-;25693:139;;25420:419;;;:::o;25845:180::-;25893:77;25890:1;25883:88;25990:4;25987:1;25980:15;26014:4;26011:1;26004:15;26031:191;26071:3;26090:20;26108:1;26090:20;:::i;:::-;26085:25;;26124:20;26142:1;26124:20;:::i;:::-;26119:25;;26167:1;26164;26160:9;26153:16;;26188:3;26185:1;26182:10;26179:36;;;26195:18;;:::i;:::-;26179:36;26031:191;;;;:::o;26228:348::-;26268:7;26291:20;26309:1;26291:20;:::i;:::-;26286:25;;26325:20;26343:1;26325:20;:::i;:::-;26320:25;;26513:1;26445:66;26441:74;26438:1;26435:81;26430:1;26423:9;26416:17;26412:105;26409:131;;;26520:18;;:::i;:::-;26409:131;26568:1;26565;26561:9;26550:20;;26228:348;;;;:::o;26582:231::-;26722:34;26718:1;26710:6;26706:14;26699:58;26791:14;26786:2;26778:6;26774:15;26767:39;26582:231;:::o;26819:366::-;26961:3;26982:67;27046:2;27041:3;26982:67;:::i;:::-;26975:74;;27058:93;27147:3;27058:93;:::i;:::-;27176:2;27171:3;27167:12;27160:19;;26819:366;;;:::o;27191:419::-;27357:4;27395:2;27384:9;27380:18;27372:26;;27444:9;27438:4;27434:20;27430:1;27419:9;27415:17;27408:47;27472:131;27598:4;27472:131;:::i;:::-;27464:139;;27191:419;;;:::o;27616:148::-;27718:11;27755:3;27740:18;;27616:148;;;;:::o;27794:874::-;27897:3;27934:5;27928:12;27963:36;27989:9;27963:36;:::i;:::-;28015:89;28097:6;28092:3;28015:89;:::i;:::-;28008:96;;28135:1;28124:9;28120:17;28151:1;28146:166;;;;28326:1;28321:341;;;;28113:549;;28146:166;28230:4;28226:9;28215;28211:25;28206:3;28199:38;28292:6;28285:14;28278:22;28270:6;28266:35;28261:3;28257:45;28250:52;;28146:166;;28321:341;28388:38;28420:5;28388:38;:::i;:::-;28448:1;28462:154;28476:6;28473:1;28470:13;28462:154;;;28550:7;28544:14;28540:1;28535:3;28531:11;28524:35;28600:1;28591:7;28587:15;28576:26;;28498:4;28495:1;28491:12;28486:17;;28462:154;;;28645:6;28640:3;28636:16;28629:23;;28328:334;;28113:549;;27901:767;;27794:874;;;;:::o;28674:390::-;28780:3;28808:39;28841:5;28808:39;:::i;:::-;28863:89;28945:6;28940:3;28863:89;:::i;:::-;28856:96;;28961:65;29019:6;29014:3;29007:4;29000:5;28996:16;28961:65;:::i;:::-;29051:6;29046:3;29042:16;29035:23;;28784:280;28674:390;;;;:::o;29070:154::-;29210:6;29206:1;29198:6;29194:14;29187:30;29070:154;:::o;29230:400::-;29390:3;29411:84;29493:1;29488:3;29411:84;:::i;:::-;29404:91;;29504:93;29593:3;29504:93;:::i;:::-;29622:1;29617:3;29613:11;29606:18;;29230:400;;;:::o;29636:695::-;29914:3;29936:92;30024:3;30015:6;29936:92;:::i;:::-;29929:99;;30045:95;30136:3;30127:6;30045:95;:::i;:::-;30038:102;;30157:148;30301:3;30157:148;:::i;:::-;30150:155;;30322:3;30315:10;;29636:695;;;;;:::o;30337:176::-;30477:28;30473:1;30465:6;30461:14;30454:52;30337:176;:::o;30519:402::-;30679:3;30700:85;30782:2;30777:3;30700:85;:::i;:::-;30693:92;;30794:93;30883:3;30794:93;:::i;:::-;30912:2;30907:3;30903:12;30896:19;;30519:402;;;:::o;30927:541::-;31160:3;31182:148;31326:3;31182:148;:::i;:::-;31175:155;;31347:95;31438:3;31429:6;31347:95;:::i;:::-;31340:102;;31459:3;31452:10;;30927:541;;;;:::o;31474:1555::-;31990:3;32012:95;32103:3;32094:6;32012:95;:::i;:::-;32005:102;;32124:95;32215:3;32206:6;32124:95;:::i;:::-;32117:102;;32236:95;32327:3;32318:6;32236:95;:::i;:::-;32229:102;;32348:95;32439:3;32430:6;32348:95;:::i;:::-;32341:102;;32460:95;32551:3;32542:6;32460:95;:::i;:::-;32453:102;;32572:95;32663:3;32654:6;32572:95;:::i;:::-;32565:102;;32684:95;32775:3;32766:6;32684:95;:::i;:::-;32677:102;;32796:95;32887:3;32878:6;32796:95;:::i;:::-;32789:102;;32908:95;32999:3;32990:6;32908:95;:::i;:::-;32901:102;;33020:3;33013:10;;31474:1555;;;;;;;;;;;;:::o;33035:1877::-;33648:3;33670:95;33761:3;33752:6;33670:95;:::i;:::-;33663:102;;33782:95;33873:3;33864:6;33782:95;:::i;:::-;33775:102;;33894:95;33985:3;33976:6;33894:95;:::i;:::-;33887:102;;34006:95;34097:3;34088:6;34006:95;:::i;:::-;33999:102;;34118:95;34209:3;34200:6;34118:95;:::i;:::-;34111:102;;34230:95;34321:3;34312:6;34230:95;:::i;:::-;34223:102;;34342:95;34433:3;34424:6;34342:95;:::i;:::-;34335:102;;34454:95;34545:3;34536:6;34454:95;:::i;:::-;34447:102;;34566:95;34657:3;34648:6;34566:95;:::i;:::-;34559:102;;34678:95;34769:3;34760:6;34678:95;:::i;:::-;34671:102;;34790:96;34882:3;34872:7;34790:96;:::i;:::-;34783:103;;34903:3;34896:10;;33035:1877;;;;;;;;;;;;;;:::o;34918:214::-;35058:66;35054:1;35046:6;35042:14;35035:90;34918:214;:::o;35138:402::-;35298:3;35319:85;35401:2;35396:3;35319:85;:::i;:::-;35312:92;;35413:93;35502:3;35413:93;:::i;:::-;35531:2;35526:3;35522:12;35515:19;;35138:402;;;:::o;35546:416::-;35686:66;35682:1;35674:6;35670:14;35663:90;35787:66;35782:2;35774:6;35770:15;35763:91;35888:66;35883:2;35875:6;35871:15;35864:91;35546:416;:::o;35968:402::-;36128:3;36149:85;36231:2;36226:3;36149:85;:::i;:::-;36142:92;;36243:93;36332:3;36243:93;:::i;:::-;36361:2;36356:3;36352:12;36345:19;;35968:402;;;:::o;36376:967::-;36758:3;36780:148;36924:3;36780:148;:::i;:::-;36773:155;;36945:95;37036:3;37027:6;36945:95;:::i;:::-;36938:102;;37057:148;37201:3;37057:148;:::i;:::-;37050:155;;37222:95;37313:3;37304:6;37222:95;:::i;:::-;37215:102;;37334:3;37327:10;;36376:967;;;;;:::o;37349:214::-;37489:66;37485:1;37477:6;37473:14;37466:90;37349:214;:::o;37569:402::-;37729:3;37750:85;37832:2;37827:3;37750:85;:::i;:::-;37743:92;;37844:93;37933:3;37844:93;:::i;:::-;37962:2;37957:3;37953:12;37946:19;;37569:402;;;:::o;37977:214::-;38117:66;38113:1;38105:6;38101:14;38094:90;37977:214;:::o;38197:400::-;38357:3;38378:84;38460:1;38455:3;38378:84;:::i;:::-;38371:91;;38471:93;38560:3;38471:93;:::i;:::-;38589:1;38584:3;38580:11;38573:18;;38197:400;;;:::o;38603:967::-;38985:3;39007:95;39098:3;39089:6;39007:95;:::i;:::-;39000:102;;39119:148;39263:3;39119:148;:::i;:::-;39112:155;;39284:95;39375:3;39366:6;39284:95;:::i;:::-;39277:102;;39396:148;39540:3;39396:148;:::i;:::-;39389:155;;39561:3;39554:10;;38603:967;;;;;:::o;39576:179::-;39716:31;39712:1;39704:6;39700:14;39693:55;39576:179;:::o;39761:402::-;39921:3;39942:85;40024:2;40019:3;39942:85;:::i;:::-;39935:92;;40036:93;40125:3;40036:93;:::i;:::-;40154:2;40149:3;40145:12;40138:19;;39761:402;;;:::o;40169:541::-;40402:3;40424:148;40568:3;40424:148;:::i;:::-;40417:155;;40589:95;40680:3;40671:6;40589:95;:::i;:::-;40582:102;;40701:3;40694:10;;40169:541;;;;:::o;40716:225::-;40856:34;40852:1;40844:6;40840:14;40833:58;40925:8;40920:2;40912:6;40908:15;40901:33;40716:225;:::o;40947:366::-;41089:3;41110:67;41174:2;41169:3;41110:67;:::i;:::-;41103:74;;41186:93;41275:3;41186:93;:::i;:::-;41304:2;41299:3;41295:12;41288:19;;40947:366;;;:::o;41319:419::-;41485:4;41523:2;41512:9;41508:18;41500:26;;41572:9;41566:4;41562:20;41558:1;41547:9;41543:17;41536:47;41600:131;41726:4;41600:131;:::i;:::-;41592:139;;41319:419;;;:::o;41744:98::-;41795:6;41829:5;41823:12;41813:22;;41744:98;;;:::o;41848:168::-;41931:11;41965:6;41960:3;41953:19;42005:4;42000:3;41996:14;41981:29;;41848:168;;;;:::o;42022:373::-;42108:3;42136:38;42168:5;42136:38;:::i;:::-;42190:70;42253:6;42248:3;42190:70;:::i;:::-;42183:77;;42269:65;42327:6;42322:3;42315:4;42308:5;42304:16;42269:65;:::i;:::-;42359:29;42381:6;42359:29;:::i;:::-;42354:3;42350:39;42343:46;;42112:283;42022:373;;;;:::o;42401:640::-;42596:4;42634:3;42623:9;42619:19;42611:27;;42648:71;42716:1;42705:9;42701:17;42692:6;42648:71;:::i;:::-;42729:72;42797:2;42786:9;42782:18;42773:6;42729:72;:::i;:::-;42811;42879:2;42868:9;42864:18;42855:6;42811:72;:::i;:::-;42930:9;42924:4;42920:20;42915:2;42904:9;42900:18;42893:48;42958:76;43029:4;43020:6;42958:76;:::i;:::-;42950:84;;42401:640;;;;;;;:::o;43047:141::-;43103:5;43134:6;43128:13;43119:22;;43150:32;43176:5;43150:32;:::i;:::-;43047:141;;;;:::o;43194:349::-;43263:6;43312:2;43300:9;43291:7;43287:23;43283:32;43280:119;;;43318:79;;:::i;:::-;43280:119;43438:1;43463:63;43518:7;43509:6;43498:9;43494:22;43463:63;:::i;:::-;43453:73;;43409:127;43194:349;;;;:::o;43549:79::-;43588:7;43617:5;43606:16;;43549:79;;;:::o;43634:157::-;43739:45;43759:24;43777:5;43759:24;:::i;:::-;43739:45;:::i;:::-;43734:3;43727:58;43634:157;;:::o;43797:94::-;43830:8;43878:5;43874:2;43870:14;43849:35;;43797:94;;;:::o;43897:::-;43936:7;43965:20;43979:5;43965:20;:::i;:::-;43954:31;;43897:94;;;:::o;43997:100::-;44036:7;44065:26;44085:5;44065:26;:::i;:::-;44054:37;;43997:100;;;:::o;44103:157::-;44208:45;44228:24;44246:5;44228:24;:::i;:::-;44208:45;:::i;:::-;44203:3;44196:58;44103:157;;:::o;44266:151::-;44406:3;44402:1;44394:6;44390:14;44383:27;44266:151;:::o;44423:400::-;44583:3;44604:84;44686:1;44681:3;44604:84;:::i;:::-;44597:91;;44697:93;44786:3;44697:93;:::i;:::-;44815:1;44810:3;44806:11;44799:18;;44423:400;;;:::o;44829:663::-;45070:3;45085:75;45156:3;45147:6;45085:75;:::i;:::-;45185:2;45180:3;45176:12;45169:19;;45198:75;45269:3;45260:6;45198:75;:::i;:::-;45298:2;45293:3;45289:12;45282:19;;45318:148;45462:3;45318:148;:::i;:::-;45311:155;;45483:3;45476:10;;44829:663;;;;;:::o;45498:180::-;45546:77;45543:1;45536:88;45643:4;45640:1;45633:15;45667:4;45664:1;45657:15;45684:176;45716:1;45733:20;45751:1;45733:20;:::i;:::-;45728:25;;45767:20;45785:1;45767:20;:::i;:::-;45762:25;;45806:1;45796:35;;45811:18;;:::i;:::-;45796:35;45852:1;45849;45845:9;45840:14;;45684:176;;;;:::o;45866:151::-;46006:3;46002:1;45994:6;45990:14;45983:27;45866:151;:::o;46023:400::-;46183:3;46204:84;46286:1;46281:3;46204:84;:::i;:::-;46197:91;;46297:93;46386:3;46297:93;:::i;:::-;46415:1;46410:3;46406:11;46399:18;;46023:400;;;:::o;46429:663::-;46670:3;46685:75;46756:3;46747:6;46685:75;:::i;:::-;46785:2;46780:3;46776:12;46769:19;;46798:75;46869:3;46860:6;46798:75;:::i;:::-;46898:2;46893:3;46889:12;46882:19;;46918:148;47062:3;46918:148;:::i;:::-;46911:155;;47083:3;47076:10;;46429:663;;;;;:::o;47098:151::-;47238:3;47234:1;47226:6;47222:14;47215:27;47098:151;:::o;47255:400::-;47415:3;47436:84;47518:1;47513:3;47436:84;:::i;:::-;47429:91;;47529:93;47618:3;47529:93;:::i;:::-;47647:1;47642:3;47638:11;47631:18;;47255:400;;;:::o;47661:663::-;47902:3;47917:75;47988:3;47979:6;47917:75;:::i;:::-;48017:2;48012:3;48008:12;48001:19;;48030:75;48101:3;48092:6;48030:75;:::i;:::-;48130:2;48125:3;48121:12;48114:19;;48150:148;48294:3;48150:148;:::i;:::-;48143:155;;48315:3;48308:10;;47661:663;;;;;:::o;48330:151::-;48470:3;48466:1;48458:6;48454:14;48447:27;48330:151;:::o;48487:400::-;48647:3;48668:84;48750:1;48745:3;48668:84;:::i;:::-;48661:91;;48761:93;48850:3;48761:93;:::i;:::-;48879:1;48874:3;48870:11;48863:18;;48487:400;;;:::o;48893:663::-;49134:3;49149:75;49220:3;49211:6;49149:75;:::i;:::-;49249:2;49244:3;49240:12;49233:19;;49262:75;49333:3;49324:6;49262:75;:::i;:::-;49362:2;49357:3;49353:12;49346:19;;49382:148;49526:3;49382:148;:::i;:::-;49375:155;;49547:3;49540:10;;48893:663;;;;;:::o;49562:151::-;49702:3;49698:1;49690:6;49686:14;49679:27;49562:151;:::o;49719:400::-;49879:3;49900:84;49982:1;49977:3;49900:84;:::i;:::-;49893:91;;49993:93;50082:3;49993:93;:::i;:::-;50111:1;50106:3;50102:11;50095:18;;49719:400;;;:::o;50125:663::-;50366:3;50381:75;50452:3;50443:6;50381:75;:::i;:::-;50481:2;50476:3;50472:12;50465:19;;50494:75;50565:3;50556:6;50494:75;:::i;:::-;50594:2;50589:3;50585:12;50578:19;;50614:148;50758:3;50614:148;:::i;:::-;50607:155;;50779:3;50772:10;;50125:663;;;;;:::o;50794:151::-;50934:3;50930:1;50922:6;50918:14;50911:27;50794:151;:::o;50951:400::-;51111:3;51132:84;51214:1;51209:3;51132:84;:::i;:::-;51125:91;;51225:93;51314:3;51225:93;:::i;:::-;51343:1;51338:3;51334:11;51327:18;;50951:400;;;:::o;51357:663::-;51598:3;51613:75;51684:3;51675:6;51613:75;:::i;:::-;51713:2;51708:3;51704:12;51697:19;;51726:75;51797:3;51788:6;51726:75;:::i;:::-;51826:2;51821:3;51817:12;51810:19;;51846:148;51990:3;51846:148;:::i;:::-;51839:155;;52011:3;52004:10;;51357:663;;;;;:::o;52026:151::-;52166:3;52162:1;52154:6;52150:14;52143:27;52026:151;:::o;52183:400::-;52343:3;52364:84;52446:1;52441:3;52364:84;:::i;:::-;52357:91;;52457:93;52546:3;52457:93;:::i;:::-;52575:1;52570:3;52566:11;52559:18;;52183:400;;;:::o;52589:663::-;52830:3;52845:75;52916:3;52907:6;52845:75;:::i;:::-;52945:2;52940:3;52936:12;52929:19;;52958:75;53029:3;53020:6;52958:75;:::i;:::-;53058:2;53053:3;53049:12;53042:19;;53078:148;53222:3;53078:148;:::i;:::-;53071:155;;53243:3;53236:10;;52589:663;;;;;:::o;53258:151::-;53398:3;53394:1;53386:6;53382:14;53375:27;53258:151;:::o;53415:400::-;53575:3;53596:84;53678:1;53673:3;53596:84;:::i;:::-;53589:91;;53689:93;53778:3;53689:93;:::i;:::-;53807:1;53802:3;53798:11;53791:18;;53415:400;;;:::o;53821:663::-;54062:3;54077:75;54148:3;54139:6;54077:75;:::i;:::-;54177:2;54172:3;54168:12;54161:19;;54190:75;54261:3;54252:6;54190:75;:::i;:::-;54290:2;54285:3;54281:12;54274:19;;54310:148;54454:3;54310:148;:::i;:::-;54303:155;;54475:3;54468:10;;53821:663;;;;;:::o;54490:168::-;54630:16;54626:1;54618:6;54614:14;54607:40;54490:168;:::o;54668:418::-;54828:3;54853:85;54935:2;54930:3;54853:85;:::i;:::-;54846:92;;54951:93;55040:3;54951:93;:::i;:::-;55073:2;55068:3;55064:12;55057:19;;54668:418;;;:::o;55096:152::-;55236:4;55232:1;55224:6;55220:14;55213:28;55096:152;:::o;55254:400::-;55414:3;55435:84;55517:1;55512:3;55435:84;:::i;:::-;55428:91;;55528:93;55617:3;55528:93;:::i;:::-;55646:1;55641:3;55637:11;55630:18;;55254:400;;;:::o;55660:807::-;55994:3;56016:148;56160:3;56016:148;:::i;:::-;56009:155;;56181:95;56272:3;56263:6;56181:95;:::i;:::-;56174:102;;56293:148;56437:3;56293:148;:::i;:::-;56286:155;;56458:3;56451:10;;55660:807;;;;:::o;56473:1395::-;56941:3;56963:95;57054:3;57045:6;56963:95;:::i;:::-;56956:102;;57075:95;57166:3;57157:6;57075:95;:::i;:::-;57068:102;;57187:95;57278:3;57269:6;57187:95;:::i;:::-;57180:102;;57299:95;57390:3;57381:6;57299:95;:::i;:::-;57292:102;;57411:95;57502:3;57493:6;57411:95;:::i;:::-;57404:102;;57523:95;57614:3;57605:6;57523:95;:::i;:::-;57516:102;;57635:95;57726:3;57717:6;57635:95;:::i;:::-;57628:102;;57747:95;57838:3;57829:6;57747:95;:::i;:::-;57740:102;;57859:3;57852:10;;56473:1395;;;;;;;;;;;:::o;57874:1715::-;58438:3;58460:95;58551:3;58542:6;58460:95;:::i;:::-;58453:102;;58572:95;58663:3;58654:6;58572:95;:::i;:::-;58565:102;;58684:95;58775:3;58766:6;58684:95;:::i;:::-;58677:102;;58796:95;58887:3;58878:6;58796:95;:::i;:::-;58789:102;;58908:95;58999:3;58990:6;58908:95;:::i;:::-;58901:102;;59020:95;59111:3;59102:6;59020:95;:::i;:::-;59013:102;;59132:95;59223:3;59214:6;59132:95;:::i;:::-;59125:102;;59244:95;59335:3;59326:6;59244:95;:::i;:::-;59237:102;;59356:95;59447:3;59438:6;59356:95;:::i;:::-;59349:102;;59468:95;59559:3;59550:6;59468:95;:::i;:::-;59461:102;;59580:3;59573:10;;57874:1715;;;;;;;;;;;;;:::o;59595:185::-;59635:1;59652:20;59670:1;59652:20;:::i;:::-;59647:25;;59686:20;59704:1;59686:20;:::i;:::-;59681:25;;59725:1;59715:35;;59730:18;;:::i;:::-;59715:35;59772:1;59769;59765:9;59760:14;;59595:185;;;;:::o

Swarm Source

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