Contract 0xefB4F583B2b6F0E8C658Dd7675E356D8a30Ac7FF 3

Token Contract 
 

Contract Overview

Happies: HAPPIES Token
Balance:
0.110281182000000005 Ether

EtherValue:
$135.96 (@ $1,232.86/ETH)

Token:
 
Txn Hash
Method
Block
From
To
Value
0xdb882daaa76c5ecdd959b410dae48477b694a2f45299e07b556c9f0ad85b2875Safe Transfer Fr...161101162022-12-04 8:00:353 days 13 hrs ago0x4767d4db19f96fab31e66f6ecd85a4cdc09504bc IN  Happies: HAPPIES Token0 Ether0.00073149 12.29142125
0xdcb40bbbeee9473547d5459c1ad0713b196feb0a94bb09c837bc893fbaa0f4b8Set Approval For...160870322022-12-01 2:40:476 days 18 hrs ago0xca4f3d2a6454f61c9d73c29ca3c81cc2fb9cff98 IN  Happies: HAPPIES Token0 Ether0.00056078 12.16981398
0x84c950e6a4ab21dde280325644de7a7ae877ed4c839d54555c8fed181da36cedSet Approval For...160615992022-11-27 13:23:2310 days 8 hrs ago0x336277635ec7ac49f341778209ad248fdd12617e IN  Happies: HAPPIES Token0 Ether0.00048836 10.59810972
0xf54400147fd0ff60722c94947946e724a562f9378d0db68bfe2254163a7c8827Set Approval For...160481102022-11-25 16:12:1112 days 5 hrs ago0x3a5fc2e0d7df18108473d928fc9512250eee7846 IN  Happies: HAPPIES Token0 Ether0.00025871 10.70502123
0x322e964b1bda911e34a5b74c6fbe4014ad1e9076385da5ce99abb2bdb75c769dSet Approval For...160107262022-11-20 10:47:3517 days 10 hrs agoENS Name geekerz.eth IN  Happies: HAPPIES Token0 Ether0.00051799 11.22080927
0x73e6a2801de814bb651de6b5973a63f7c3b341ad4964c631523ebaf2b8ec4472Set Approval For...159884152022-11-17 8:01:2320 days 13 hrs ago0x9642eeaf065af5f70c5f1b3c90bd94126bab7424 IN  Happies: HAPPIES Token0 Ether0.00072957 15.83271527
0x2b75c40664c7a52faece8e136e78389c45d7207afe93e5547d873ffd5c134b88Set Approval For...159694602022-11-14 16:26:3523 days 4 hrs ago0xfe67fc74e3845a8352000d20a3aa200cf4e963c3 IN  Happies: HAPPIES Token0 Ether0.00097074 21.06661178
0xd0b0a4197722ee81f07d63cd2b2300d65b646e025d7ea5dd55e1935be986a902Set Approval For...159425082022-11-10 22:09:2326 days 23 hrs ago0x4001be91c1585ec8765f12fcefbad107390a0e34 IN  Happies: HAPPIES Token0 Ether0.00105582 22.91288094
0x49597ac45ccc80f375797b8df22059be93fdff5ddfb260faa566fa59240a9fb8Set Approval For...158997372022-11-04 22:47:5932 days 22 hrs agoENS Name mferjpegs.eth IN  Happies: HAPPIES Token0 Ether0.00059101 12.80245273
0x22f8a7186c2864c783acfc5624bbbc2dd44c9f053be2e8142ec33cc50a9e5a34Set Approval For...158643182022-10-30 23:59:5937 days 21 hrs ago0x35dde7e6dbcc3ec146ee34c37d4ce616662b058a IN  Happies: HAPPIES Token0 Ether0.00021067 8.68688478
0xed91d329c98bd31f3a0392db3eed03c71ada58419272597989d1d0a8c13dc82aSet Approval For...158472792022-10-28 14:52:3540 days 6 hrs ago0x8de9f7e78fb5beea2ad6e3a333ba4f0669d9c594 IN  Happies: HAPPIES Token0 Ether0.00037783 15.57952136
0x34187dc62eb08fbe874de16f3b3a082eb38327595c4da84e1a461d4aa367d4c7Set Approval For...158463162022-10-28 11:39:3540 days 9 hrs agoENS Name 220284.eth IN  Happies: HAPPIES Token0 Ether0.00025765 10.62396137
0x74d0efd8dafe54a55c1fdff2a859d0d5981c5d591d2695cdfea1b8313c2ef359Set Approval For...158073462022-10-23 0:52:4745 days 20 hrs agoENS Name whirldly.eth IN  Happies: HAPPIES Token0 Ether0.00066172 14.36025057
0x432d2b7ad706199c7a6390d69ea37f2e76260226c90ae1987a022f45ff9fab58Safe Transfer Fr...157827942022-10-19 14:37:2349 days 6 hrs ago0x1a5608dc7fd33f6fae04d85ebcf02e28f36c3c23 IN  Happies: HAPPIES Token0 Ether0.00141097 23.45491215
0x77013ea97d60c601a7fc17d52579c8296d551fe22755c33c861821767cea5437Set Approval For...157736932022-10-18 8:06:5950 days 13 hrs agoENS Name zemez.eth IN  Happies: HAPPIES Token0 Ether0.00034477 14.21641748
0x0e1bc0387e380f5a9f37be9ce4af0995dcd3fcdc274210de1ff7fe06e54ffde6Safe Transfer Fr...157491772022-10-14 21:56:4753 days 23 hrs agoENS Name mferjpegs.eth IN  Happies: HAPPIES Token0 Ether0.00117505 18.22774178
0x2c992219d51eb027a7c8cbefd34f799b1fd8cc910fb535c6c376ad95984a7c9aSet Approval For...157444642022-10-14 6:09:1154 days 15 hrs ago0x8191956a439f33b8bed1273dcf13ff8e234b31b4 IN  Happies: HAPPIES Token0 Ether0.00071993 15.62362483
0x4c5bfa209469526c263e119d53bf17e2b3683e4306156149efa8ae1ecee823f8Set Approval For...157114262022-10-09 15:27:1159 days 5 hrs ago0x0da562934f9edb7d13d053a59425fb04de3e7dcc IN  Happies: HAPPIES Token0 Ether0.00105702 22.93896413
0xf490f2969b88e134e55a00a5409c416a9be6e91fb9557bcbf1f1ed0cb9afc559Set Approval For...156883802022-10-06 10:10:5962 days 11 hrs ago0xd89e7fd2748cb3aff7d882083d51007f9eb624d2 IN  Happies: HAPPIES Token0 Ether0.00026463 5.7324478
0xb409e28c9179532ad3fb4bbce500c8d2d648dbf4e2dff20cca7d68652748c7c7Set Approval For...156881352022-10-06 9:21:3562 days 12 hrs agoENS Name 0xay.eth IN  Happies: HAPPIES Token0 Ether0.00016315 6.72750469
0x7efbaeae3d5dfb700567195728c0f469f0062105bae4a57f4e06dea463adc340Set Approval For...156637792022-10-02 23:34:2365 days 21 hrs agoENS Name alexliong.eth IN  Happies: HAPPIES Token0 Ether0.0001943 8.03987056
0x2ae4ab041c5869fed7535a56192cc05517193bd07f2b5e2392fee51dff861994Set Approval For...156101752022-09-25 11:45:5973 days 9 hrs ago0x60b91dd29689b1be954929225200f2f6bd3011bb IN  Happies: HAPPIES Token0 Ether0.00025065 9.54790445
0x3905a5b16c379f0aa7562a522c164969de3e82e09fc9756c3d72479d2bed071bSet Approval For...156101742022-09-25 11:45:4773 days 9 hrs ago0x60b91dd29689b1be954929225200f2f6bd3011bb IN  Happies: HAPPIES Token0 Ether0.00023874 9.84453825
0xd06a58923cd8564bde1d652b8559db7d4a3e3e070cb50c58492a29b3e6ab6f0fSet Approval For...156061312022-09-24 22:14:1173 days 23 hrs agoENS Name justinstucks.eth IN  Happies: HAPPIES Token0 Ether0.00022619 4.90877636
0xb5345fd1b9b3db6f894e57a18d1a9883267bd0ea9da97b2d074b8bce550c8f05Set Approval For...155885722022-09-22 11:26:1176 days 9 hrs ago0x5949678bb53ec4bf5e73a4add1fd781fb781dbbe IN  Happies: HAPPIES Token0 Ether0.00027685 6.00819331
[ Download CSV Export 

OVERVIEW

The Happies™ | Free Mint | All Art Created with Microsoft Paint | CC0 The year is 2022. The world has been thrown violently into a bear market; tensions are at an all-time high and depression in the crypto and NFT space is bubbling under the surface.Then, in t...

Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xe782aff1d3f81d80d4b1c9bc7233c92b8f08fddce4e8d258f5f988e7e09d3f9c160908932022-12-01 15:36:596 days 5 hrs ago Rarible: Exchange Proxy Happies: HAPPIES Token0.000069 Ether
0x85c14731f75b1ff418b6a46ea4f60e20e090cb49913cb24dde770df8089f50b9159514382022-11-12 4:06:1125 days 17 hrs ago Seaport 1.1 Happies: HAPPIES Token0.001242 Ether
0x3ce32e58f3ed50869fd05f00c8eba199ab33e2fd21df6952d180b2866b993219159032352022-11-05 10:31:2332 days 10 hrs ago Seaport 1.1 Happies: HAPPIES Token0.000276 Ether
0x6f25c61008041a2fa9e155cab39c4af35ffb0ea2d7251c15f0024d8a3d100ddd157473432022-10-14 15:48:1154 days 5 hrs ago Seaport 1.1 Happies: HAPPIES Token0.000069 Ether
0xfacfaef8d14263e325f12d87549a39afce1371e6405c10bcf4f8d17d22192486155003822022-09-09 3:04:3389 days 18 hrs ago Rarible: Exchange Proxy Happies: HAPPIES Token0.00069 Ether
0xdcfd572961d17c534308dd1b2b2824669b0460fe220e6f7ab5768680dc762dc5154809472022-09-06 0:36:2592 days 20 hrs ago Seaport 1.1 Happies: HAPPIES Token0.0001932 Ether
0xc274b0f23ca3a969d6de5c88ce02a63bb24c4d6b6e1b915c4e831430a3ae0ba5154509392022-09-01 5:06:4497 days 16 hrs ago Seaport 1.1 Happies: HAPPIES Token0.000345 Ether
0x4f1d7c22ba3a07a58a823368de6b92bbc7583c13165f808a95c15358c803f8aa154452272022-08-31 7:12:1598 days 14 hrs ago Seaport 1.1 Happies: HAPPIES Token0.000138 Ether
0x18b61fb615b1c0f581dd2ad9ff1b796577d0f3b65ae8ad6c00103ae60b43ea03154402562022-08-30 12:00:5199 days 9 hrs ago Seaport 1.1 Happies: HAPPIES Token0.000069 Ether
0x40ce9ea1c5739ccae65ed66efa4d82edd9cbea8ba6a3414166f35f57f44c5ae0154148912022-08-26 10:42:12103 days 10 hrs ago Seaport 1.1 Happies: HAPPIES Token0.000138 Ether
0x8bc49ab7146bc60515eede51cddcd69bcbd974bf51afe6c5c821639ae0e07ee6154148892022-08-26 10:41:27103 days 10 hrs ago Seaport 1.1 Happies: HAPPIES Token0.0000069 Ether
0xa085252e75c2a584ef73c9144f77d8a86dc31ff9fcb54351f05f7d0a9a43a860153900522022-08-22 11:43:03107 days 9 hrs ago Seaport 1.1 Happies: HAPPIES Token0.000138 Ether
0xefbcbcb6d295263080122503e19027ae6dd52be512ad5a6b5cdde98a8225f5c4153874852022-08-22 1:48:40107 days 19 hrs ago Seaport 1.1 Happies: HAPPIES Token0.000207 Ether
0x78838b521cb6c17da4893f6facd95381cce8b797388e0b374050df01433fb3dc153824742022-08-21 6:47:27108 days 14 hrs ago Seaport 1.1 Happies: HAPPIES Token0.0001656 Ether
0x337100fe07da8733dc69ef922b989eb6570da8af680b0d1f0e9d1eede1df0eb7153808152022-08-21 0:31:16108 days 20 hrs ago Seaport 1.1 Happies: HAPPIES Token0.001794 Ether
0x2bda11f38c7322c33f67eadb02e00fbd26d2601d5f846962bb0b61f85419f68d153676382022-08-18 22:28:15110 days 22 hrs ago Seaport 1.1 Happies: HAPPIES Token0.0001725 Ether
0xb15dd71b080c34befee080a761634a34cb912fdd4edabf062307203f7ad1f726153669042022-08-18 19:44:19111 days 1 hr ago Seaport 1.1 Happies: HAPPIES Token0.000138 Ether
0x977791c766fec75eeb5172e55a3a62e59c087b690867d518ad9f74df3446a236153650632022-08-18 12:42:01111 days 8 hrs ago Seaport 1.1 Happies: HAPPIES Token0.00025875 Ether
0x68e835313820e973cba5dc09e23e90eee1e9fd129ee3145f2b29f5f33b764411153272752022-08-12 13:38:10117 days 7 hrs ago Seaport 1.1 Happies: HAPPIES Token0.00090907 Ether
0xc2e3978ed15c04353a3878b2d010d14a985bc796ec3b3e14f766f6c63651a6e1153114652022-08-10 1:28:17119 days 19 hrs ago Seaport 1.1 Happies: HAPPIES Token0.0002001 Ether
0x1b98e63b1fd18ce9312f2ffc5186cc1f4ff77e237ef7fa57f990abe5de2a1825153002372022-08-08 7:33:16121 days 13 hrs ago Seaport 1.1 Happies: HAPPIES Token0.0001656 Ether
0xf49657b599faa391d65cb4064c42381f98c15000d66531dbb68a1178cd0bfaa9152968432022-08-07 18:33:16122 days 2 hrs ago X2Y2: Exchange Happies: HAPPIES Token0.000276 Ether
0xf49657b599faa391d65cb4064c42381f98c15000d66531dbb68a1178cd0bfaa9152968432022-08-07 18:33:16122 days 2 hrs ago Seaport 1.1 Happies: HAPPIES Token0.0003519 Ether
0x75aac2735881fc79620857a060775e391acd79b7841f2f9118ecb4beb154422c152733032022-08-04 2:45:36125 days 18 hrs ago Seaport 1.1 Happies: HAPPIES Token0.0001932 Ether
0x7feb76dbf8948e8fd24ad802ba9d617e09e6b9204ccc8b4db68580ff053cc949152654252022-08-02 21:14:08127 days 9 mins ago Seaport 1.1 Happies: HAPPIES Token0.000483 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Happies

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 40 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/*
  __    __                            __
 |  \  |  \                          |  \
 | ▓▓  | ▓▓ ______   ______   ______  \▓▓ ______   _______
 | ▓▓__| ▓▓|      \ /      \ /      \|  \/      \ /       \
 | ▓▓    ▓▓ \▓▓▓▓▓▓\  ▓▓▓▓▓▓\  ▓▓▓▓▓▓\ ▓▓  ▓▓▓▓▓▓\  ▓▓▓▓▓▓▓
 | ▓▓▓▓▓▓▓▓/      ▓▓ ▓▓  | ▓▓ ▓▓  | ▓▓ ▓▓ ▓▓    ▓▓\▓▓    \
 | ▓▓  | ▓▓  ▓▓▓▓▓▓▓ ▓▓__/ ▓▓ ▓▓__/ ▓▓ ▓▓ ▓▓▓▓▓▓▓▓_\▓▓▓▓▓▓\
 | ▓▓  | ▓▓\▓▓    ▓▓ ▓▓    ▓▓ ▓▓    ▓▓ ▓▓\▓▓     \       ▓▓
  \▓▓   \▓▓ \▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓| ▓▓▓▓▓▓▓ \▓▓ \▓▓▓▓▓▓▓\▓▓▓▓▓▓▓
                   | ▓▓     | ▓▓
                   | ▓▓     | ▓▓
                    \▓▓      \▓▓
by
 ╔╗  ╔╗         ╔╗  ╔╗    ╔═══╗ ╔╗       ╔╗              ╔════╗╔═╗╔═╗
 ║╚╗╔╝║         ║║  ║║    ║╔═╗║╔╝╚╗      ║║              ║╔╗╔╗║║║╚╝║║
 ╚╗╚╝╔╝╔══╗╔══╗ ║╚═╗║║    ║╚══╗╚╗╔╝╔╗╔╗╔═╝║╔╗╔══╗╔══╗    ╚╝║║╚╝║╔╗╔╗║
  ╚╗╔╝ ║╔╗║╚ ╗║ ║╔╗║╚╝    ╚══╗║ ║║ ║║║║║╔╗║╠╣║╔╗║║══╣      ║║  ║║║║║║
   ║║  ║║═╣║╚╝╚╗║║║║╔╗    ║╚═╝║ ║╚╗║╚╝║║╚╝║║║║╚╝║╠══║     ╔╝╚╗ ║║║║║║
   ╚╝  ╚══╝╚═══╝╚╝╚╝╚╝    ╚═══╝ ╚═╝╚══╝╚══╝╚╝╚══╝╚══╝     ╚══╝ ╚╝╚╝╚╝
contract by
 ██╗      █████╗ ██████╗ ██╗  ██╗██╗███╗   ██╗
 ██║     ██╔══██╗██╔══██╗██║ ██╔╝██║████╗  ██║
 ██║     ███████║██████╔╝█████╔╝ ██║██╔██╗ ██║
 ██║     ██╔══██║██╔══██╗██╔═██╗ ██║██║╚██╗██║
 ███████╗██║  ██║██║  ██║██║  ██╗██║██║ ╚████║
 ╚══════╝╚═╝  ╚═╝╚═╝  ╚═╝╚═╝  ╚═╝╚═╝╚═╝  ╚═══╝
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.14;

// Sources flattened with hardhat v2.9.6 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)



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


// File @openzeppelin/contracts/interfaces/[email protected]


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)



/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}


// File erc721a/contracts/[email protected]


// ERC721A Contracts v4.0.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();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File erc721a/contracts/[email protected]


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



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

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

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

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

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

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

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

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

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

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

    // The tokenId of the next token to be minted.
    uint256 private _currentIndex;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (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 auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> BITPOS_AUX);
    }

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

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

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

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

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

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

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

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

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            getApproved(tokenId) == _msgSenderERC721A());

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

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

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

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

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

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED |
                BITMASK_NEXT_INITIALIZED;

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

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

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

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

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

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

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

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

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

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


// File @openzeppelin/contracts/token/ERC20/[email protected]


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)



/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}


// File @openzeppelin/contracts/utils/[email protected]


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



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

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


// File @openzeppelin/contracts/access/[email protected]


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



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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)



/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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


// File @openzeppelin/contracts/utils/[email protected]


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



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

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

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

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

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


// File contracts/Happies.sol

/*
 ▄▄   ▄▄ ▄▄▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄
█  █ █  █      █       █       █   █       █       █
█  █▄█  █  ▄   █    ▄  █    ▄  █   █    ▄▄▄█  ▄▄▄▄▄█
█       █ █▄█  █   █▄█ █   █▄█ █   █   █▄▄▄█ █▄▄▄▄▄
█   ▄   █      █    ▄▄▄█    ▄▄▄█   █    ▄▄▄█▄▄▄▄▄  █
█  █ █  █  ▄   █   █   █   █   █   █   █▄▄▄ ▄▄▄▄▄█ █
█▄▄█ █▄▄█▄█ █▄▄█▄▄▄█   █▄▄▄█   █▄▄▄█▄▄▄▄▄▄▄█▄▄▄▄▄▄▄█

contract by
 ██╗      █████╗ ██████╗ ██╗  ██╗██╗███╗   ██╗
 ██║     ██╔══██╗██╔══██╗██║ ██╔╝██║████╗  ██║
 ██║     ███████║██████╔╝█████╔╝ ██║██╔██╗ ██║
 ██║     ██╔══██║██╔══██╗██╔═██╗ ██║██║╚██╗██║
 ███████╗██║  ██║██║  ██║██║  ██╗██║██║ ╚████║
 ╚══════╝╚═╝  ╚═╝╚═╝  ╚═╝╚═╝  ╚═╝╚═╝╚═╝  ╚═══╝
*/


contract Happies is ERC721A, IERC2981, Ownable {
    using Strings for uint256;

    ///////////////////////////////////////////////////////////////////////////
    // Public constants
    ///////////////////////////////////////////////////////////////////////////
    uint256 constant public MAX_SUPPLY = 5000;
    uint256 constant public MAX_PER_WALLET = 10;

    ///////////////////////////////////////////////////////////////////////////
    // Important Globals
    ///////////////////////////////////////////////////////////////////////////
    uint256 public publicSaleTime = 1653746400;  // Sat May 28 2022 10:00:00 EST

    // how many has each address minted
    mapping (address => uint256) userMinted;

    string public provenance;
    string private baseURI = "ipfs://QmYuhQ8vCQPfjjpHd5KSQB79y4AdHkkjDGTK3nk8MnyY7G/";
    string private transformedBaseURI = "ipfs://QmYuhQ8vCQPfjjpHd5KSQB79y4AdHkkjDGTK3nk8MnyY7G/";

    ///////////////////////////////////////////////////////////////////////////
    // Team members and shares
    ///////////////////////////////////////////////////////////////////////////
    mapping(address => bool) private isTeam;

    address constant public LARKIN = 0x46E50dc219BA5A26890Dc99cDe4f4AC2a48011e9;

    // Team Addresses
    address[] private team = [
        0x05ed59e9765Ce11ACb387B66f91A99E1514ee7c8, // Pixel
        LARKIN                                    , // Larkin
        0x1BAcD207F29Ef028C5B761A686FFE6f6a385EF5F, // makerlee
        0xE62798584a153D5F9f2E5fA8993ad3Bfa42DF1BF, // makewayx
        0x3567Da988334B8AE8a8996E1dDaa82b656A7F6e9, // mustachi0
        0x12FF12Ab21B2C6E432158c5816F9CC1b6b2E2894  // Korey
    ];

    // Team wallet addresses
    //                            Pixel Larkin makerlee makewayx mustachi0 Korey
    uint256[] private teamShares = [30,     20,     15,      15,     10,     10];

    uint256 constant private TOTAL_SHARES = 100;


    // For EIP-2981 (royalties)
    bytes4 private constant INTERFACE_ID_ERC2981 = 0x2a55205a;
    uint256 constant private ROYALTIES_PERCENTAGE_X10 = 69;

    mapping (address => uint256[]) public burnedBy;  // tokens burned by a user

    uint256 public maxTransforms = 42;
    uint256 public transformPrice = 1 ether;
    uint256 public numTransformed;  // so far
    mapping (uint256 => bool) public transformed;  // is each token transformed?
    // optional boost to larkin's share of 'transform' payments
    uint256 private devTransformBoost = 10;  // this is a percentage, so 10 means 10%


    ///////////////////////////////////////////////////////////////////////////
    // Contract initialization
    ///////////////////////////////////////////////////////////////////////////
    constructor() ERC721A("Happies", "HAPPIES") {
        // Validate that the team size matches number of share buckets for mint and royalties
        uint256 teamSize = team.length;
        if (teamSize != teamShares.length) revert InvalidTeam(teamShares.length);

        // Validate that the number of teamShares match the expected for mint and royalties
        uint256 totalTeamShares;
        for (uint256 i; i < teamSize; ) {
            isTeam[team[i]] = true;
            unchecked {
                totalTeamShares += teamShares[i];
                ++i;
            }
        }
        if (totalTeamShares != TOTAL_SHARES) revert InvalidTeam(totalTeamShares);

        // mint first token ID to creator
        _safeMint(msg.sender, 1);
    }


    ///////////////////////////////////////////////////////////////////////////
    // Modifiers
    ///////////////////////////////////////////////////////////////////////////
    modifier onlyDev() {
        if (msg.sender != LARKIN) revert OnlyAllowedAddressCanDoThat(LARKIN);
        _;
    }
    modifier onlyTeam() {
        if (!isTeam[msg.sender]) revert OnlyTeamCanDoThat();
        _;
    }


    ///////////////////////////////////////////////////////////////////////////
    // Contract setup
    ///////////////////////////////////////////////////////////////////////////
    // The developer can change a team member (in case of emergency - wallet lost etc)
    function setTeamMember(uint256 index, address member) external onlyDev {
        require(member != address(0), "Cannot set team member to 0");
        require(index < team.length, "Invalid team member index");

        isTeam[team[index]] = false;  // remove team member
        team[index] = member; // relace team member
        isTeam[member] = true;
    }

    // Provenance hash proves that the team didn't play favorites with assigning tokenIds
    // for rare NFTs to specific addresses with a post-mint reveal
    function setProvenanceHash(string memory _provenanceHash) external onlyDev {
        provenance = _provenanceHash;
    }

    // Base IPFS URI that points to all metadata for the collection
    // It basically points to the IPFS folder containing all metadata.
    // So, if it points to ipfs://blah/, then tokenId 69 will have
    // metadata URI ipfs://blah/69
    //
    // The 'image' tag in the metadat for a tokenId points to its image's IPFS URI
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (tokenId >= _totalMinted()) revert TokenDNE(tokenId);

        string memory mBaseURI = transformed[tokenId] ? transformedBaseURI : baseURI;
        return bytes(mBaseURI).length > 0 ? string(abi.encodePacked(mBaseURI, tokenId.toString())) : "";
    }


    // Update the base URI (like to reveal)
    function setBaseURI(string memory _uri) external onlyDev {
        baseURI = _uri;
    }
    function setTransformedBaseURI(string memory _uri) external onlyDev {
        transformedBaseURI = _uri;
    }

    function setPublicSaleTime(uint256 _newTime) public onlyDev {
        publicSaleTime = _newTime;
    }
    function setMaxTransforms(uint256 _max) public onlyDev {
        maxTransforms = _max;
    }
    function setTransformPrice(uint256 _price) public onlyDev {
        transformPrice = _price;
    }
    function setDevTransformBoost(uint256 _boostPercent) public onlyDev {
        devTransformBoost = _boostPercent;
    }

    ///////////////////////////////////////////////////////////////////////////
    // Mint and Burn
    ///////////////////////////////////////////////////////////////////////////
    function mint(uint256 _amount) external {
        if (block.timestamp < publicSaleTime) revert MintClosed();
        if (_totalMinted() + _amount > MAX_SUPPLY) revert WouldPassSupplyCap(_totalMinted() + _amount);
        if (_numberMinted(msg.sender) + _amount > MAX_PER_WALLET) revert WalletCanOnlyMintNMore(MAX_PER_WALLET - _numberMinted(msg.sender));

        _safeMint(msg.sender, _amount);
    }

    function burn(uint256 _tokenId) external {
        if (ownerOf(_tokenId) != msg.sender) revert OnlyTokenOwnerCanDoThat(_tokenId, ownerOf(_tokenId));

        // Keep track of all tokens this address has burned
        burnedBy[msg.sender].push(_tokenId);
        _burn(_tokenId);
    }
    function getBurnedBy(address _by) external view returns (uint256[] memory) {
        return burnedBy[_by];
    }


    ///////////////////////////////////////////////////////////////////////////
    // Withdraw funds from contract
    ///////////////////////////////////////////////////////////////////////////
    // ETH is received for mint and royalties
    function withdrawETH() public onlyTeam {
        uint256 totalETH = address(this).balance;
        if (totalETH == 0) revert EmptyWithdraw();

        uint256 teamSize = team.length;
        for (uint256 i; i < teamSize; ) {
            address payable wallet = payable(team[i]);
            // How much is this wallet owed
            uint256 payment = (totalETH * teamShares[i]) / TOTAL_SHARES;
            // Send payment
            Address.sendValue(wallet, payment);

            unchecked { ++i; }
        }
        emit ETHWithdrawn(totalETH);
    }

    // Royalties in any ERC20 are accepted
    function withdrawERC20(IERC20 _token) public onlyTeam {
        uint256 totalERC20 = _token.balanceOf(address(this));
        if (totalERC20 == 0) revert EmptyWithdraw();

        uint256 teamSize = team.length;
        for (uint256 i; i < teamSize; ) {
            // How much is this wallet owed
            uint256 payment = (totalERC20 * teamShares[i]) / TOTAL_SHARES;
            // Send payment
            _token.transfer(team[i], payment);

            unchecked { ++i; }
        }
        emit ERC20Withdrawn(address(_token), totalERC20);
    }


    ///////////////////////////////////////////////////////////////////////////
    // Royalties - ERC2981
    ///////////////////////////////////////////////////////////////////////////
    // Supports ERC2981 for royalties as well as ofc 721 and 165
    function supportsInterface(bytes4 _interfaceId) public view override(ERC721A, IERC165) returns (bool) {
        return _interfaceId == INTERFACE_ID_ERC2981 || super.supportsInterface(_interfaceId);
    }

    // NFT marketplaces will call this function to determine amount of royalties
    // to charge and who to send them to
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address _receiver, uint256 _royaltyAmount) {
        _receiver = address(this);
        _royaltyAmount = (_salePrice * ROYALTIES_PERCENTAGE_X10) / 1000;
    }

    // ensure this contract can receive payments (royalties)
    receive() external payable { }


    ///////////////////////////////////////////////////////////////////////////
    // Custom functions
    ///////////////////////////////////////////////////////////////////////////
    function transform(uint256 _tokenId) public payable {
        if (msg.value != transformPrice) revert WrongTransformPrice(msg.value, transformPrice);
        if (ownerOf(_tokenId) != msg.sender) revert OnlyTokenOwnerCanDoThat(_tokenId, ownerOf(_tokenId));
        if (transformed[_tokenId]) revert AlreadyTransformed(_tokenId);
        if (numTransformed >= maxTransforms) revert TransformingEnded();

        // As dev, Larkin may get a bump in payments for transforms
        if (devTransformBoost > 0) {
            Address.sendValue(payable(LARKIN), msg.value * devTransformBoost / 100);
        }

        numTransformed += 1;
        transformed[_tokenId] = true;
        emit Transformed(_tokenId);
    }


    ///////////////////////////////////////////////////////////////////////////
    // Errors and Events
    ///////////////////////////////////////////////////////////////////////////
    error InvalidTeam(uint256 sizeOrShares);
    error OnlyTeamCanDoThat();
    error OnlyAllowedAddressCanDoThat(address allowed);
    error MintClosed();
    error WouldPassSupplyCap(uint256 wouldBeSupply);
    error WalletCanOnlyMintNMore(uint256 more);
    error EmptyWithdraw();
    error TokenDNE(uint256 tokenId);
    error OnlyTokenOwnerCanDoThat(uint256 tokenId, address owner);
    error WrongTransformPrice(uint256 payed, uint256 price);
    error AlreadyTransformed(uint256 tokenId);
    error TransformingEnded();

    event ETHWithdrawn(uint256 amount);
    event ERC20Withdrawn(address erc20, uint256 amount);
    event Transformed(uint256 tokenId);
}

/*
 Product of
 Yeah! Studios™ - @yeah_studios - yeahstudios.io - yeahstudios.eth

 Lead, Design, Branding: PixelPimp - @pixelpimp
 Solidity & React:       Larkin    - @CodeLarkin - codelarkin.eth
 Marketing:              makerlee  - @0xmakerlee - makerlee.eth
 Marketing:              mustachi0
 Genrative:              makewayx
 Social Media Manager:   Korey     - @ayeKorey


╔╗  ╔╗         ╔╗  ╔╗    ╔═══╗ ╔╗       ╔╗              ╔════╗╔═╗╔═╗
║╚╗╔╝║         ║║  ║║    ║╔═╗║╔╝╚╗      ║║              ║╔╗╔╗║║║╚╝║║
╚╗╚╝╔╝╔══╗╔══╗ ║╚═╗║║    ║╚══╗╚╗╔╝╔╗╔╗╔═╝║╔╗╔══╗╔══╗    ╚╝║║╚╝║╔╗╔╗║
 ╚╗╔╝ ║╔╗║╚ ╗║ ║╔╗║╚╝    ╚══╗║ ║║ ║║║║║╔╗║╠╣║╔╗║║══╣      ║║  ║║║║║║
  ║║  ║║═╣║╚╝╚╗║║║║╔╗    ║╚═╝║ ║╚╗║╚╝║║╚╝║║║║╚╝║╠══║     ╔╝╚╗ ║║║║║║
  ╚╝  ╚══╝╚═══╝╚╝╚╝╚╝    ╚═══╝ ╚═╝╚══╝╚══╝╚╝╚══╝╚══╝     ╚══╝ ╚╝╚╝╚╝

contract by:
 ██╗      █████╗ ██████╗ ██╗  ██╗██╗███╗   ██╗
 ██║     ██╔══██╗██╔══██╗██║ ██╔╝██║████╗  ██║
 ██║     ███████║██████╔╝█████╔╝ ██║██╔██╗ ██║
 ██║     ██╔══██║██╔══██╗██╔═██╗ ██║██║╚██╗██║
 ███████╗██║  ██║██║  ██║██║  ██╗██║██║ ╚████║
 ╚══════╝╚═╝  ╚═╝╚═╝  ╚═╝╚═╝  ╚═╝╚═╝╚═╝  ╚═══╝
*/

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"AlreadyTransformed","type":"error"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"EmptyWithdraw","type":"error"},{"inputs":[{"internalType":"uint256","name":"sizeOrShares","type":"uint256"}],"name":"InvalidTeam","type":"error"},{"inputs":[],"name":"MintClosed","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"allowed","type":"address"}],"name":"OnlyAllowedAddressCanDoThat","type":"error"},{"inputs":[],"name":"OnlyTeamCanDoThat","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"OnlyTokenOwnerCanDoThat","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenDNE","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"TransformingEnded","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[{"internalType":"uint256","name":"more","type":"uint256"}],"name":"WalletCanOnlyMintNMore","type":"error"},{"inputs":[{"internalType":"uint256","name":"wouldBeSupply","type":"uint256"}],"name":"WouldPassSupplyCap","type":"error"},{"inputs":[{"internalType":"uint256","name":"payed","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"WrongTransformPrice","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":false,"internalType":"address","name":"erc20","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20Withdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ETHWithdrawn","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transformed","type":"event"},{"inputs":[],"name":"LARKIN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"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":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"burnedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"_by","type":"address"}],"name":"getBurnedBy","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransforms","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTransformed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_royaltyAmount","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_boostPercent","type":"uint256"}],"name":"setDevTransformBoost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxTransforms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTime","type":"uint256"}],"name":"setPublicSaleTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"member","type":"address"}],"name":"setTeamMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setTransformPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setTransformedBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transform","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"transformPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"transformed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6362922ae060095560e0604052603660808181529062002ed760a03980516200003191600c91602090910190620005d7565b5060405180606001604052806036815260200162002ed76036913980516200006291600d91602090910190620005d7565b506040805160c0810182527305ed59e9765ce11acb387b66f91a99e1514ee7c881527346e50dc219ba5a26890dc99cde4f4ac2a48011e96020820152731bacd207f29ef028c5b761a686ffe6f6a385ef5f9181019190915273e62798584a153d5f9f2e5fa8993ad3bfa42df1bf6060820152733567da988334b8ae8a8996e1ddaa82b656a7f6e960808201527312ff12ab21b2c6e432158c5816f9cc1b6b2e289460a08201526200011890600f90600662000666565b506040805160c081018252601e815260146020820152600f9181018290526060810191909152600a6080820181905260a08201526200015c906010906006620006be565b50602a601255670de0b6b3a7640000601355600a6016553480156200018057600080fd5b50604051806040016040528060078152602001664861707069657360c81b815250604051806040016040528060078152602001664841505049455360c81b8152508160029080519060200190620001d9929190620005d7565b508051620001ef906003906020840190620005d7565b505060008055506200020133620002fe565b600f54601054811462000233576010546040516369754ba960e11b815260048101919091526024015b60405180910390fd5b6000805b82811015620002c2576001600e6000600f84815481106200025c576200025c62000718565b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff19169115159190911790556010805482908110620002a757620002a762000718565b90600052602060002001548201915080600101905062000237565b5060648114620002e9576040516369754ba960e11b8152600481018290526024016200022a565b620002f633600162000350565b505062000818565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620003728282604051806020016040528060008152506200037660201b60201c565b5050565b6000546001600160a01b038416620003a057604051622e076360e81b815260040160405180910390fd5b82600003620003c25760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b156200048e575b60405182906001600160a01b0388169060009060008051602062002f0d833981519152908290a460018201916200045390600090889087620004e3565b62000471576040516368d2bf6b60e11b815260040160405180910390fd5b808210620004165782600054146200048857600080fd5b620004c3565b5b6040516001830192906001600160a01b0388169060009060008051602062002f0d833981519152908290a48082106200048f575b506000908155620004dd908583866001600160e01b038516565b50505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906200051a9033908990889088906004016200072e565b6020604051808303816000875af192505050801562000558575060408051601f3d908101601f191682019092526200055591810190620007a9565b60015b620005ba573d80801562000589576040519150601f19603f3d011682016040523d82523d6000602084013e6200058e565b606091505b508051600003620005b2576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b828054620005e590620007dc565b90600052602060002090601f01602090048101928262000609576000855562000654565b82601f106200062457805160ff191683800117855562000654565b8280016001018555821562000654579182015b828111156200065457825182559160200191906001019062000637565b506200066292915062000701565b5090565b82805482825590600052602060002090810192821562000654579160200282015b828111156200065457825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000687565b82805482825590600052602060002090810192821562000654579160200282015b8281111562000654578251829060ff16905591602001919060010190620006df565b5b8082111562000662576000815560010162000702565b634e487b7160e01b600052603260045260246000fd5b600060018060a01b038087168352602081871681850152856040850152608060608501528451915081608085015260005b828110156200077d5785810182015185820160a0015281016200075f565b828111156200079057600060a084870101525b5050601f01601f19169190910160a00195945050505050565b600060208284031215620007bc57600080fd5b81516001600160e01b031981168114620007d557600080fd5b9392505050565b600181811c90821680620007f157607f821691505b6020821081036200081257634e487b7160e01b600052602260045260246000fd5b50919050565b6126af80620008286000396000f3fe6080604052600436106102155760003560e01c806370a0823111610119578063a0712d68116100a6578063a0712d68146105f2578063a22cb46514610612578063b88d4fde14610632578063c87b56dd14610652578063d9cd245314610672578063e086e5ec14610692578063e979806a146106a7578063e985e9c5146106c7578063eb9047bb14610710578063f2fde38b14610723578063f4f3b2001461074357600080fd5b806370a08231146104cb578063715018a6146104eb578063743262961461050057806377201fe4146105205780637cc4207a1461054057806380f28af3146105625780638a27034f146105825780638d36ba28146105b25780638da5cb5b146105c857806395d89b41146105dd57600080fd5b80632094e84d116101a25780632094e84d1461036e5780632344be0a1461038e57806323b872dd146103a45780632a55205a146103c457806332cb6b0c146103f257806335d532c91461040857806342842e0e1461043557806342966c68146104555780634e5d29031461047557806355f804b31461048b5780636352211e146104ab57600080fd5b806301ffc9a71461022157806306fdde0314610256578063081812fc14610278578063095ea7b3146102a55780630f2cdd6c146102c75780630f7309e8146102ea57806310969523146102ff57806311b7e5e71461031f578063170c9c5f1461033f57806318160ddd1461035557600080fd5b3661021c57005b600080fd5b34801561022d57600080fd5b5061024161023c36600461207b565b610763565b60405190151581526020015b60405180910390f35b34801561026257600080fd5b5061026b61078e565b60405161024d91906120f0565b34801561028457600080fd5b50610298610293366004612103565b610820565b60405161024d919061211c565b3480156102b157600080fd5b506102c56102c0366004612145565b610864565b005b3480156102d357600080fd5b506102dc600a81565b60405190815260200161024d565b3480156102f657600080fd5b5061026b610936565b34801561030b57600080fd5b506102c561031a3660046121fc565b6109c4565b34801561032b57600080fd5b506102c561033a366004612103565b610a22565b34801561034b57600080fd5b506102dc60145481565b34801561036157600080fd5b50600154600054036102dc565b34801561037a57600080fd5b506102dc610389366004612145565b610a65565b34801561039a57600080fd5b506102dc60095481565b3480156103b057600080fd5b506102c56103bf366004612244565b610a96565b3480156103d057600080fd5b506103e46103df366004612285565b610aa6565b60405161024d9291906122a7565b3480156103fe57600080fd5b506102dc61138881565b34801561041457600080fd5b506104286104233660046122c0565b610aca565b60405161024d91906122dd565b34801561044157600080fd5b506102c5610450366004612244565b610b36565b34801561046157600080fd5b506102c5610470366004612103565b610b51565b34801561048157600080fd5b506102dc60125481565b34801561049757600080fd5b506102c56104a63660046121fc565b610bcc565b3480156104b757600080fd5b506102986104c6366004612103565b610c1d565b3480156104d757600080fd5b506102dc6104e63660046122c0565b610c28565b3480156104f757600080fd5b506102c5610c76565b34801561050c57600080fd5b506102c561051b366004612103565b610cb1565b34801561052c57600080fd5b506102c561053b366004612103565b610cf4565b34801561054c57600080fd5b5061029860008051602061265a83398151915281565b34801561056e57600080fd5b506102c561057d366004612103565b610d37565b34801561058e57600080fd5b5061024161059d366004612103565b60156020526000908152604090205460ff1681565b3480156105be57600080fd5b506102dc60135481565b3480156105d457600080fd5b50610298610d7a565b3480156105e957600080fd5b5061026b610d89565b3480156105fe57600080fd5b506102c561060d366004612103565b610d98565b34801561061e57600080fd5b506102c561062d36600461232f565b610e5e565b34801561063e57600080fd5b506102c561064d366004612368565b610ef3565b34801561065e57600080fd5b5061026b61066d366004612103565b610f3d565b34801561067e57600080fd5b506102c561068d3660046121fc565b611065565b34801561069e57600080fd5b506102c56110b6565b3480156106b357600080fd5b506102c56106c23660046123e7565b6111c9565b3480156106d357600080fd5b506102416106e236600461240c565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6102c561071e366004612103565b611351565b34801561072f57600080fd5b506102c561073e3660046122c0565b6114a0565b34801561074f57600080fd5b506102c561075e3660046122c0565b61153d565b60006001600160e01b0319821663152a902d60e11b148061078857506107888261172d565b92915050565b60606002805461079d9061243a565b80601f01602080910402602001604051908101604052809291908181526020018280546107c99061243a565b80156108165780601f106107eb57610100808354040283529160200191610816565b820191906000526020600020905b8154815290600101906020018083116107f957829003601f168201915b5050505050905090565b600061082b8261177b565b610848576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061086f826117a2565b9050806001600160a01b0316836001600160a01b0316036108a35760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216146108da576108bd81336106e2565b6108da576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600b80546109439061243a565b80601f016020809104026020016040519081016040528092919081815260200182805461096f9061243a565b80156109bc5780601f10610991576101008083540402835291602001916109bc565b820191906000526020600020905b81548152906001019060200180831161099f57829003601f168201915b505050505081565b3360008051602061265a83398151915214610a0b5760008051602061265a833981519152604051631022f85d60e11b8152600401610a02919061211c565b60405180910390fd5b8051610a1e90600b906020840190611fcc565b5050565b3360008051602061265a83398151915214610a605760008051602061265a833981519152604051631022f85d60e11b8152600401610a02919061211c565b600955565b60116020528160005260406000208181548110610a8157600080fd5b90600052602060002001600091509150505481565b610aa1838383611809565b505050565b3060006103e8610ab760458561248a565b610ac191906124bf565b90509250929050565b6001600160a01b038116600090815260116020908152604091829020805483518184028101840190945280845260609392830182828015610b2a57602002820191906000526020600020905b815481526020019060010190808311610b16575b50505050509050919050565b610aa183838360405180602001604052806000815250610ef3565b33610b5b82610c1d565b6001600160a01b031614610b9e5780610b7382610c1d565b6040516326a5d68f60e11b815260048101929092526001600160a01b03166024820152604401610a02565b33600090815260116020908152604082208054600181018255908352912001819055610bc98161199e565b50565b3360008051602061265a83398151915214610c0a5760008051602061265a833981519152604051631022f85d60e11b8152600401610a02919061211c565b8051610a1e90600c906020840190611fcc565b6000610788826117a2565b60006001600160a01b038216610c51576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b33610c7f610d7a565b6001600160a01b031614610ca55760405162461bcd60e51b8152600401610a02906124d3565b610caf60006119a9565b565b3360008051602061265a83398151915214610cef5760008051602061265a833981519152604051631022f85d60e11b8152600401610a02919061211c565b601655565b3360008051602061265a83398151915214610d325760008051602061265a833981519152604051631022f85d60e11b8152600401610a02919061211c565b601255565b3360008051602061265a83398151915214610d755760008051602061265a833981519152604051631022f85d60e11b8152600401610a02919061211c565b601355565b6008546001600160a01b031690565b60606003805461079d9061243a565b600954421015610dbb5760405163589ed34b60e01b815260040160405180910390fd5b61138881610dc860005490565b610dd29190612508565b1115610e085780610de260005490565b610dec9190612508565b604051630c540f2160e01b8152600401610a0291815260200190565b600a81610e14336119fb565b610e1e9190612508565b1115610e5457610e2d336119fb565b610e3890600a612520565b6040516302c0c8bd60e11b8152600401610a0291815260200190565b610bc93382611a23565b336001600160a01b03831603610e875760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610efe848484611809565b6001600160a01b0383163b15610f3757610f1a84848484611a3d565b610f37576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610f4860005490565b8210610f6a57604051631e39122160e11b815260048101839052602401610a02565b60008281526015602052604081205460ff16610f8757600c610f8a565b600d5b8054610f959061243a565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc19061243a565b801561100e5780601f10610fe35761010080835404028352916020019161100e565b820191906000526020600020905b815481529060010190602001808311610ff157829003601f168201915b505050505090506000815111611033576040518060200160405280600081525061105e565b8061103d84611b29565b60405160200161104e929190612537565b6040516020818303038152906040525b9392505050565b3360008051602061265a833981519152146110a35760008051602061265a833981519152604051631022f85d60e11b8152600401610a02919061211c565b8051610a1e90600d906020840190611fcc565b336000908152600e602052604090205460ff166110e657604051634f88b4f560e11b815260040160405180910390fd5b476000819003611109576040516308ae8bb160e41b815260040160405180910390fd5b600f5460005b81811015611191576000600f828154811061112c5761112c612566565b6000918252602082200154601080546001600160a01b0390921693506064918590811061115b5761115b612566565b906000526020600020015486611171919061248a565b61117b91906124bf565b90506111878282611c29565b505060010161110f565b506040518281527f043f607a14d3b4f0a11a0b2e192bbfcd894298ba5abf22553be6081406db28aa9060200160405180910390a15050565b3360008051602061265a833981519152146112075760008051602061265a833981519152604051631022f85d60e11b8152600401610a02919061211c565b6001600160a01b03811661125b5760405162461bcd60e51b815260206004820152601b60248201527a043616e6e6f7420736574207465616d206d656d62657220746f203602c1b6044820152606401610a02565b600f5482106112a85760405162461bcd60e51b8152602060048201526019602482015278092dcecc2d8d2c840e8cac2da40dacadac4cae440d2dcc8caf603b1b6044820152606401610a02565b6000600e6000600f85815481106112c1576112c1612566565b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff1916911515919091179055600f80548291908490811061130c5761130c612566565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055929091168152600e90915260409020805460ff1916600117905550565b601354341461138057601354604051637998543b60e01b81523460048201526024810191909152604401610a02565b3361138a82610c1d565b6001600160a01b0316146113a25780610b7382610c1d565b60008181526015602052604090205460ff16156113d55760405163d39ab56360e01b815260048101829052602401610a02565b601254601454106113f9576040516332d2dafb60e11b815260040160405180910390fd5b601654156114325761143260008051602061265a833981519152606460165434611423919061248a565b61142d91906124bf565b611c29565b6001601460008282546114459190612508565b909155505060008181526015602052604090819020805460ff19166001179055517f51dba42a71b99e344e4141f74c8d409d50613b760cbe5360262c20260c39b428906114959083815260200190565b60405180910390a150565b336114a9610d7a565b6001600160a01b0316146114cf5760405162461bcd60e51b8152600401610a02906124d3565b6001600160a01b0381166115345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a02565b610bc9816119a9565b336000908152600e602052604090205460ff1661156d57604051634f88b4f560e11b815260040160405180910390fd5b6040516370a0823160e01b81526000906001600160a01b038316906370a082319061159c90309060040161211c565b602060405180830381865afa1580156115b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115dd919061257c565b905080600003611600576040516308ae8bb160e41b815260040160405180910390fd5b600f5460005b818110156116ee57600060646010838154811061162557611625612566565b90600052602060002001548561163b919061248a565b61164591906124bf565b9050846001600160a01b031663a9059cbb600f848154811061166957611669612566565b6000918252602090912001546040516001600160e01b031960e084901b1681526116a1916001600160a01b03169085906004016122a7565b6020604051808303816000875af11580156116c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e49190612595565b5050600101611606565b507f7e2c99819371db0a6fc6f4269fe872496e44f502df19ba3eae594b7a1598746083836040516117209291906122a7565b60405180910390a1505050565b60006301ffc9a760e01b6001600160e01b03198316148061175e57506380ac58cd60e01b6001600160e01b03198316145b806107885750506001600160e01b031916635b5e139f60e01b1490565b6000805482108015610788575050600090815260046020526040902054600160e01b161590565b6000816000548110156117f05760008181526004602052604081205490600160e01b821690036117ee575b8060000361105e5750600019016000818152600460205260409020546117cd565b505b604051636f96cda160e11b815260040160405180910390fd5b6000611814826117a2565b9050836001600160a01b0316816001600160a01b0316146118475760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611865575061186585336106e2565b8061188057503361187584610820565b6001600160a01b0316145b9050806118a057604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0384166118c757604051633a954ecd60e21b815260040160405180910390fd5b600083815260066020908152604080832080546001600160a01b03191690556001600160a01b038881168452600583528184208054600019019055871683528083208054600101905585835260049091528120600160e11b4260a01b8717811790915583169003611968576001830160008181526004602052604081205490036119665760005481146119665760008181526004602052604090208390555b505b82846001600160a01b0316866001600160a01b031660008051602061263a83398151915260405160405180910390a45050505050565b610bc9816000611d3f565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03166000908152600560205260409081902054901c6001600160401b031690565b610a1e828260405180602001604052806000815250611e7c565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611a729033908990889088906004016125b2565b6020604051808303816000875af1925050508015611aad575060408051601f3d908101601f19168201909252611aaa918101906125ef565b60015b611b0b573d808015611adb576040519150601f19603f3d011682016040523d82523d6000602084013e611ae0565b606091505b508051600003611b03576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606081600003611b505750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611b7a5780611b648161260c565b9150611b739050600a836124bf565b9150611b54565b6000816001600160401b03811115611b9457611b94612171565b6040519080825280601f01601f191660200182016040528015611bbe576020820181803683370190505b5090505b8415611b2157611bd3600183612520565b9150611be0600a86612625565b611beb906030612508565b60f81b818381518110611c0057611c00612566565b60200101906001600160f81b031916908160001a905350611c22600a866124bf565b9450611bc2565b80471015611c795760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a02565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611cc6576040519150601f19603f3d011682016040523d82523d6000602084013e611ccb565b606091505b5050905080610aa15760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c20726044820152791958da5c1a595b9d081b585e481a185d99481c995d995c9d195960321b6064820152608401610a02565b6000611d4a836117a2565b9050808215611dae576000336001600160a01b0383161480611d715750611d7182336106e2565b80611d8c575033611d8186610820565b6001600160a01b0316145b905080611dac57604051632ce44b5f60e11b815260040160405180910390fd5b505b600084815260066020908152604080832080546001600160a01b03191690556001600160a01b03841683526005825280832080546001600160801b0301905586835260049091528120600360e01b4260a01b8417179055600160e11b83169003611e4857600184016000818152600460205260408120549003611e46576000548114611e465760008181526004602052604090208390555b505b60405184906000906001600160a01b0384169060008051602061263a833981519152908390a4505060018054810190555050565b6000546001600160a01b038416611ea557604051622e076360e81b815260040160405180910390fd5b82600003611ec65760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b15611f89575b60405182906001600160a01b0388169060009060008051602061263a833981519152908290a4611f526000878480600101955087611a3d565b611f6f576040516368d2bf6b60e11b815260040160405180910390fd5b808210611f19578260005414611f8457600080fd5b611fbc565b5b6040516001830192906001600160a01b0388169060009060008051602061263a833981519152908290a4808210611f8a575b506000908155610f379085838684565b828054611fd89061243a565b90600052602060002090601f016020900481019282611ffa5760008555612040565b82601f1061201357805160ff1916838001178555612040565b82800160010185558215612040579182015b82811115612040578251825591602001919060010190612025565b5061204c929150612050565b5090565b5b8082111561204c5760008155600101612051565b6001600160e01b031981168114610bc957600080fd5b60006020828403121561208d57600080fd5b813561105e81612065565b60005b838110156120b357818101518382015260200161209b565b83811115610f375750506000910152565b600081518084526120dc816020860160208601612098565b601f01601f19169290920160200192915050565b60208152600061105e60208301846120c4565b60006020828403121561211557600080fd5b5035919050565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114610bc957600080fd5b6000806040838503121561215857600080fd5b823561216381612130565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b03808411156121a1576121a1612171565b604051601f8501601f19908116603f011681019082821181831017156121c9576121c9612171565b816040528093508581528686860111156121e257600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561220e57600080fd5b81356001600160401b0381111561222457600080fd5b8201601f8101841361223557600080fd5b611b2184823560208401612187565b60008060006060848603121561225957600080fd5b833561226481612130565b9250602084013561227481612130565b929592945050506040919091013590565b6000806040838503121561229857600080fd5b50508035926020909101359150565b6001600160a01b03929092168252602082015260400190565b6000602082840312156122d257600080fd5b813561105e81612130565b6020808252825182820181905260009190848201906040850190845b81811015612315578351835292840192918401916001016122f9565b50909695505050505050565b8015158114610bc957600080fd5b6000806040838503121561234257600080fd5b823561234d81612130565b9150602083013561235d81612321565b809150509250929050565b6000806000806080858703121561237e57600080fd5b843561238981612130565b9350602085013561239981612130565b92506040850135915060608501356001600160401b038111156123bb57600080fd5b8501601f810187136123cc57600080fd5b6123db87823560208401612187565b91505092959194509250565b600080604083850312156123fa57600080fd5b82359150602083013561235d81612130565b6000806040838503121561241f57600080fd5b823561242a81612130565b9150602083013561235d81612130565b600181811c9082168061244e57607f821691505b60208210810361246e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156124a4576124a4612474565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826124ce576124ce6124a9565b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000821982111561251b5761251b612474565b500190565b60008282101561253257612532612474565b500390565b60008351612549818460208801612098565b83519083019061255d818360208801612098565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561258e57600080fd5b5051919050565b6000602082840312156125a757600080fd5b815161105e81612321565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906125e5908301846120c4565b9695505050505050565b60006020828403121561260157600080fd5b815161105e81612065565b60006001820161261e5761261e612474565b5060010190565b600082612634576126346124a9565b50069056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef00000000000000000000000046e50dc219ba5a26890dc99cde4f4ac2a48011e9a26469706673582212203acefceca66f34233f08e061eb9c879f0fd31d8cdfb388b98696d6088755e48b64736f6c634300080e0033697066733a2f2f516d597568513876435150666a6a704864354b535142373979344164486b6b6a4447544b336e6b384d6e795937472fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

Deployed ByteCode Sourcemap

61308:11542:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70357:205;;;;;;;;;;-1:-1:-1;70357:205:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;70357:205:0;;;;;;;;22668:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24736:204::-;;;;;;;;;;-1:-1:-1;24736:204:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24196:474::-;;;;;;;;;;-1:-1:-1;24196:474:0;;;;;:::i;:::-;;:::i;:::-;;61631:43;;;;;;;;;;;;61672:2;61631:43;;;;;2338:25:1;;;2326:2;2311:18;61631:43:0;2192:177:1;62044:24:0;;;;;;;;;;;;;:::i;66096:122::-;;;;;;;;;;-1:-1:-1;66096:122:0;;;;;:::i;:::-;;:::i;67191:104::-;;;;;;;;;;-1:-1:-1;67191:104:0;;;;;:::i;:::-;;:::i;63618:29::-;;;;;;;;;;;;;;;;16709:315;;;;;;;;;;-1:-1:-1;16975:12:0;;16762:7;16959:13;:28;16709:315;;63449:46;;;;;;;;;;-1:-1:-1;63449:46:0;;;;;:::i;:::-;;:::i;61871:42::-;;;;;;;;;;;;;;;;25622:170;;;;;;;;;;-1:-1:-1;25622:170:0;;;;;:::i;:::-;;:::i;70694:258::-;;;;;;;;;;-1:-1:-1;70694:258:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;61583:41::-;;;;;;;;;;;;61620:4;61583:41;;68530:114;;;;;;;;;;-1:-1:-1;68530:114:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;25863:185::-;;;;;;;;;;-1:-1:-1;25863:185:0;;;;;:::i;:::-;;:::i;68233:291::-;;;;;;;;;;-1:-1:-1;68233:291:0;;;;;:::i;:::-;;:::i;63532:33::-;;;;;;;;;;;;;;;;66975:90;;;;;;;;;;-1:-1:-1;66975:90:0;;;;;:::i;:::-;;:::i;22457:144::-;;;;;;;;;;-1:-1:-1;22457:144:0;;;;;:::i;:::-;;:::i;18334:224::-;;;;;;;;;;-1:-1:-1;18334:224:0;;;;;:::i;:::-;;:::i;48350:103::-;;;;;;;;;;;;;:::i;67507:120::-;;;;;;;;;;-1:-1:-1;67507:120:0;;;;;:::i;:::-;;:::i;67301:94::-;;;;;;;;;;-1:-1:-1;67301:94:0;;;;;:::i;:::-;;:::i;62506:75::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;62506:75:0;;67401:100;;;;;;;;;;-1:-1:-1;67401:100:0;;;;;:::i;:::-;;:::i;63665:44::-;;;;;;;;;;-1:-1:-1;63665:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;63572:39;;;;;;;;;;;;;;;;47699:87;;;;;;;;;;;;;:::i;22837:104::-;;;;;;;;;;;;;:::i;67819:406::-;;;;;;;;;;-1:-1:-1;67819:406:0;;;;;:::i;:::-;;:::i;25012:308::-;;;;;;;;;;-1:-1:-1;25012:308:0;;;;;:::i;:::-;;:::i;26119:396::-;;;;;;;;;;-1:-1:-1;26119:396:0;;;;;:::i;:::-;;:::i;66563:357::-;;;;;;;;;;-1:-1:-1;66563:357:0;;;;;:::i;:::-;;:::i;67071:112::-;;;;;;;;;;-1:-1:-1;67071:112:0;;;;;:::i;:::-;;:::i;68900:572::-;;;;;;;;;;;;;:::i;65563:366::-;;;;;;;;;;-1:-1:-1;65563:366:0;;;;;:::i;:::-;;:::i;25391:164::-;;;;;;;;;;-1:-1:-1;25391:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;25512:25:0;;;25488:4;25512:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25391:164;71249:725;;;;;;:::i;:::-;;:::i;48608:201::-;;;;;;;;;;-1:-1:-1;48608:201:0;;;;;:::i;:::-;;:::i;69524:567::-;;;;;;;;;;-1:-1:-1;69524:567:0;;;;;:::i;:::-;;:::i;70357:205::-;70453:4;-1:-1:-1;;;;;;70477:36:0;;-1:-1:-1;;;70477:36:0;;:77;;;70517:37;70541:12;70517:23;:37::i;:::-;70470:84;70357:205;-1:-1:-1;;70357:205:0:o;22668:100::-;22722:13;22755:5;22748:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22668:100;:::o;24736:204::-;24804:7;24829:16;24837:7;24829;:16::i;:::-;24824:64;;24854:34;;-1:-1:-1;;;24854:34:0;;;;;;;;;;;24824:64;-1:-1:-1;24908:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24908:24:0;;24736:204::o;24196:474::-;24269:13;24301:27;24320:7;24301:18;:27::i;:::-;24269:61;;24351:5;-1:-1:-1;;;;;24345:11:0;:2;-1:-1:-1;;;;;24345:11:0;;24341:48;;24365:24;;-1:-1:-1;;;24365:24:0;;;;;;;;;;;24341:48;40838:10;-1:-1:-1;;;;;24406:28:0;;;24402:175;;24454:44;24471:5;40838:10;25391:164;:::i;24454:44::-;24449:128;;24526:35;;-1:-1:-1;;;24526:35:0;;;;;;;;;;;24449:128;24589:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;24589:29:0;-1:-1:-1;;;;;24589:29:0;;;;;;;;;24634:28;;24589:24;;24634:28;;;;;;;24258:412;24196:474;;:::o;62044:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66096:122::-;65088:10;-1:-1:-1;;;;;;;;;;;65088:20:0;65084:68;;-1:-1:-1;;;;;;;;;;;65117:35:0;;-1:-1:-1;;;65117:35:0;;;;;;;;:::i;:::-;;;;;;;;65084:68;66182:28;;::::1;::::0;:10:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;:::-;;66096:122:::0;:::o;67191:104::-;65088:10;-1:-1:-1;;;;;;;;;;;65088:20:0;65084:68;;-1:-1:-1;;;;;;;;;;;65117:35:0;;-1:-1:-1;;;65117:35:0;;;;;;;;:::i;65084:68::-;67262:14:::1;:25:::0;67191:104::o;63449:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25622:170::-;25756:28;25766:4;25772:2;25776:7;25756:9;:28::i;:::-;25622:170;;;:::o;70694:258::-;70865:4;70791:17;70940:4;70899:37;63438:2;70899:10;:37;:::i;:::-;70898:46;;;;:::i;:::-;70881:63;;70694:258;;;;;:::o;68530:114::-;-1:-1:-1;;;;;68623:13:0;;;;;;:8;:13;;;;;;;;;68616:20;;;;;;;;;;;;;;;;;68587:16;;68616:20;;;68623:13;68616:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68530:114;;;:::o;25863:185::-;26001:39;26018:4;26024:2;26028:7;26001:39;;;;;;;;;;;;:16;:39::i;68233:291::-;68310:10;68289:17;68297:8;68289:7;:17::i;:::-;-1:-1:-1;;;;;68289:31:0;;68285:96;;68353:8;68363:17;68371:8;68363:7;:17::i;:::-;68329:52;;-1:-1:-1;;;68329:52:0;;;;;8892:25:1;;;;-1:-1:-1;;;;;8953:32:1;8933:18;;;8926:60;8865:18;;68329:52:0;8718:274:1;68285:96:0;68464:10;68455:20;;;;:8;:20;;;;;;;:35;;;;;;;;;;;;;;;;68501:15;68481:8;68501:5;:15::i;:::-;68233:291;:::o;66975:90::-;65088:10;-1:-1:-1;;;;;;;;;;;65088:20:0;65084:68;;-1:-1:-1;;;;;;;;;;;65117:35:0;;-1:-1:-1;;;65117:35:0;;;;;;;;:::i;65084:68::-;67043:14;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;22457:144::-:0;22521:7;22564:27;22583:7;22564:18;:27::i;18334:224::-;18398:7;-1:-1:-1;;;;;18422:19:0;;18418:60;;18450:28;;-1:-1:-1;;;18450:28:0;;;;;;;;;;;18418:60;-1:-1:-1;;;;;;18496:25:0;;;;;:18;:25;;;;;;-1:-1:-1;;;;;18496:54:0;;18334:224::o;48350:103::-;40838:10;47919:7;:5;:7::i;:::-;-1:-1:-1;;;;;47919:23:0;;47911:68;;;;-1:-1:-1;;;47911:68:0;;;;;;;:::i;:::-;48415:30:::1;48442:1;48415:18;:30::i;:::-;48350:103::o:0;67507:120::-;65088:10;-1:-1:-1;;;;;;;;;;;65088:20:0;65084:68;;-1:-1:-1;;;;;;;;;;;65117:35:0;;-1:-1:-1;;;65117:35:0;;;;;;;;:::i;65084:68::-;67586:17:::1;:33:::0;67507:120::o;67301:94::-;65088:10;-1:-1:-1;;;;;;;;;;;65088:20:0;65084:68;;-1:-1:-1;;;;;;;;;;;65117:35:0;;-1:-1:-1;;;65117:35:0;;;;;;;;:::i;65084:68::-;67367:13:::1;:20:::0;67301:94::o;67401:100::-;65088:10;-1:-1:-1;;;;;;;;;;;65088:20:0;65084:68;;-1:-1:-1;;;;;;;;;;;65117:35:0;;-1:-1:-1;;;65117:35:0;;;;;;;;:::i;65084:68::-;67470:14:::1;:23:::0;67401:100::o;47699:87::-;47772:6;;-1:-1:-1;;;;;47772:6:0;;47699:87::o;22837:104::-;22893:13;22926:7;22919:14;;;;;:::i;67819:406::-;67892:14;;67874:15;:32;67870:57;;;67915:12;;-1:-1:-1;;;67915:12:0;;;;;;;;;;;67870:57;61620:4;67959:7;67942:14;17169:7;17357:13;;17122:285;67942:14;:24;;;;:::i;:::-;:37;67938:94;;;68024:7;68007:14;17169:7;17357:13;;17122:285;68007:14;:24;;;;:::i;:::-;67988:44;;-1:-1:-1;;;67988:44:0;;;;;;2338:25:1;;2326:2;2311:18;;2192:177;67938:94:0;61672:2;68075:7;68047:25;68061:10;68047:13;:25::i;:::-;:35;;;;:::i;:::-;:52;68043:131;;;68148:25;68162:10;68148:13;:25::i;:::-;68131:42;;61672:2;68131:42;:::i;:::-;68108:66;;-1:-1:-1;;;68108:66:0;;;;;;2338:25:1;;2326:2;2311:18;;2192:177;68043:131:0;68187:30;68197:10;68209:7;68187:9;:30::i;25012:308::-;40838:10;-1:-1:-1;;;;;25111:31:0;;;25107:61;;25151:17;;-1:-1:-1;;;25151:17:0;;;;;;;;;;;25107:61;40838:10;25181:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;25181:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;25181:60:0;;;;;;;;;;25257:55;;540:41:1;;;25181:49:0;;40838:10;25257:55;;513:18:1;25257:55:0;;;;;;;25012:308;;:::o;26119:396::-;26286:28;26296:4;26302:2;26306:7;26286:9;:28::i;:::-;-1:-1:-1;;;;;26329:14:0;;;:19;26325:183;;26368:56;26399:4;26405:2;26409:7;26418:5;26368:30;:56::i;:::-;26363:145;;26452:40;;-1:-1:-1;;;26452:40:0;;;;;;;;;;;26363:145;26119:396;;;;:::o;66563:357::-;66636:13;66677:14;17169:7;17357:13;;17122:285;66677:14;66666:7;:25;66662:55;;66700:17;;-1:-1:-1;;;66700:17:0;;;;;2338:25:1;;;2311:18;;66700:17:0;2192:177:1;66662:55:0;66730:22;66755:20;;;:11;:20;;;;;;;;:51;;66799:7;66755:51;;;66778:18;66755:51;66730:76;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66849:1;66830:8;66824:22;:26;:88;;;;;;;;;;;;;;;;;66877:8;66887:18;:7;:16;:18::i;:::-;66860:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66824:88;66817:95;66563:357;-1:-1:-1;;;66563:357:0:o;67071:112::-;65088:10;-1:-1:-1;;;;;;;;;;;65088:20:0;65084:68;;-1:-1:-1;;;;;;;;;;;65117:35:0;;-1:-1:-1;;;65117:35:0;;;;;;;;:::i;65084:68::-;67150:25;;::::1;::::0;:18:::1;::::0;:25:::1;::::0;::::1;::::0;::::1;:::i;68900:572::-:0;65221:10;65214:18;;;;:6;:18;;;;;;;;65209:51;;65241:19;;-1:-1:-1;;;65241:19:0;;;;;;;;;;;65209:51;68969:21:::1;68950:16;69005:13:::0;;;69001:41:::1;;69027:15;;-1:-1:-1::0;;;69027:15:0::1;;;;;;;;;;;69001:41;69074:4;:11:::0;69055:16:::1;69096:331;69116:8;69112:1;:12;69096:331;;;69143:22;69176:4;69181:1;69176:7;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;69274:10:::1;:13:::0;;-1:-1:-1;;;;;69176:7:0;;::::1;::::0;-1:-1:-1;63275:3:0::1;::::0;69285:1;;69274:13;::::1;;;;;:::i;:::-;;;;;;;;;69263:8;:24;;;;:::i;:::-;69262:41;;;;:::i;:::-;69244:59;;69347:34;69365:6;69373:7;69347:17;:34::i;:::-;-1:-1:-1::0;;69410:3:0::1;;69096:331;;;-1:-1:-1::0;69442:22:0::1;::::0;2338:25:1;;;69442:22:0::1;::::0;2326:2:1;2311:18;69442:22:0::1;;;;;;;68939:533;;68900:572::o:0;65563:366::-;65088:10;-1:-1:-1;;;;;;;;;;;65088:20:0;65084:68;;-1:-1:-1;;;;;;;;;;;65117:35:0;;-1:-1:-1;;;65117:35:0;;;;;;;;:::i;65084:68::-;-1:-1:-1;;;;;65653:20:0;::::1;65645:60;;;::::0;-1:-1:-1;;;65645:60:0;;10430:2:1;65645:60:0::1;::::0;::::1;10412:21:1::0;10469:2;10449:18;;;10442:30;-1:-1:-1;;;10488:18:1;;;10481:57;10555:18;;65645:60:0::1;10228:351:1::0;65645:60:0::1;65732:4;:11:::0;65724:19;::::1;65716:57;;;::::0;-1:-1:-1;;;65716:57:0;;10786:2:1;65716:57:0::1;::::0;::::1;10768:21:1::0;10825:2;10805:18;;;10798:30;-1:-1:-1;;;10844:18:1;;;10837:55;10909:18;;65716:57:0::1;10584:349:1::0;65716:57:0::1;65808:5;65786:6;:19;65793:4;65798:5;65793:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;::::0;-1:-1:-1;;;;;65793:11:0::1;65786:19:::0;;;::::1;::::0;;;;;;;;:27;;-1:-1:-1;;65786:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;65847:4:::1;:11:::0;;65861:6;;65847:4;65852:5;;65847:11;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:20:::0;;-1:-1:-1;;;;;;65847:20:0::1;-1:-1:-1::0;;;;;65847:20:0;;::::1;;::::0;;65900:14;;;::::1;::::0;;:6:::1;:14:::0;;;;;;:21;;-1:-1:-1;;65900:21:0::1;-1:-1:-1::0;65900:21:0::1;::::0;;-1:-1:-1;65563:366:0:o;71249:725::-;71329:14;;71316:9;:27;71312:86;;71383:14;;71352:46;;-1:-1:-1;;;71352:46:0;;71372:9;71352:46;;;11112:25:1;11153:18;;;11146:34;;;;11085:18;;71352:46:0;10938:248:1;71312:86:0;71434:10;71413:17;71421:8;71413:7;:17::i;:::-;-1:-1:-1;;;;;71413:31:0;;71409:96;;71477:8;71487:17;71495:8;71487:7;:17::i;71409:96::-;71520:21;;;;:11;:21;;;;;;;;71516:62;;;71550:28;;-1:-1:-1;;;71550:28:0;;;;;2338:25:1;;;2311:18;;71550:28:0;2192:177:1;71516:62:0;71611:13;;71593:14;;:31;71589:63;;71633:19;;-1:-1:-1;;;71633:19:0;;;;;;;;;;;71589:63;71738:17;;:21;71734:125;;71776:71;-1:-1:-1;;;;;;;;;;;71843:3:0;71823:17;;71811:9;:29;;;;:::i;:::-;:35;;;;:::i;:::-;71776:17;:71::i;:::-;71889:1;71871:14;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;71901:21:0;;;;:11;:21;;;;;;;:28;;-1:-1:-1;;71901:28:0;71925:4;71901:28;;;71945:21;;;;;71913:8;2338:25:1;;2326:2;2311:18;;2192:177;71945:21:0;;;;;;;;71249:725;:::o;48608:201::-;40838:10;47919:7;:5;:7::i;:::-;-1:-1:-1;;;;;47919:23:0;;47911:68;;;;-1:-1:-1;;;47911:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48697:22:0;::::1;48689:73;;;::::0;-1:-1:-1;;;48689:73:0;;11393:2:1;48689:73:0::1;::::0;::::1;11375:21:1::0;11432:2;11412:18;;;11405:30;11471:34;11451:18;;;11444:62;-1:-1:-1;;;11522:18:1;;;11515:36;11568:19;;48689:73:0::1;11191:402:1::0;48689:73:0::1;48773:28;48792:8;48773:18;:28::i;69524:567::-:0;65221:10;65214:18;;;;:6;:18;;;;;;;;65209:51;;65241:19;;-1:-1:-1;;;65241:19:0;;;;;;;;;;;65209:51;69610:31:::1;::::0;-1:-1:-1;;;69610:31:0;;69589:18:::1;::::0;-1:-1:-1;;;;;69610:16:0;::::1;::::0;::::1;::::0;:31:::1;::::0;69635:4:::1;::::0;69610:31:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69589:52;;69656:10;69670:1;69656:15:::0;69652:43:::1;;69680:15;;-1:-1:-1::0;;;69680:15:0::1;;;;;;;;;;;69652:43;69727:4;:11:::0;69708:16:::1;69749:276;69769:8;69765:1;:12;69749:276;;;69841:15;63275:3;69873:10;69884:1;69873:13;;;;;;;;:::i;:::-;;;;;;;;;69860:10;:26;;;;:::i;:::-;69859:43;;;;:::i;:::-;69841:61;;69946:6;-1:-1:-1::0;;;;;69946:15:0::1;;69962:4;69967:1;69962:7;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;69946:33:::1;::::0;-1:-1:-1;;;;;;69946:33:0::1;::::0;;;;;;::::1;::::0;-1:-1:-1;;;;;69962:7:0::1;::::0;69971;;69946:33:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;70008:3:0::1;;69749:276;;;;70040:43;70063:6;70072:10;70040:43;;;;;;;:::i;:::-;;;;;;;;69578:513;;69524:567:::0;:::o;17655:615::-;17740:4;-1:-1:-1;;;;;;;;;18040:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;18117:25:0;;;18040:102;:179;;;-1:-1:-1;;;;;;;;18194:25:0;-1:-1:-1;;;18194:25:0;;17655:615::o;26770:273::-;26827:4;26917:13;;26907:7;:23;26864:152;;;;-1:-1:-1;;26968:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;26968:43:0;:48;;26770:273::o;19972:1129::-;20039:7;20074;20176:13;;20169:4;:20;20165:869;;;20214:14;20231:23;;;:17;:23;;;;;;;-1:-1:-1;;;20320:23:0;;:28;;20316:699;;20839:113;20846:6;20856:1;20846:11;20839:113;;-1:-1:-1;;;20917:6:0;20899:25;;;;:17;:25;;;;;;20839:113;;20316:699;20191:843;20165:869;21062:31;;-1:-1:-1;;;21062:31:0;;;;;;;;;;;32009:2515;32124:27;32154;32173:7;32154:18;:27::i;:::-;32124:57;;32239:4;-1:-1:-1;;;;;32198:45:0;32214:19;-1:-1:-1;;;;;32198:45:0;;32194:86;;32252:28;;-1:-1:-1;;;32252:28:0;;;;;;;;;;;32194:86;32293:22;40838:10;-1:-1:-1;;;;;32319:27:0;;;;:87;;-1:-1:-1;32363:43:0;32380:4;40838:10;25391:164;:::i;32363:43::-;32319:147;;;-1:-1:-1;40838:10:0;32423:20;32435:7;32423:11;:20::i;:::-;-1:-1:-1;;;;;32423:43:0;;32319:147;32293:174;;32485:17;32480:66;;32511:35;;-1:-1:-1;;;32511:35:0;;;;;;;;;;;32480:66;-1:-1:-1;;;;;32561:16:0;;32557:52;;32586:23;;-1:-1:-1;;;32586:23:0;;;;;;;;;;;32557:52;32738:24;;;;:15;:24;;;;;;;;32731:31;;-1:-1:-1;;;;;;32731:31:0;;;-1:-1:-1;;;;;33130:24:0;;;;;:18;:24;;;;;33128:26;;-1:-1:-1;;33128:26:0;;;33199:22;;;;;;;33197:24;;-1:-1:-1;33197:24:0;;;33492:26;;;:17;:26;;;;;-1:-1:-1;;;33580:15:0;14333:3;33580:41;33538:84;;:128;;33492:174;;;33786:46;;:51;;33782:626;;33890:1;33880:11;;33858:19;34013:30;;;:17;:30;;;;;;:35;;34009:384;;34151:13;;34136:11;:28;34132:242;;34298:30;;;;:17;:30;;;;;:52;;;34132:242;33839:569;33782:626;34455:7;34451:2;-1:-1:-1;;;;;34436:27:0;34445:4;-1:-1:-1;;;;;34436:27:0;-1:-1:-1;;;;;;;;;;;34436:27:0;;;;;;;;;32113:2411;;32009:2515;;;:::o;34602:89::-;34662:21;34668:7;34677:5;34662;:21::i;48969:191::-;49062:6;;;-1:-1:-1;;;;;49079:17:0;;;-1:-1:-1;;;;;;49079:17:0;;;;;;;49112:40;;49062:6;;;49079:17;49062:6;;49112:40;;49043:16;;49112:40;49032:128;48969:191;:::o;18640:176::-;-1:-1:-1;;;;;18729:25:0;18701:7;18729:25;;;:18;:25;;13816:2;18729:25;;;;;:49;;-1:-1:-1;;;;;18728:80:0;;18640:176::o;27127:104::-;27196:27;27206:2;27210:8;27196:27;;;;;;;;;;;;:9;:27::i;38220:716::-;38404:88;;-1:-1:-1;;;38404:88:0;;38383:4;;-1:-1:-1;;;;;38404:45:0;;;;;:88;;40838:10;;38471:4;;38477:7;;38486:5;;38404:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38404:88:0;;;;;;;;-1:-1:-1;;38404:88:0;;;;;;;;;;;;:::i;:::-;;;38400:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38687:6;:13;38704:1;38687:18;38683:235;;38733:40;;-1:-1:-1;;;38733:40:0;;;;;;;;;;;38683:235;38876:6;38870:13;38861:6;38857:2;38853:15;38846:38;38400:529;-1:-1:-1;;;;;;38563:64:0;-1:-1:-1;;;38563:64:0;;-1:-1:-1;38400:529:0;38220:716;;;;;;:::o;58005:723::-;58061:13;58282:5;58291:1;58282:10;58278:53;;-1:-1:-1;;58309:10:0;;;;;;;;;;;;-1:-1:-1;;;58309:10:0;;;;;58005:723::o;58278:53::-;58356:5;58341:12;58397:78;58404:9;;58397:78;;58430:8;;;;:::i;:::-;;-1:-1:-1;58453:10:0;;-1:-1:-1;58461:2:0;58453:10;;:::i;:::-;;;58397:78;;;58485:19;58517:6;-1:-1:-1;;;;;58507:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58507:17:0;;58485:39;;58535:154;58542:10;;58535:154;;58569:11;58579:1;58569:11;;:::i;:::-;;-1:-1:-1;58638:10:0;58646:2;58638:5;:10;:::i;:::-;58625:24;;:2;:24;:::i;:::-;58612:39;;58595:6;58602;58595:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;58595:56:0;;;;;;;;-1:-1:-1;58666:11:0;58675:2;58666:11;;:::i;:::-;;;58535:154;;51646:317;51761:6;51736:21;:31;;51728:73;;;;-1:-1:-1;;;51728:73:0;;13244:2:1;51728:73:0;;;13226:21:1;13283:2;13263:18;;;13256:30;13322:31;13302:18;;;13295:59;13371:18;;51728:73:0;13042:353:1;51728:73:0;51815:12;51833:9;-1:-1:-1;;;;;51833:14:0;51855:6;51833:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51814:52;;;51885:7;51877:78;;;;-1:-1:-1;;;51877:78:0;;13812:2:1;51877:78:0;;;13794:21:1;13851:2;13831:18;;;13824:30;13890:34;13870:18;;;13863:62;-1:-1:-1;;;13941:18:1;;;13934:56;14007:19;;51877:78:0;13610:422:1;34920:2808:0;35000:27;35030;35049:7;35030:18;:27::i;:::-;35000:57;-1:-1:-1;35000:57:0;35135:311;;;;35169:22;40838:10;-1:-1:-1;;;;;35195:27:0;;;;:91;;-1:-1:-1;35243:43:0;35260:4;40838:10;25391:164;:::i;35243:43::-;35195:155;;;-1:-1:-1;40838:10:0;35307:20;35319:7;35307:11;:20::i;:::-;-1:-1:-1;;;;;35307:43:0;;35195:155;35169:182;;35373:17;35368:66;;35399:35;;-1:-1:-1;;;35399:35:0;;;;;;;;;;;35368:66;35154:292;35135:311;35582:24;;;;:15;:24;;;;;;;;35575:31;;-1:-1:-1;;;;;;35575:31:0;;;-1:-1:-1;;;;;36195:24:0;;;;:18;:24;;;;;:59;;-1:-1:-1;;;;;36195:59:0;;;36492:26;;;:17;:26;;;;;-1:-1:-1;;;36582:15:0;14333:3;36582:41;36538:86;;:164;36492:210;;-1:-1:-1;;;36822:46:0;;:51;;36818:626;;36926:1;36916:11;;36894:19;37049:30;;;:17;:30;;;;;;:35;;37045:384;;37187:13;;37172:11;:28;37168:242;;37334:30;;;;:17;:30;;;;;:52;;;37168:242;36875:569;36818:626;37472:35;;37499:7;;37495:1;;-1:-1:-1;;;;;37472:35:0;;;-1:-1:-1;;;;;;;;;;;37472:35:0;37495:1;;37472:35;-1:-1:-1;;37695:12:0;:14;;;;;;-1:-1:-1;;34920:2808:0:o;27604:2236::-;27727:20;27750:13;-1:-1:-1;;;;;27778:16:0;;27774:48;;27803:19;;-1:-1:-1;;;27803:19:0;;;;;;;;;;;27774:48;27837:8;27849:1;27837:13;27833:44;;27859:18;;-1:-1:-1;;;27859:18:0;;;;;;;;;;;27833:44;-1:-1:-1;;;;;28426:22:0;;;;;;:18;:22;;;;13816:2;28426:22;;;:70;;28464:31;28452:44;;28426:70;;;28739:31;;;:17;:31;;;;;28832:15;14333:3;28832:41;28790:84;;-1:-1:-1;28910:13:0;;14592:3;28895:56;28790:162;28739:213;;:31;;29033:23;;;;29077:14;:19;29073:635;;29117:313;29148:38;;29173:12;;-1:-1:-1;;;;;29148:38:0;;;29165:1;;-1:-1:-1;;;;;;;;;;;29148:38:0;29165:1;;29148:38;29214:69;29253:1;29257:2;29261:14;;;;;;29277:5;29214:30;:69::i;:::-;29209:174;;29319:40;;-1:-1:-1;;;29319:40:0;;;;;;;;;;;29209:174;29425:3;29410:12;:18;29117:313;;29511:12;29494:13;;:29;29490:43;;29525:8;;;29490:43;29073:635;;;29574:119;29605:40;;29630:14;;;;;-1:-1:-1;;;;;29605:40:0;;;29622:1;;-1:-1:-1;;;;;;;;;;;29605:40:0;29622:1;;29605:40;29688:3;29673:12;:18;29574:119;;29073:635;-1:-1:-1;29722:13:0;:28;;;29772:60;;29805:2;29809:12;29823:8;29772:60;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1528:203::-;-1:-1:-1;;;;;1692:32:1;;;;1674:51;;1662:2;1647:18;;1528:203::o;1736:131::-;-1:-1:-1;;;;;1811:31:1;;1801:42;;1791:70;;1857:1;1854;1847:12;1872:315;1940:6;1948;2001:2;1989:9;1980:7;1976:23;1972:32;1969:52;;;2017:1;2014;2007:12;1969:52;2056:9;2043:23;2075:31;2100:5;2075:31;:::i;:::-;2125:5;2177:2;2162:18;;;;2149:32;;-1:-1:-1;;;1872:315:1:o;2374:127::-;2435:10;2430:3;2426:20;2423:1;2416:31;2466:4;2463:1;2456:15;2490:4;2487:1;2480:15;2506:632;2571:5;-1:-1:-1;;;;;2642:2:1;2634:6;2631:14;2628:40;;;2648:18;;:::i;:::-;2723:2;2717:9;2691:2;2777:15;;-1:-1:-1;;2773:24:1;;;2799:2;2769:33;2765:42;2753:55;;;2823:18;;;2843:22;;;2820:46;2817:72;;;2869:18;;:::i;:::-;2909:10;2905:2;2898:22;2938:6;2929:15;;2968:6;2960;2953:22;3008:3;2999:6;2994:3;2990:16;2987:25;2984:45;;;3025:1;3022;3015:12;2984:45;3075:6;3070:3;3063:4;3055:6;3051:17;3038:44;3130:1;3123:4;3114:6;3106;3102:19;3098:30;3091:41;;;;2506:632;;;;;:::o;3143:451::-;3212:6;3265:2;3253:9;3244:7;3240:23;3236:32;3233:52;;;3281:1;3278;3271:12;3233:52;3321:9;3308:23;-1:-1:-1;;;;;3346:6:1;3343:30;3340:50;;;3386:1;3383;3376:12;3340:50;3409:22;;3462:4;3454:13;;3450:27;-1:-1:-1;3440:55:1;;3491:1;3488;3481:12;3440:55;3514:74;3580:7;3575:2;3562:16;3557:2;3553;3549:11;3514:74;:::i;3599:456::-;3676:6;3684;3692;3745:2;3733:9;3724:7;3720:23;3716:32;3713:52;;;3761:1;3758;3751:12;3713:52;3800:9;3787:23;3819:31;3844:5;3819:31;:::i;:::-;3869:5;-1:-1:-1;3926:2:1;3911:18;;3898:32;3939:33;3898:32;3939:33;:::i;:::-;3599:456;;3991:7;;-1:-1:-1;;;4045:2:1;4030:18;;;;4017:32;;3599:456::o;4060:248::-;4128:6;4136;4189:2;4177:9;4168:7;4164:23;4160:32;4157:52;;;4205:1;4202;4195:12;4157:52;-1:-1:-1;;4228:23:1;;;4298:2;4283:18;;;4270:32;;-1:-1:-1;4060:248:1:o;4313:274::-;-1:-1:-1;;;;;4505:32:1;;;;4487:51;;4569:2;4554:18;;4547:34;4475:2;4460:18;;4313:274::o;4592:247::-;4651:6;4704:2;4692:9;4683:7;4679:23;4675:32;4672:52;;;4720:1;4717;4710:12;4672:52;4759:9;4746:23;4778:31;4803:5;4778:31;:::i;4844:632::-;5015:2;5067:21;;;5137:13;;5040:18;;;5159:22;;;4986:4;;5015:2;5238:15;;;;5212:2;5197:18;;;4986:4;5281:169;5295:6;5292:1;5289:13;5281:169;;;5356:13;;5344:26;;5425:15;;;;5390:12;;;;5317:1;5310:9;5281:169;;;-1:-1:-1;5467:3:1;;4844:632;-1:-1:-1;;;;;;4844:632:1:o;5481:118::-;5567:5;5560:13;5553:21;5546:5;5543:32;5533:60;;5589:1;5586;5579:12;5604:382;5669:6;5677;5730:2;5718:9;5709:7;5705:23;5701:32;5698:52;;;5746:1;5743;5736:12;5698:52;5785:9;5772:23;5804:31;5829:5;5804:31;:::i;:::-;5854:5;-1:-1:-1;5911:2:1;5896:18;;5883:32;5924:30;5883:32;5924:30;:::i;:::-;5973:7;5963:17;;;5604:382;;;;;:::o;5991:795::-;6086:6;6094;6102;6110;6163:3;6151:9;6142:7;6138:23;6134:33;6131:53;;;6180:1;6177;6170:12;6131:53;6219:9;6206:23;6238:31;6263:5;6238:31;:::i;:::-;6288:5;-1:-1:-1;6345:2:1;6330:18;;6317:32;6358:33;6317:32;6358:33;:::i;:::-;6410:7;-1:-1:-1;6464:2:1;6449:18;;6436:32;;-1:-1:-1;6519:2:1;6504:18;;6491:32;-1:-1:-1;;;;;6535:30:1;;6532:50;;;6578:1;6575;6568:12;6532:50;6601:22;;6654:4;6646:13;;6642:27;-1:-1:-1;6632:55:1;;6683:1;6680;6673:12;6632:55;6706:74;6772:7;6767:2;6754:16;6749:2;6745;6741:11;6706:74;:::i;:::-;6696:84;;;5991:795;;;;;;;:::o;6791:315::-;6859:6;6867;6920:2;6908:9;6899:7;6895:23;6891:32;6888:52;;;6936:1;6933;6926:12;6888:52;6972:9;6959:23;6949:33;;7032:2;7021:9;7017:18;7004:32;7045:31;7070:5;7045:31;:::i;7111:388::-;7179:6;7187;7240:2;7228:9;7219:7;7215:23;7211:32;7208:52;;;7256:1;7253;7246:12;7208:52;7295:9;7282:23;7314:31;7339:5;7314:31;:::i;:::-;7364:5;-1:-1:-1;7421:2:1;7406:18;;7393:32;7434:33;7393:32;7434:33;:::i;7771:380::-;7850:1;7846:12;;;;7893;;;7914:61;;7968:4;7960:6;7956:17;7946:27;;7914:61;8021:2;8013:6;8010:14;7990:18;7987:38;7984:161;;8067:10;8062:3;8058:20;8055:1;8048:31;8102:4;8099:1;8092:15;8130:4;8127:1;8120:15;7984:161;;7771:380;;;:::o;8156:127::-;8217:10;8212:3;8208:20;8205:1;8198:31;8248:4;8245:1;8238:15;8272:4;8269:1;8262:15;8288:168;8328:7;8394:1;8390;8386:6;8382:14;8379:1;8376:21;8371:1;8364:9;8357:17;8353:45;8350:71;;;8401:18;;:::i;:::-;-1:-1:-1;8441:9:1;;8288:168::o;8461:127::-;8522:10;8517:3;8513:20;8510:1;8503:31;8553:4;8550:1;8543:15;8577:4;8574:1;8567:15;8593:120;8633:1;8659;8649:35;;8664:18;;:::i;:::-;-1:-1:-1;8698:9:1;;8593:120::o;8997:356::-;9199:2;9181:21;;;9218:18;;;9211:30;9277:34;9272:2;9257:18;;9250:62;9344:2;9329:18;;8997:356::o;9358:128::-;9398:3;9429:1;9425:6;9422:1;9419:13;9416:39;;;9435:18;;:::i;:::-;-1:-1:-1;9471:9:1;;9358:128::o;9491:125::-;9531:4;9559:1;9556;9553:8;9550:34;;;9564:18;;:::i;:::-;-1:-1:-1;9601:9:1;;9491:125::o;9621:470::-;9800:3;9838:6;9832:13;9854:53;9900:6;9895:3;9888:4;9880:6;9876:17;9854:53;:::i;:::-;9970:13;;9929:16;;;;9992:57;9970:13;9929:16;10026:4;10014:17;;9992:57;:::i;:::-;10065:20;;9621:470;-1:-1:-1;;;;9621:470:1:o;10096:127::-;10157:10;10152:3;10148:20;10145:1;10138:31;10188:4;10185:1;10178:15;10212:4;10209:1;10202:15;11598:184;11668:6;11721:2;11709:9;11700:7;11696:23;11692:32;11689:52;;;11737:1;11734;11727:12;11689:52;-1:-1:-1;11760:16:1;;11598:184;-1:-1:-1;11598:184:1:o;11787:245::-;11854:6;11907:2;11895:9;11886:7;11882:23;11878:32;11875:52;;;11923:1;11920;11913:12;11875:52;11955:9;11949:16;11974:28;11996:5;11974:28;:::i;12037:489::-;-1:-1:-1;;;;;12306:15:1;;;12288:34;;12358:15;;12353:2;12338:18;;12331:43;12405:2;12390:18;;12383:34;;;12453:3;12448:2;12433:18;;12426:31;;;12231:4;;12474:46;;12500:19;;12492:6;12474:46;:::i;:::-;12466:54;12037:489;-1:-1:-1;;;;;;12037:489:1:o;12531:249::-;12600:6;12653:2;12641:9;12632:7;12628:23;12624:32;12621:52;;;12669:1;12666;12659:12;12621:52;12701:9;12695:16;12720:30;12744:5;12720:30;:::i;12785:135::-;12824:3;12845:17;;;12842:43;;12865:18;;:::i;:::-;-1:-1:-1;12912:1:1;12901:13;;12785:135::o;12925:112::-;12957:1;12983;12973:35;;12988:18;;:::i;:::-;-1:-1:-1;13022:9:1;;12925:112::o

Swarm Source

ipfs://3acefceca66f34233f08e061eb9c879f0fd31d8cdfb388b98696d6088755e48b
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.