Contract 0x20ec66dd5b6255604a8730c217391f8820707cca 1

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x8981f1bdd7562b5307d3f069d11a87197ce5b30048aa52b4f6cee67ca4ef249dSafe Transfer Fr...58642272022-12-04 17:28:485 hrs 26 mins ago0x89ed68faa256b7f49842bbc106b008256f5d54fd IN  0x20ec66dd5b6255604a8730c217391f8820707cca0 CRO0.33325149732 4,863.778293271
0x1fc2cff812d67d4dd10f5a3e2efd1713ebb477160e5e295f6dc534edcb638c15Set Approval For...56066902022-11-17 18:55:0317 days 4 hrs ago0x8e811de1611320f3603c59bcf2c6242ea726da7c IN  0x20ec66dd5b6255604a8730c217391f8820707cca0 CRO0.229820350697 4,875.686326755
0x6774fbf06d80a258188d1621b0a48cb9069002b2109c3c0349d196e40fabbaeeSet Approval For...56035022022-11-17 13:53:4617 days 9 hrs ago0x93dc39518c84c8c8bc17f8ae61193a0cb9e9139e IN  0x20ec66dd5b6255604a8730c217391f8820707cca0 CRO0.125308921695 4,875.833529003
0x15211caa48400b7b43cffa86a8a1c7faf05b99e42e5706e8929e24a4487c92a9Set Approval For...55933722022-11-16 21:56:3418 days 58 mins ago0x48475a4a03503b2bc2430881e6915db52bbd986a IN  0x20ec66dd5b6255604a8730c217391f8820707cca0 CRO0.2297786214620
0x363040b1345912f1faa389a6b25480d93f875ca0ddc37d62f30d72de0bd8f7c9Set Approval For...55393102022-11-13 8:13:1621 days 14 hrs ago0xb10fa39325432e618d819462836e689780f892d5 IN  0x20ec66dd5b6255604a8730c217391f8820707cca0 CRO0.229986630532 4,879.213987874
0x5edb54a9f6bc05970ea4e3c4f30092595eb065aa1e4d0800106d5d9d60bb6db7Safe Transfer Fr...55392922022-11-13 8:11:3221 days 14 hrs ago0x293211a6d9e522ace40c3e723e90fc78175ab831 IN  0x20ec66dd5b6255604a8730c217391f8820707cca0 CRO0.334339985884 4,879.664694662
0xeb1cd4c617719919649bb670b2fe586ace9955cfef49b1e372f840be2af1febfSet Approval For...55204892022-11-12 2:28:5722 days 20 hrs ago0x67ccc07dbb3dbd9dc9b832af63ab084f64b2d00f IN  0x20ec66dd5b6255604a8730c217391f8820707cca0 CRO0.230003219829 4,879.565933241
0x1dbaff7a9cf49f4c53b7d967da3bd6c75a8ce59ca8f69013e49e56e4d107f5e0Set Approval For...54267812022-11-05 22:21:0829 days 34 mins ago0x3f78526e6b3cf172324b5dc1f1a72e483bc44705 IN  0x20ec66dd5b6255604a8730c217391f8820707cca0 CRO0.2301321214340
0x57d6303a8c1382cc511ea7d44b437276a28faedb2afae2bab92182890f2bc032Set Approval For...53997082022-11-04 3:40:4830 days 19 hrs ago0x8bb6983fe721ea5dedae42207ca62a1089026c46 IN  0x20ec66dd5b6255604a8730c217391f8820707cca0 CRO0.230261033364 4,885.035500777
0xacde3d5b9723c14a6f0af86914eada088e29ab934d5baeccfc6cad44b2e0fe37Set Approval For...53840892022-11-03 3:06:2731 days 19 hrs ago0x138494c904b7c8b4b1348358990c92af162b668d IN  0x20ec66dd5b6255604a8730c217391f8820707cca0 CRO0.230294726695 4,885.750311763
0xabbafd1903d7cbf6f6f53bc2902543168118d2e7bffeb44f50413c1bbc97ae2eSet Approval For...53644082022-11-01 20:09:3733 days 2 hrs ago0x5524f200c8e24ed0766fc5ed76b69860cc8ca9d4 IN  0x20ec66dd5b6255604a8730c217391f8820707cca0 CRO0.2302665607370
0xdd328478b8795e1a4c3df916332d7e02c1183f25111339375245e0b2296efdd4Set Approval For...53179712022-10-29 19:03:2336 days 3 hrs ago0x0175029133873c3c855ab955c368060409b9d527 IN  0x20ec66dd5b6255604a8730c217391f8820707cca0 CRO0.125641956845 4,888.792095157
0x027ee196fb741755dad9d6f02f217b27183e8cfbd1991e201397c1adbf5e2019Set Approval For...53179672022-10-29 19:03:0036 days 3 hrs ago0x0175029133873c3c855ab955c368060409b9d527 IN  0x20ec66dd5b6255604a8730c217391f8820707cca0 CRO0.125641961482 4,888.792275596
0x4e414c146648632c63db261c41123d3245762da9a53a65fe15c3656f5b73763aSet Approval For...53152212022-10-29 14:42:4536 days 8 hrs ago0xe088b04ef22c42e7a814ed6729bad55a8a1eccc5 IN  0x20ec66dd5b6255604a8730c217391f8820707cca0 CRO0.2303731897270
0xe84620ea4176e461ab5f86cf1b2544b128beca43934f0d9b8160c9c696c8d3ecSet Approval For...53051722022-10-28 22:52:2937 days 3 mins ago0x791a7aea51f4fd72a3f67806593e949a2dba585c IN  0x20ec66dd5b6255604a8730c217391f8820707cca0 CRO0.230465749587 4,889.378597839
0x912ee6b65872c63143c78f6ba5e41e0a7df59fb5595fc7f8b669c5c0014fb42cSafe Transfer Fr...53030362022-10-28 19:30:2437 days 3 hrs ago0xf74a36ff86af180ed852ec22ebbbc5db7c36236c IN  0x20ec66dd5b6255604a8730c217391f8820707cca0 CRO0.3349093648030
0x1eeeb1b8b332a38e92044f37fcfc83c947e600f62d5128fdcead96d68969b11cSafe Transfer Fr...53030292022-10-28 19:29:4337 days 3 hrs ago0xf74a36ff86af180ed852ec22ebbbc5db7c36236c IN  0x20ec66dd5b6255604a8730c217391f8820707cca0 CRO0.4082290082920
0x386740f05f4dde5136fe084e979643b879bc5c9581e7f89418a18f1d9a25ad37Set Approval For...51859452022-10-21 2:56:4344 days 19 hrs ago0x838cf822d8af9b6dc6f4aa9e3136b2390800e240 IN  0x20ec66dd5b6255604a8730c217391f8820707cca0 CRO0.1367007180440
0x1eedc5b6a490fdc240084535ed6e547eb7e056d4657f0fc3c9bffb3d7493c9bdSet Approval For...51859402022-10-21 2:56:1544 days 19 hrs ago0x838cf822d8af9b6dc6f4aa9e3136b2390800e240 IN  0x20ec66dd5b6255604a8730c217391f8820707cca0 CRO0.2306531147580
0xc799bb74ab711480187a41022736508bcea0df64d97cbccf84051e6e04641b98Set Approval For...51411812022-10-18 4:04:3247 days 18 hrs ago0xc0d5d5f85c5f9cd27538018d3ffc7351d54fb464 IN  0x20ec66dd5b6255604a8730c217391f8820707cca0 CRO0.23082152121 4,896.926366478
0xec89a85cf9904291d93df1964cf83c439a8abc7c1f6f23dc9255319dcbd6e254Set Approval For...51136942022-10-16 8:36:3149 days 14 hrs ago0xb2bae9faa05934ac6495329b06ed74be2de0df47 IN  0x20ec66dd5b6255604a8730c217391f8820707cca0 CRO0.136835509053 4,898.178302324
0x1a6d529265441bf093f4b435c575fdefde32557ec99bc6c9cdbeda5e150eb91cSet Approval For...51136922022-10-16 8:36:1949 days 14 hrs ago0xb2bae9faa05934ac6495329b06ed74be2de0df47 IN  0x20ec66dd5b6255604a8730c217391f8820707cca0 CRO0.136835511703 4,898.178397174
0xc62041dd2936a4ec4d4f787d886a072db3ea65a87a01c7452cebbdef40c62ba0Set Approval For...51136892022-10-16 8:36:0249 days 14 hrs ago0xb2bae9faa05934ac6495329b06ed74be2de0df47 IN  0x20ec66dd5b6255604a8730c217391f8820707cca0 CRO0.136835515546 4,898.178534726
0x0aa0107009c4e974bd44b6c2b830d6471bab5a1fe71cfbec086bcf9780f19290Set Approval For...51136842022-10-16 8:35:3349 days 14 hrs ago0xb2bae9faa05934ac6495329b06ed74be2de0df47 IN  0x20ec66dd5b6255604a8730c217391f8820707cca0 CRO0.230880554008 4,898.178759505
0x35119d43dad7e3beef870ba8ff6b81d0d81c2281d70076f6e64ce2a5caa17774Set Approval For...50980892022-10-15 8:03:3350 days 14 hrs ago0xb2bae9faa05934ac6495329b06ed74be2de0df47 IN  0x20ec66dd5b6255604a8730c217391f8820707cca0 CRO0.230914361062 4,898.895983162
[ Download CSV Export 
Latest 19 internal transactions
Parent Txn Hash Block From To Value
0xd09797ae29b43457983400378e5aafed9cff383b87c8891c30358efda5dfb00840618702022-08-08 7:27:04118 days 15 hrs ago 0x20ec66dd5b6255604a8730c217391f8820707cca0xbd2ec1dae75ab0872f6f8ce2b942a8b4f45721a9300 CRO
0xcdb1983e22af574ebe030bfc03729bf18dc652ed4c59f2fa23282c3817b8c5f339658362022-08-01 23:55:28124 days 23 hrs ago 0x20ec66dd5b6255604a8730c217391f8820707cca0xbd2ec1dae75ab0872f6f8ce2b942a8b4f45721a91,200 CRO
0xb4c2bc4a054bd2246747936839d552c333b042a4e275eb23eddf1665dbc7e9ad38852642022-07-27 16:47:22130 days 6 hrs ago 0x20ec66dd5b6255604a8730c217391f8820707cca0xbd2ec1dae75ab0872f6f8ce2b942a8b4f45721a9900 CRO
0x376d2ee143f475fef15cd070c3b527c96b098eb2284b4fffc5d1884b2319489538527772022-07-25 13:35:15132 days 9 hrs ago 0x20ec66dd5b6255604a8730c217391f8820707cca0xbd2ec1dae75ab0872f6f8ce2b942a8b4f45721a91,500 CRO
0xa47b89a1eb973f0bec702f554b0741c87932dd9c2bca2e440f0292d6154fff7f37427132022-07-18 7:23:45139 days 15 hrs ago 0x20ec66dd5b6255604a8730c217391f8820707cca0xbd2ec1dae75ab0872f6f8ce2b942a8b4f45721a96,300 CRO
0x91da4013cf31003e53df1a3e49385deac16c590c343e9a2fcea1143947ce77e936361492022-07-11 6:48:51146 days 16 hrs ago 0x20ec66dd5b6255604a8730c217391f8820707cca0xbd2ec1dae75ab0872f6f8ce2b942a8b4f45721a98,700 CRO
0x3eff74fc2d9bca78a14bf0d1e88979bbb6eab199aaa26ebde214f0021db436fc35807372022-07-07 15:12:40150 days 7 hrs ago 0x20ec66dd5b6255604a8730c217391f8820707cca0xbd2ec1dae75ab0872f6f8ce2b942a8b4f45721a919,800 CRO
0x348d875589102411b9bfe9ae6a4344b0057956301625f50fb004fe7162850c4f35358612022-07-04 16:12:39153 days 6 hrs ago 0x20ec66dd5b6255604a8730c217391f8820707cca0xbd2ec1dae75ab0872f6f8ce2b942a8b4f45721a95,100 CRO
0xae0bb1b401a643cc7c6b47217be2e87dba071bcb4c0d58c58af159576104a2a435218372022-07-03 18:00:22154 days 4 hrs ago 0x20ec66dd5b6255604a8730c217391f8820707cca0xbd2ec1dae75ab0872f6f8ce2b942a8b4f45721a917,100 CRO
0xcb7e75c08100d5e735d247c67f878e4e18b1c28984f380931f25d6b9b941386034732932022-06-30 13:09:43157 days 9 hrs ago 0x20ec66dd5b6255604a8730c217391f8820707cca0xbd2ec1dae75ab0872f6f8ce2b942a8b4f45721a97,800 CRO
0x845db53b770e2101342277597f859bf5fdddbb3f36883e61ce467d4a8c88d15a34014872022-06-25 19:42:06162 days 3 hrs ago 0x20ec66dd5b6255604a8730c217391f8820707cca0xbd2ec1dae75ab0872f6f8ce2b942a8b4f45721a91,800 CRO
0x6a61e955e739ccfaf9d8ca7dabeec692aacb78168b23aca63be261d20c93615333877632022-06-24 21:59:42163 days 55 mins ago 0x20ec66dd5b6255604a8730c217391f8820707cca0xbd2ec1dae75ab0872f6f8ce2b942a8b4f45721a92,400 CRO
0x9337b565e5c0a799b1405cf071e45f01994d3815d40f5a7a927d0aaa9b814fe933534242022-06-22 15:37:59165 days 7 hrs ago 0x20ec66dd5b6255604a8730c217391f8820707cca0xbd2ec1dae75ab0872f6f8ce2b942a8b4f45721a94,800 CRO
0xbe57c089a73ed2bf7b63808d6765098e9f2db8b65a754df9564bbcc2a42dae7733085862022-06-19 16:54:10168 days 6 hrs ago 0x20ec66dd5b6255604a8730c217391f8820707cca0xbd2ec1dae75ab0872f6f8ce2b942a8b4f45721a92,400 CRO
0x5a4f8b8facdd1cabb1682130a60b961890944c09340b21cce05b655b988c6a7d32663642022-06-16 22:12:51171 days 42 mins ago 0x20ec66dd5b6255604a8730c217391f8820707cca0xbd2ec1dae75ab0872f6f8ce2b942a8b4f45721a919,800 CRO
0xb96fb2043d1aeece6701abd7024ac11650359662612306b214637c217e56418631448012022-06-08 21:50:15179 days 1 hr ago 0x20ec66dd5b6255604a8730c217391f8820707cca0xbd2ec1dae75ab0872f6f8ce2b942a8b4f45721a939,300 CRO
0x442ad48609899070d7c8ed35c766458137ad9746b2577a914004dcfa4076193e30995182022-06-05 22:06:21182 days 49 mins ago 0x20ec66dd5b6255604a8730c217391f8820707cca0xbd2ec1dae75ab0872f6f8ce2b942a8b4f45721a941,400 CRO
0xda8a2105bc90724f274e1335b459df2b2a4082dc2f55e6b51dd58539a8b0f58d30439732022-06-02 6:18:58185 days 16 hrs ago 0x20ec66dd5b6255604a8730c217391f8820707cca0xbd2ec1dae75ab0872f6f8ce2b942a8b4f45721a940,200 CRO
0x6729d62e8cbbee9eaef286e564b56e02527b7a28345c6dab70c27136883c279d30197012022-05-31 15:53:12187 days 7 hrs ago 0x20ec66dd5b6255604a8730c217391f8820707cca0xbd2ec1dae75ab0872f6f8ce2b942a8b4f45721a932,400 CRO
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LazyGopherNFT

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-05-31
*/

// SPDX-License-Identifier: GPL-3.0
// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

/**
 * @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: @openzeppelin/contracts/utils/cryptography/ECDSA.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

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


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

pragma solidity ^0.8.1;

/**
 * @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/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

/**
 * @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/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @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: SMSC.sol



pragma solidity ^0.8.4;

interface IERC20 {
    function totalSupply() external view returns (uint256);

    function decimals() external view returns (uint8);

    function symbol() external view returns (string memory);

    function name() external view returns (string memory);

    function getOwner() external view returns (address);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount) external returns (bool);

    function allowance(address _owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);
}



error TransferToNonERC721ReceiverImplementer();

contract Ownable {
    address public owner;

    constructor() {
        owner = msg.sender;
    }

    // ownership
    modifier onlyOwner() {
        require(msg.sender == owner, "ERROR! Access denied");
        _;
    }

    function transferOwnership(address _newOwner) external onlyOwner {
        owner = _newOwner;
    }

    function renounceOwnership() external onlyOwner {
        owner = address(0);
    }
}

contract LazyGopherNFT is IERC721, Ownable {
    using Address for address;
    using Strings for uint256;

    string private _name = "LazyGopher";
    string private _symbol = "Gopher";

    uint16 public devSupply = 500;
    uint16 public pubsaleSupply = 5600;
    uint16 public pubsaledAmount;
    uint16 public totalSupply;
    uint8 public limitPerAddress = 100;

    bool public revealed;

    bool public pubsaleOpen;

    uint256 public cost = 300 ether;
    uint256 internal _currentIndex = 1;

    mapping(address => uint256) private _balances;
    mapping(uint256 => address) public ownership;
    mapping(address => uint256) public addressMints;

    string public baseURI;
    string public norevealedURI;
    string public baseExtension;

    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    modifier onlyTokenOwner(uint256 tokenId) {
        require(
            ownerOf(tokenId) == msg.sender,
            "ERROR! You must be the token owner"
        );
        _;
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            msg.sender == owner || isApprovedForAll(owner, msg.sender),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        require(
            tokenId <= totalSupply,
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        _setApprovalForAll(msg.sender, operator, approved);
    }

    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }

    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ownerOf(tokenId), to, tokenId);
    }

    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    function setCost(uint256 _cost) external onlyOwner {
        cost = _cost;
    }

    function setLimitPerAddress(uint8 _limit) external onlyOwner {
        limitPerAddress = _limit;
    }

    function startPubsale() external onlyOwner {
        pubsaleOpen = true;
    }

    function endPubsale() external onlyOwner {
        pubsaleOpen = false;
    }

    function balanceOf(address owner) public view override returns (uint256) {
        return _balances[owner];
    }

    function ownerOf(uint256 tokenId) public view override returns (address) {
        if (tokenId >= _currentIndex) {
            return address(0);
        }

        uint256 id = tokenId;
        while (id > 1 && ownership[id] == address(0)) {
            id -= 1;
        }
        return ownership[id];
    }

    function premint(address to, uint amount)
        external
        payable
        onlyOwner
    {
        for (uint256 i = 0; i < amount; i += 1) {
            emit Transfer(address(0), to, _currentIndex + i);
        }

        ownership[_currentIndex] = to;
        _mint(to, amount);

        totalSupply += uint16(amount);
    }

    function mint(uint256 amount) external payable {
        require(
            addressMints[msg.sender] + amount <= limitPerAddress,
            "ERROR: NFT limit"
        );
        require(pubsaledAmount + amount <= pubsaleSupply, "Invalid amount");
        require(pubsaleOpen, "Pubsale is not open");

        uint256 totalCost = cost * amount;
        require(msg.value >= totalCost, "Insufficient payment");

        if (msg.value > totalCost) {
            payable(msg.sender).transfer(msg.value - totalCost);
        }

        for (uint256 i = 0; i < amount; i += 1) {
            emit Transfer(address(0), msg.sender, _currentIndex + i);
        }

        ownership[_currentIndex] = msg.sender;
        _mint(msg.sender, amount);

        pubsaledAmount += uint8(amount);
        totalSupply += uint8(amount);
    }

    function _mint(address to, uint256 amount) internal {
        _balances[to] += amount;
        addressMints[to] += amount;
        _currentIndex += amount;
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);

        if (!_checkOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    function migrate(uint[] memory ids_, address[] memory owners_, uint max_) external onlyOwner {
        uint tokenId = ids_[0];
        uint i = 0;

        uint amount = max_ - tokenId + 1;
        _currentIndex += uint16(amount);
        totalSupply += uint16(amount);

        while (i < ids_.length && tokenId <= max_) {
            ownership[tokenId] = owners_[i];
            emit Transfer(address(0), owners_[i], tokenId);
            tokenId += 1;

            _balances[owners_[i]] += 1;
            addressMints[owners_[i]] += 1;

            if (i + 1 < ids_.length && tokenId >= ids_[i + 1]) {
                i += 1;
            }
        }
    }

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal {
        address preOwner = ownerOf(tokenId);

        require(from != to, "You cannot transfer to yourself");
        require(from == preOwner, "Invalid from address");
        require(
            msg.sender == preOwner ||
                isApprovedForAll(preOwner, msg.sender) ||
                getApproved(tokenId) == msg.sender,
            "Access denied"
        );

        _approve(address(0), tokenId);

        ownership[tokenId] = to;

        uint256 nextId = tokenId + 1;

        if (ownership[nextId] == address(0) && nextId < _currentIndex) {
            ownership[nextId] = preOwner;
        }

        _balances[preOwner] -= 1;
        _balances[to] += 1;

        emit Transfer(from, to, tokenId);
    }

    function tokenURI(uint256 tokenId) public view returns (string memory) {
        require(
            tokenId <= totalSupply,
            "ERC721Metadata: URI query for nonexistent token"
        );

        if (revealed == false) {
            return norevealedURI;
        }

        string memory currentBaseURI = baseURI;
        return
            bytes(currentBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        currentBaseURI,
                        tokenId.toString(),
                        baseExtension
                    )
                )
                : "";
    }

    function setBaseURI(string memory _baseURI) external onlyOwner {
        baseURI = _baseURI;
    }

    function setUnrevealedURI(string memory _uri) external onlyOwner {
        norevealedURI = _uri;
    }

    function setBaseExtension(string memory _ext) external onlyOwner {
        baseExtension = _ext;
    }

    function setPubsaleSupply(uint16 _amount) external onlyOwner {
        pubsaleSupply = _amount;
    }

    function setDevSupply(uint16 _amount) external onlyOwner {
        devSupply = _amount;
    }

    function reveal() external onlyOwner {
        revealed = true;
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            interfaceId == type(IERC165).interfaceId;
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
                IERC721Receiver(to).onERC721Received(
                    msg.sender,
                    from,
                    tokenId,
                    _data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert TransferToNonERC721ReceiverImplementer();
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    function withdraw(address payable to) external onlyOwner {
        Address.sendValue(to, address(this).balance);
    }

    function recoverToken(address token, address to) external onlyOwner {
        IERC20(token).transfer(to, IERC20(token).balanceOf(address(this)));
    }
}

Contract ABI

[{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMints","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":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endPubsale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitPerAddress","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids_","type":"uint256[]"},{"internalType":"address[]","name":"owners_","type":"address[]"},{"internalType":"uint256","name":"max_","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"norevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownership","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"premint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"pubsaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pubsaleSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pubsaledAmount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"_ext","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_amount","type":"uint16"}],"name":"setDevSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_limit","type":"uint8"}],"name":"setLimitPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_amount","type":"uint16"}],"name":"setPubsaleSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setUnrevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPubsale","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":"uint16","name":"","type":"uint16"}],"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":"address payable","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052600a6080819052692630bd3ca3b7b83432b960b11b60a09081526200002d9160019190620000b3565b506040805180820190915260068082526523b7b83432b960d11b60209092019182526200005d91600291620000b3565b506003805468ff00000000ffffffff191668640000000015e001f4179055681043561a882930000060045560016005553480156200009a57600080fd5b50600080546001600160a01b0319163317905562000196565b828054620000c19062000159565b90600052602060002090601f016020900481019282620000e5576000855562000130565b82601f106200010057805160ff191683800117855562000130565b8280016001018555821562000130579182015b828111156200013057825182559160200191906001019062000113565b506200013e92915062000142565b5090565b5b808211156200013e576000815560010162000143565b600181811c908216806200016e57607f821691505b602082108114156200019057634e487b7160e01b600052602260045260246000fd5b50919050565b6128b180620001a66000396000f3fe6080604052600436106102675760003560e01c8063715018a611610144578063a475b5dd116100b6578063cfbe73551161007a578063cfbe735514610751578063da3ef23f14610771578063e985e9c514610791578063f2fde38b146107b1578063fe2c7fee146107d1578063feaea586146107f157600080fd5b8063a475b5dd146106d2578063b584b78d146106e7578063b88d4fde146106fc578063c66828621461071c578063c87b56dd1461073157600080fd5b8063964c33b511610108578063964c33b5146105f85780639c3e73c314610625578063a0712d6814610646578063a0f45b6914610659578063a205ea421461068f578063a22cb465146106b257600080fd5b8063715018a6146105795780637c1d352d1461058e5780638611244c146105ae5780638da5cb5b146105c357806395d89b41146105e357600080fd5b806341c66d0a116101dd57806351cff8d9116101a157806351cff8d9146104ae57806355f804b3146104ce5780636352211e146104ee5780636833a2281461050e5780636c0360eb1461052e57806370a082311461054357600080fd5b806341c66d0a1461041157806342842e0e1461042c57806342ca1d091461044c57806344a0d68a1461046d578063518302271461048d57600080fd5b806313faede61161022f57806313faede61461033257806318160ddd1461035657806323b872dd1461038b5780632a484ad4146103ab5780632b5e3e26146103de57806335eb8bae146103f157600080fd5b806301ffc9a71461026c57806303a17969146102a157806306fdde03146102b8578063081812fc146102da578063095ea7b314610312575b600080fd5b34801561027857600080fd5b5061028c610287366004612410565b610811565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102b6610863565b005b3480156102c457600080fd5b506102cd6108a5565b604051610298919061262c565b3480156102e657600080fd5b506102fa6102f53660046124b0565b610937565b6040516001600160a01b039091168152602001610298565b34801561031e57600080fd5b506102b661032d366004612306565b6109c8565b34801561033e57600080fd5b5061034860045481565b604051908152602001610298565b34801561036257600080fd5b5060035461037890600160301b900461ffff1681565b60405161ffff9091168152602001610298565b34801561039757600080fd5b506102b66103a636600461221c565b610ade565b3480156103b757600080fd5b506003546103cc90600160401b900460ff1681565b60405160ff9091168152602001610298565b6102b66103ec366004612306565b610ae9565b3480156103fd57600080fd5b506102b661040c366004612331565b610bd4565b34801561041d57600080fd5b506003546103789061ffff1681565b34801561043857600080fd5b506102b661044736600461221c565b610ea6565b34801561045857600080fd5b506003546103789062010000900461ffff1681565b34801561047957600080fd5b506102b66104883660046124b0565b610ec1565b34801561049957600080fd5b5060035461028c90600160481b900460ff1681565b3480156104ba57600080fd5b506102b66104c93660046121c8565b610ef0565b3480156104da57600080fd5b506102b66104e9366004612448565b610f27565b3480156104fa57600080fd5b506102fa6105093660046124b0565b610f68565b34801561051a57600080fd5b506102b66105293660046124e0565b610fd7565b34801561053a57600080fd5b506102cd611026565b34801561054f57600080fd5b5061034861055e3660046121c8565b6001600160a01b031660009081526006602052604090205490565b34801561058557600080fd5b506102b66110b4565b34801561059a57600080fd5b506102b66105a936600461248e565b6110f0565b3480156105ba57600080fd5b506102b6611132565b3480156105cf57600080fd5b506000546102fa906001600160a01b031681565b3480156105ef57600080fd5b506102cd611171565b34801561060457600080fd5b506103486106133660046121c8565b60086020526000908152604090205481565b34801561063157600080fd5b5060035461028c90600160501b900460ff1681565b6102b66106543660046124b0565b611180565b34801561066557600080fd5b506102fa6106743660046124b0565b6007602052600090815260409020546001600160a01b031681565b34801561069b57600080fd5b5060035461037890640100000000900461ffff1681565b3480156106be57600080fd5b506102b66106cd3660046122d9565b611408565b3480156106de57600080fd5b506102b6611413565b3480156106f357600080fd5b506102cd611458565b34801561070857600080fd5b506102b661071736600461225c565b611465565b34801561072857600080fd5b506102cd61149f565b34801561073d57600080fd5b506102cd61074c3660046124b0565b6114ac565b34801561075d57600080fd5b506102b661076c36600461248e565b6116a9565b34801561077d57600080fd5b506102b661078c366004612448565b6116f3565b34801561079d57600080fd5b5061028c6107ac3660046121e4565b611730565b3480156107bd57600080fd5b506102b66107cc3660046121c8565b61175e565b3480156107dd57600080fd5b506102b66107ec366004612448565b6117aa565b3480156107fd57600080fd5b506102b661080c3660046121e4565b6117e7565b60006001600160e01b031982166380ac58cd60e01b148061084257506001600160e01b03198216635b5e139f60e01b145b8061085d57506001600160e01b031982166301ffc9a760e01b145b92915050565b6000546001600160a01b031633146108965760405162461bcd60e51b815260040161088d9061263f565b60405180910390fd5b6003805460ff60501b19169055565b6060600180546108b490612776565b80601f01602080910402602001604051908101604052809291908181526020018280546108e090612776565b801561092d5780601f106109025761010080835404028352916020019161092d565b820191906000526020600020905b81548152906001019060200180831161091057829003601f168201915b5050505050905090565b600354600090600160301b900461ffff168211156109ac5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161088d565b506000908152600c60205260409020546001600160a01b031690565b60006109d382610f68565b9050806001600160a01b0316836001600160a01b03161415610a415760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161088d565b336001600160a01b0382161480610a5d5750610a5d8133611730565b610acf5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161088d565b610ad98383611910565b505050565b610ad983838361197e565b6000546001600160a01b03163314610b135760405162461bcd60e51b815260040161088d9061263f565b60005b81811015610b625780600554610b2c91906126e8565b6040516001600160a01b0385169060009060008051602061285c833981519152908290a4610b5b6001826126e8565b9050610b16565b50600554600090815260076020526040902080546001600160a01b0319166001600160a01b038416179055610b978282611bd7565b80600360068282829054906101000a900461ffff16610bb691906126c2565b92506101000a81548161ffff021916908361ffff1602179055505050565b6000546001600160a01b03163314610bfe5760405162461bcd60e51b815260040161088d9061263f565b600083600081518110610c2157634e487b7160e01b600052603260045260246000fd5b602002602001015190506000808284610c3a9190612733565b610c459060016126e8565b90508061ffff1660056000828254610c5d91906126e8565b909155505060038054829190600690610c82908490600160301b900461ffff166126c2565b92506101000a81548161ffff021916908361ffff1602179055505b855182108015610cad5750838311155b15610e9e57848281518110610cd257634e487b7160e01b600052603260045260246000fd5b60200260200101516007600085815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082858381518110610d3257634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031660006001600160a01b031660008051602061285c83398151915260405160405180910390a4610d736001846126e8565b9250600160066000878581518110610d9b57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000828254610dd291906126e8565b92505081905550600160086000878581518110610dff57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000828254610e3691906126e8565b90915550508551610e488360016126e8565b108015610e86575085610e5c8360016126e8565b81518110610e7a57634e487b7160e01b600052603260045260246000fd5b60200260200101518310155b15610e9957610e966001836126e8565b91505b610c9d565b505050505050565b610ad983838360405180602001604052806000815250611465565b6000546001600160a01b03163314610eeb5760405162461bcd60e51b815260040161088d9061263f565b600455565b6000546001600160a01b03163314610f1a5760405162461bcd60e51b815260040161088d9061263f565b610f248147611c4e565b50565b6000546001600160a01b03163314610f515760405162461bcd60e51b815260040161088d9061263f565b8051610f6490600990602084019061205f565b5050565b60006005548210610f7b57506000919050565b815b600181118015610fa257506000818152600760205260409020546001600160a01b0316155b15610fb957610fb2600182612733565b9050610f7d565b6000908152600760205260409020546001600160a01b031692915050565b6000546001600160a01b031633146110015760405162461bcd60e51b815260040161088d9061263f565b6003805460ff909216600160401b0268ff000000000000000019909216919091179055565b6009805461103390612776565b80601f016020809104026020016040519081016040528092919081815260200182805461105f90612776565b80156110ac5780601f10611081576101008083540402835291602001916110ac565b820191906000526020600020905b81548152906001019060200180831161108f57829003601f168201915b505050505081565b6000546001600160a01b031633146110de5760405162461bcd60e51b815260040161088d9061263f565b600080546001600160a01b0319169055565b6000546001600160a01b0316331461111a5760405162461bcd60e51b815260040161088d9061263f565b6003805461ffff191661ffff92909216919091179055565b6000546001600160a01b0316331461115c5760405162461bcd60e51b815260040161088d9061263f565b6003805460ff60501b1916600160501b179055565b6060600280546108b490612776565b60035433600090815260086020526040902054600160401b90910460ff16906111aa9083906126e8565b11156111eb5760405162461bcd60e51b815260206004820152601060248201526f11549493d48e88139195081b1a5b5a5d60821b604482015260640161088d565b60035461ffff62010000820481169161120e9184916401000000009004166126e8565b111561124d5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b604482015260640161088d565b600354600160501b900460ff1661129c5760405162461bcd60e51b8152602060048201526013602482015272283ab139b0b6329034b9903737ba1037b832b760691b604482015260640161088d565b6000816004546112ac9190612714565b9050803410156112f55760405162461bcd60e51b8152602060048201526014602482015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b604482015260640161088d565b8034111561133557336108fc61130b8334612733565b6040518115909202916000818181858888f19350505050158015611333573d6000803e3d6000fd5b505b60005b8281101561137b578060055461134e91906126e8565b604051339060009060008051602061285c833981519152908290a46113746001826126e8565b9050611338565b50600554600090815260076020526040902080546001600160a01b031916339081179091556113aa9083611bd7565b8160ff16600360048282829054906101000a900461ffff166113cc91906126c2565b92506101000a81548161ffff021916908361ffff1602179055508160ff16600360068282829054906101000a900461ffff16610bb691906126c2565b610f64338383611d67565b6000546001600160a01b0316331461143d5760405162461bcd60e51b815260040161088d9061263f565b6003805469ff0000000000000000001916600160481b179055565b600a805461103390612776565b61147084848461197e565b61147c84848484611e36565b611499576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b600b805461103390612776565b600354606090600160301b900461ffff168211156115245760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161088d565b600354600160481b900460ff166115c757600a805461154290612776565b80601f016020809104026020016040519081016040528092919081815260200182805461156e90612776565b80156115bb5780601f10611590576101008083540402835291602001916115bb565b820191906000526020600020905b81548152906001019060200180831161159e57829003601f168201915b50505050509050919050565b6000600980546115d690612776565b80601f016020809104026020016040519081016040528092919081815260200182805461160290612776565b801561164f5780601f106116245761010080835404028352916020019161164f565b820191906000526020600020905b81548152906001019060200180831161163257829003601f168201915b50505050509050600081511161167457604051806020016040528060008152506116a2565b8061167e84611f45565b600b6040516020016116929392919061252d565b6040516020818303038152906040525b9392505050565b6000546001600160a01b031633146116d35760405162461bcd60e51b815260040161088d9061263f565b6003805461ffff909216620100000263ffff000019909216919091179055565b6000546001600160a01b0316331461171d5760405162461bcd60e51b815260040161088d9061263f565b8051610f6490600b90602084019061205f565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205460ff1690565b6000546001600160a01b031633146117885760405162461bcd60e51b815260040161088d9061263f565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146117d45760405162461bcd60e51b815260040161088d9061263f565b8051610f6490600a90602084019061205f565b6000546001600160a01b031633146118115760405162461bcd60e51b815260040161088d9061263f565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a082319060240160206040518083038186803b15801561185a57600080fd5b505afa15801561186e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189291906124c8565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156118d857600080fd5b505af11580156118ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad991906123f4565b6000818152600c6020526040902080546001600160a01b0319166001600160a01b038416908117909155819061194582610f68565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061198982610f68565b9050826001600160a01b0316846001600160a01b031614156119ed5760405162461bcd60e51b815260206004820152601f60248201527f596f752063616e6e6f74207472616e7366657220746f20796f757273656c6600604482015260640161088d565b806001600160a01b0316846001600160a01b031614611a455760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642066726f6d206164647265737360601b604482015260640161088d565b336001600160a01b0382161480611a615750611a618133611730565b80611a7c575033611a7183610937565b6001600160a01b0316145b611ab85760405162461bcd60e51b815260206004820152600d60248201526c1058d8d95cdcc819195b9a5959609a1b604482015260640161088d565b611ac3600083611910565b600082815260076020526040812080546001600160a01b0319166001600160a01b038616179055611af58360016126e8565b6000818152600760205260409020549091506001600160a01b0316158015611b1e575060055481105b15611b4b57600081815260076020526040902080546001600160a01b0319166001600160a01b0384161790555b6001600160a01b0382166000908152600660205260408120805460019290611b74908490612733565b90915550506001600160a01b0384166000908152600660205260408120805460019290611ba29084906126e8565b909155505060405183906001600160a01b03808716919088169060008051602061285c83398151915290600090a45050505050565b6001600160a01b03821660009081526006602052604081208054839290611bff9084906126e8565b90915550506001600160a01b03821660009081526008602052604081208054839290611c2c9084906126e8565b925050819055508060056000828254611c4591906126e8565b90915550505050565b80471015611c9e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161088d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611ceb576040519150601f19603f3d011682016040523d82523d6000602084013e611cf0565b606091505b5050905080610ad95760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161088d565b816001600160a01b0316836001600160a01b03161415611dc95760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161088d565b6001600160a01b038381166000818152600d6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60006001600160a01b0384163b15611f3957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611e7a9033908990889088906004016125ef565b602060405180830381600087803b158015611e9457600080fd5b505af1925050508015611ec4575060408051601f3d908101601f19168201909252611ec19181019061242c565b60015b611f1f573d808015611ef2576040519150601f19603f3d011682016040523d82523d6000602084013e611ef7565b606091505b508051611f17576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f3d565b5060015b949350505050565b606081611f695750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611f935780611f7d816127b1565b9150611f8c9050600a83612700565b9150611f6d565b60008167ffffffffffffffff811115611fbc57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611fe6576020820181803683370190505b5090505b8415611f3d57611ffb600183612733565b9150612008600a866127cc565b6120139060306126e8565b60f81b81838151811061203657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612058600a86612700565b9450611fea565b82805461206b90612776565b90600052602060002090601f01602090048101928261208d57600085556120d3565b82601f106120a657805160ff19168380011785556120d3565b828001600101855582156120d3579182015b828111156120d35782518255916020019190600101906120b8565b506120df9291506120e3565b5090565b5b808211156120df57600081556001016120e4565b600067ffffffffffffffff8311156121125761211261280c565b612125601f8401601f191660200161266d565b905082815283838301111561213957600080fd5b828260208301376000602084830101529392505050565b600082601f830112612160578081fd5b813560206121756121708361269e565b61266d565b80838252828201915082860187848660051b8901011115612194578586fd5b855b858110156121bb5781356121a981612822565b84529284019290840190600101612196565b5090979650505050505050565b6000602082840312156121d9578081fd5b81356116a281612822565b600080604083850312156121f6578081fd5b823561220181612822565b9150602083013561221181612822565b809150509250929050565b600080600060608486031215612230578081fd5b833561223b81612822565b9250602084013561224b81612822565b929592945050506040919091013590565b60008060008060808587031215612271578081fd5b843561227c81612822565b9350602085013561228c81612822565b925060408501359150606085013567ffffffffffffffff8111156122ae578182fd5b8501601f810187136122be578182fd5b6122cd878235602084016120f8565b91505092959194509250565b600080604083850312156122eb578182fd5b82356122f681612822565b9150602083013561221181612837565b60008060408385031215612318578182fd5b823561232381612822565b946020939093013593505050565b600080600060608486031215612345578081fd5b833567ffffffffffffffff8082111561235c578283fd5b818601915086601f83011261236f578283fd5b8135602061237f6121708361269e565b8083825282820191508286018b848660051b890101111561239e578788fd5b8796505b848710156123c05780358352600196909601959183019183016123a2565b50975050870135925050808211156123d6578283fd5b506123e386828701612150565b925050604084013590509250925092565b600060208284031215612405578081fd5b81516116a281612837565b600060208284031215612421578081fd5b81356116a281612845565b60006020828403121561243d578081fd5b81516116a281612845565b600060208284031215612459578081fd5b813567ffffffffffffffff81111561246f578182fd5b8201601f8101841361247f578182fd5b611f3d848235602084016120f8565b60006020828403121561249f578081fd5b813561ffff811681146116a2578182fd5b6000602082840312156124c1578081fd5b5035919050565b6000602082840312156124d9578081fd5b5051919050565b6000602082840312156124f1578081fd5b813560ff811681146116a2578182fd5b6000815180845261251981602086016020860161274a565b601f01601f19169290920160200192915050565b6000845160206125408285838a0161274a565b8551918401916125538184848a0161274a565b85549201918390600181811c908083168061256f57607f831692505b85831081141561258d57634e487b7160e01b88526022600452602488fd5b8080156125a157600181146125b2576125de565b60ff198516885283880195506125de565b60008b815260209020895b858110156125d65781548a8201529084019088016125bd565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061262290830184612501565b9695505050505050565b6020815260006116a26020830184612501565b60208082526014908201527311549493d488481058d8d95cdcc819195b9a595960621b604082015260600190565b604051601f8201601f1916810167ffffffffffffffff811182821017156126965761269661280c565b604052919050565b600067ffffffffffffffff8211156126b8576126b861280c565b5060051b60200190565b600061ffff8083168185168083038211156126df576126df6127e0565b01949350505050565b600082198211156126fb576126fb6127e0565b500190565b60008261270f5761270f6127f6565b500490565b600081600019048311821515161561272e5761272e6127e0565b500290565b600082821015612745576127456127e0565b500390565b60005b8381101561276557818101518382015260200161274d565b838111156114995750506000910152565b600181811c9082168061278a57607f821691505b602082108114156127ab57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127c5576127c56127e0565b5060010190565b6000826127db576127db6127f6565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610f2457600080fd5b8015158114610f2457600080fd5b6001600160e01b031981168114610f2457600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220d858eafb2323f16b6f00e5795db80ecc91984e96717741c49a09a001fe431d7864736f6c63430008040033

Deployed ByteCode Sourcemap

30336:10272:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39036:351;;;;;;;;;;-1:-1:-1;39036:351:0;;;;;:::i;:::-;;:::i;:::-;;;10846:14:1;;10839:22;10821:41;;10809:2;10794:18;39036:351:0;;;;;;;;33573:79;;;;;;;;;;;;;:::i;:::-;;31454:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32048:314::-;;;;;;;;;;-1:-1:-1;32048:314:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9865:32:1;;;9847:51;;9835:2;9820:18;32048:314:0;9802:102:1;31640:400:0;;;;;;;;;;-1:-1:-1;31640:400:0;;;;;:::i;:::-;;:::i;30784:31::-;;;;;;;;;;;;;;;;;;;17016:25:1;;;17004:2;16989:18;30784:31:0;16971:76:1;30648:25:0;;;;;;;;;;-1:-1:-1;30648:25:0;;;;-1:-1:-1;;;30648:25:0;;;;;;;;;16851:6:1;16839:19;;;16821:38;;16809:2;16794:18;30648:25:0;16776:89:1;35494:162:0;;;;;;;;;;-1:-1:-1;35494:162:0;;;;;:::i;:::-;;:::i;30680:34::-;;;;;;;;;;-1:-1:-1;30680:34:0;;;;-1:-1:-1;;;30680:34:0;;;;;;;;;17224:4:1;17212:17;;;17194:36;;17182:2;17167:18;30680:34:0;17149:87:1;34110:346:0;;;;;;:::i;:::-;;:::i;36193:678::-;;;;;;;;;;-1:-1:-1;36193:678:0;;;;;:::i;:::-;;:::i;30536:29::-;;;;;;;;;;-1:-1:-1;30536:29:0;;;;;;;;35664:177;;;;;;;;;;-1:-1:-1;35664:177:0;;;;;:::i;:::-;;:::i;30572:34::-;;;;;;;;;;-1:-1:-1;30572:34:0;;;;;;;;;;;33283:82;;;;;;;;;;-1:-1:-1;33283:82:0;;;;;:::i;:::-;;:::i;30723:20::-;;;;;;;;;;-1:-1:-1;30723:20:0;;;;-1:-1:-1;;;30723:20:0;;;;;;40324:120;;;;;;;;;;-1:-1:-1;40324:120:0;;;;;:::i;:::-;;:::i;38411:100::-;;;;;;;;;;-1:-1:-1;38411:100:0;;;;;:::i;:::-;;:::i;33783:319::-;;;;;;;;;;-1:-1:-1;33783:319:0;;;;;:::i;:::-;;:::i;33373:104::-;;;;;;;;;;-1:-1:-1;33373:104:0;;;;;:::i;:::-;;:::i;31024:21::-;;;;;;;;;;;;;:::i;33660:115::-;;;;;;;;;;-1:-1:-1;33660:115:0;;;;;:::i;:::-;-1:-1:-1;;;;;33751:16:0;33724:7;33751:16;;;:9;:16;;;;;;;33660:115;30244:85;;;;;;;;;;;;;:::i;38854:95::-;;;;;;;;;;-1:-1:-1;38854:95:0;;;;;:::i;:::-;;:::i;33485:80::-;;;;;;;;;;;;;:::i;29917:20::-;;;;;;;;;;-1:-1:-1;29917:20:0;;;;-1:-1:-1;;;;;29917:20:0;;;31545:87;;;;;;;;;;;;;:::i;30968:47::-;;;;;;;;;;-1:-1:-1;30968:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;30752:23;;;;;;;;;;-1:-1:-1;30752:23:0;;;;-1:-1:-1;;;30752:23:0;;;;;;34464:849;;;;;;:::i;:::-;;:::i;30917:44::-;;;;;;;;;;-1:-1:-1;30917:44:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;30917:44:0;;;30613:28;;;;;;;;;;-1:-1:-1;30613:28:0;;;;;;;;;;;32370:185;;;;;;;;;;-1:-1:-1;32370:185:0;;;;;:::i;:::-;;:::i;38957:71::-;;;;;;;;;;;;;:::i;31052:27::-;;;;;;;;;;;;;:::i;35849:336::-;;;;;;;;;;-1:-1:-1;35849:336:0;;;;;:::i;:::-;;:::i;31086:27::-;;;;;;;;;;;;;:::i;37743:660::-;;;;;;;;;;-1:-1:-1;37743:660:0;;;;;:::i;:::-;;:::i;38743:103::-;;;;;;;;;;-1:-1:-1;38743:103:0;;;;;:::i;:::-;;:::i;38631:104::-;;;;;;;;;;-1:-1:-1;38631:104:0;;;;;:::i;:::-;;:::i;32563:214::-;;;;;;;;;;-1:-1:-1;32563:214:0;;;;;:::i;:::-;;:::i;30135:101::-;;;;;;;;;;-1:-1:-1;30135:101:0;;;;;:::i;:::-;;:::i;38519:104::-;;;;;;;;;;-1:-1:-1;38519:104:0;;;;;:::i;:::-;;:::i;40452:153::-;;;;;;;;;;-1:-1:-1;40452:153:0;;;;;:::i;:::-;;:::i;39036:351::-;39175:4;-1:-1:-1;;;;;;39217:40:0;;-1:-1:-1;;;39217:40:0;;:105;;-1:-1:-1;;;;;;;39274:48:0;;-1:-1:-1;;;39274:48:0;39217:105;:162;;;-1:-1:-1;;;;;;;39339:40:0;;-1:-1:-1;;;39339:40:0;39217:162;39197:182;39036:351;-1:-1:-1;;39036:351:0:o;33573:79::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;;;;;;;;;33625:11:::1;:19:::0;;-1:-1:-1;;;;33625:19:0::1;::::0;;33573:79::o;31454:83::-;31491:13;31524:5;31517:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31454:83;:::o;32048:314::-;32227:11;;32169:7;;-1:-1:-1;;;32227:11:0;;;;32216:22;;;32194:116;;;;-1:-1:-1;;;32194:116:0;;14249:2:1;32194:116:0;;;14231:21:1;14288:2;14268:18;;;14261:30;14327:34;14307:18;;;14300:62;-1:-1:-1;;;14378:18:1;;;14371:42;14430:19;;32194:116:0;14221:234:1;32194:116:0;-1:-1:-1;32330:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;32330:24:0;;32048:314::o;31640:400::-;31721:13;31737:16;31745:7;31737;:16::i;:::-;31721:32;;31778:5;-1:-1:-1;;;;;31772:11:0;:2;-1:-1:-1;;;;;31772:11:0;;;31764:57;;;;-1:-1:-1;;;31764:57:0;;15078:2:1;31764:57:0;;;15060:21:1;15117:2;15097:18;;;15090:30;15156:34;15136:18;;;15129:62;-1:-1:-1;;;15207:18:1;;;15200:31;15248:19;;31764:57:0;15050:223:1;31764:57:0;31856:10;-1:-1:-1;;;;;31856:19:0;;;;:58;;;31879:35;31896:5;31903:10;31879:16;:35::i;:::-;31834:164;;;;-1:-1:-1;;;31834:164:0;;13475:2:1;31834:164:0;;;13457:21:1;13514:2;13494:18;;;13487:30;13553:34;13533:18;;;13526:62;13624:26;13604:18;;;13597:54;13668:19;;31834:164:0;13447:246:1;31834:164:0;32011:21;32020:2;32024:7;32011:8;:21::i;:::-;31640:400;;;:::o;35494:162::-;35620:28;35630:4;35636:2;35640:7;35620:9;:28::i;34110:346::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;34227:9:::1;34222:115;34246:6;34242:1;:10;34222:115;;;34323:1;34307:13;;:17;;;;:::i;:::-;34282:43;::::0;-1:-1:-1;;;;;34282:43:0;::::1;::::0;34299:1:::1;::::0;-1:-1:-1;;;;;;;;;;;34282:43:0;34299:1;;34282:43:::1;34254:6;34259:1;34254:6:::0;::::1;:::i;:::-;;;34222:115;;;-1:-1:-1::0;34359:13:0::1;::::0;34349:24:::1;::::0;;;:9:::1;:24;::::0;;;;:29;;-1:-1:-1;;;;;;34349:29:0::1;-1:-1:-1::0;;;;;34349:29:0;::::1;;::::0;;34389:17:::1;34349:29:::0;34399:6;34389:5:::1;:17::i;:::-;34441:6;34419:11;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34110:346:::0;;:::o;36193:678::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;36297:12:::1;36312:4;36317:1;36312:7;;;;;;-1:-1:-1::0;;;36312:7:0::1;;;;;;;;;;;;;;;36297:22;;36330:6;36353:11:::0;36374:7:::1;36367:4;:14;;;;:::i;:::-;:18;::::0;36384:1:::1;36367:18;:::i;:::-;36353:32;;36420:6;36396:31;;:13;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;36438:11:0::1;:29:::0;;36460:6;;36438:11;::::1;::::0;:29:::1;::::0;36460:6;;-1:-1:-1;;;36438:29:0;::::1;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36480:384;36491:4;:11;36487:1;:15;:34;;;;;36517:4;36506:7;:15;;36487:34;36480:384;;;36559:7;36567:1;36559:10;;;;;;-1:-1:-1::0;;;36559:10:0::1;;;;;;;;;;;;;;;36538:9;:18;36548:7;36538:18;;;;;;;;;;;;:31;;;;;-1:-1:-1::0;;;;;36538:31:0::1;;;;;-1:-1:-1::0;;;;;36538:31:0::1;;;;;;36622:7;36610;36618:1;36610:10;;;;;;-1:-1:-1::0;;;36610:10:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;36589:41:0::1;36606:1;-1:-1:-1::0;;;;;36589:41:0::1;-1:-1:-1::0;;;;;;;;;;;36589:41:0::1;;;;;;;;;36645:12;36656:1;36645:12:::0;::::1;:::i;:::-;;;36699:1;36674:9;:21;36684:7;36692:1;36684:10;;;;;;-1:-1:-1::0;;;36684:10:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;36674:21:0::1;-1:-1:-1::0;;;;;36674:21:0::1;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;36743:1;36715:12;:24;36728:7;36736:1;36728:10;;;;;;-1:-1:-1::0;;;36728:10:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;36715:24:0::1;-1:-1:-1::0;;;;;36715:24:0::1;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;36773:11:0;;36765:5:::1;:1:::0;36769::::1;36765:5;:::i;:::-;:19;:45;;;;-1:-1:-1::0;36799:4:0;36804:5:::1;:1:::0;36808::::1;36804:5;:::i;:::-;36799:11;;;;;;-1:-1:-1::0;;;36799:11:0::1;;;;;;;;;;;;;;;36788:7;:22;;36765:45;36761:92;;;36831:6;36836:1;36831:6:::0;::::1;:::i;:::-;;;36761:92;36480:384;;;30118:1;;;36193:678:::0;;;:::o;35664:177::-;35794:39;35811:4;35817:2;35821:7;35794:39;;;;;;;;;;;;:16;:39::i;33283:82::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;33345:4:::1;:12:::0;33283:82::o;40324:120::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;40392:44:::1;40410:2;40414:21;40392:17;:44::i;:::-;40324:120:::0;:::o;38411:100::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;38485:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;38411:100:::0;:::o;33783:319::-;33847:7;33882:13;;33871:7;:24;33867:74;;-1:-1:-1;33927:1:0;;33783:319;-1:-1:-1;33783:319:0:o;33867:74::-;33966:7;33984:80;33996:1;33991:2;:6;:37;;;;-1:-1:-1;34026:1:0;34001:13;;;:9;:13;;;;;;-1:-1:-1;;;;;34001:13:0;:27;33991:37;33984:80;;;34045:7;34051:1;34045:7;;:::i;:::-;;;33984:80;;;34081:13;;;;:9;:13;;;;;;-1:-1:-1;;;;;34081:13:0;;33783:319;-1:-1:-1;;33783:319:0:o;33373:104::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;33445:15:::1;:24:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;33445:24:0::1;-1:-1:-1::0;;33445:24:0;;::::1;::::0;;;::::1;::::0;;33373:104::o;31024:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30244:85::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;30319:1:::1;30303:18:::0;;-1:-1:-1;;;;;;30303:18:0::1;::::0;;30244:85::o;38854:95::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;38922:9:::1;:19:::0;;-1:-1:-1;;38922:19:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;38854:95::o;33485:80::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;33539:11:::1;:18:::0;;-1:-1:-1;;;;33539:18:0::1;-1:-1:-1::0;;;33539:18:0::1;::::0;;33485:80::o;31545:87::-;31584:13;31617:7;31610:14;;;;;:::i;34464:849::-;34581:15;;34557:10;34544:24;;;;34581:15;34544:24;;;;;;-1:-1:-1;;;34581:15:0;;;;;;34544:33;;34571:6;;34544:33;:::i;:::-;:52;;34522:118;;;;-1:-1:-1;;;34522:118:0;;11996:2:1;34522:118:0;;;11978:21:1;12035:2;12015:18;;;12008:30;-1:-1:-1;;;12054:18:1;;;12047:46;12110:18;;34522:118:0;11968:166:1;34522:118:0;34686:13;;;;;;;;;34659:23;;34676:6;;34659:14;;;;:23;:::i;:::-;:40;;34651:67;;;;-1:-1:-1;;;34651:67:0;;11299:2:1;34651:67:0;;;11281:21:1;11338:2;11318:18;;;11311:30;-1:-1:-1;;;11357:18:1;;;11350:44;11411:18;;34651:67:0;11271:164:1;34651:67:0;34737:11;;-1:-1:-1;;;34737:11:0;;;;34729:43;;;;-1:-1:-1;;;34729:43:0;;16171:2:1;34729:43:0;;;16153:21:1;16210:2;16190:18;;;16183:30;-1:-1:-1;;;16229:18:1;;;16222:49;16288:18;;34729:43:0;16143:169:1;34729:43:0;34785:17;34812:6;34805:4;;:13;;;;:::i;:::-;34785:33;;34850:9;34837;:22;;34829:55;;;;-1:-1:-1;;;34829:55:0;;13900:2:1;34829:55:0;;;13882:21:1;13939:2;13919:18;;;13912:30;-1:-1:-1;;;13958:18:1;;;13951:50;14018:18;;34829:55:0;13872:170:1;34829:55:0;34913:9;34901;:21;34897:105;;;34947:10;34939:51;34968:21;34980:9;34968;:21;:::i;:::-;34939:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34897:105;35019:9;35014:123;35038:6;35034:1;:10;35014:123;;;35123:1;35107:13;;:17;;;;:::i;:::-;35074:51;;35095:10;;35091:1;;-1:-1:-1;;;;;;;;;;;35074:51:0;35091:1;;35074:51;35046:6;35051:1;35046:6;;:::i;:::-;;;35014:123;;;-1:-1:-1;35159:13:0;;35149:24;;;;:9;:24;;;;;:37;;-1:-1:-1;;;;;;35149:37:0;35176:10;35149:37;;;;;;35197:25;;35215:6;35197:5;:25::i;:::-;35259:6;35235:31;;:14;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35298:6;35277:28;;:11;;:28;;;;;;;;;;;;;;;;:::i;32370:185::-;32497:50;32516:10;32528:8;32538;32497:18;:50::i;38957:71::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;39005:8:::1;:15:::0;;-1:-1:-1;;39005:15:0::1;-1:-1:-1::0;;;39005:15:0::1;::::0;;38957:71::o;31052:27::-;;;;;;;:::i;35849:336::-;36008:28;36018:4;36024:2;36028:7;36008:9;:28::i;:::-;36054:48;36077:4;36083:2;36087:7;36096:5;36054:22;:48::i;:::-;36049:129;;36126:40;;-1:-1:-1;;;36126:40:0;;;;;;;;;;;36049:129;35849:336;;;;:::o;31086:27::-;;;;;;;:::i;37743:660::-;37858:11;;37799:13;;-1:-1:-1;;;37858:11:0;;;;37847:22;;;37825:119;;;;-1:-1:-1;;;37825:119:0;;14662:2:1;37825:119:0;;;14644:21:1;14701:2;14681:18;;;14674:30;14740:34;14720:18;;;14713:62;-1:-1:-1;;;14791:18:1;;;14784:45;14846:19;;37825:119:0;14634:237:1;37825:119:0;37961:8;;-1:-1:-1;;;37961:8:0;;;;37957:70;;38002:13;37995:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37743:660;;;:::o;37957:70::-;38039:28;38070:7;38039:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38139:1;38114:14;38108:28;:32;:287;;;;;;;;;;;;;;;;;38232:14;38273:18;:7;:16;:18::i;:::-;38318:13;38189:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38108:287;38088:307;37743:660;-1:-1:-1;;;37743:660:0:o;38743:103::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;38815:13:::1;:23:::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;38815:23:0;;::::1;::::0;;;::::1;::::0;;38743:103::o;38631:104::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;38707:20;;::::1;::::0;:13:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;32563:214::-:0;-1:-1:-1;;;;;32734:25:0;;;32705:4;32734:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;32563:214::o;30135:101::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;30211:5:::1;:17:::0;;-1:-1:-1;;;;;;30211:17:0::1;-1:-1:-1::0;;;;;30211:17:0;;;::::1;::::0;;;::::1;::::0;;30135:101::o;38519:104::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;38595:20;;::::1;::::0;:13:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;40452:153::-:0;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;40558:38:::1;::::0;-1:-1:-1;;;40558:38:0;;40590:4:::1;40558:38;::::0;::::1;9847:51:1::0;-1:-1:-1;;;;;40531:22:0;::::1;::::0;::::1;::::0;40554:2;;40531:22;;40558:23:::1;::::0;9820:18:1;;40558:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40531:66;::::0;-1:-1:-1;;;;;;40531:66:0::1;::::0;;;;;;-1:-1:-1;;;;;10594:32:1;;;40531:66:0::1;::::0;::::1;10576:51:1::0;10643:18;;;10636:34;10549:18;;40531:66:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32785:167::-:0;32860:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32860:29:0;-1:-1:-1;;;;;32860:29:0;;;;;;;;:24;;32914:16;32860:24;32914:7;:16::i;:::-;-1:-1:-1;;;;;32905:39:0;;;;;;;;;;;32785:167;;:::o;36879:856::-;36995:16;37014;37022:7;37014;:16::i;:::-;36995:35;;37059:2;-1:-1:-1;;;;;37051:10:0;:4;-1:-1:-1;;;;;37051:10:0;;;37043:54;;;;-1:-1:-1;;;37043:54:0;;16519:2:1;37043:54:0;;;16501:21:1;16558:2;16538:18;;;16531:30;16597:33;16577:18;;;16570:61;16648:18;;37043:54:0;16491:181:1;37043:54:0;37124:8;-1:-1:-1;;;;;37116:16:0;:4;-1:-1:-1;;;;;37116:16:0;;37108:49;;;;-1:-1:-1;;;37108:49:0;;13126:2:1;37108:49:0;;;13108:21:1;13165:2;13145:18;;;13138:30;-1:-1:-1;;;13184:18:1;;;13177:50;13244:18;;37108:49:0;13098:170:1;37108:49:0;37190:10;-1:-1:-1;;;;;37190:22:0;;;;:81;;;37233:38;37250:8;37260:10;37233:16;:38::i;:::-;37190:136;;;-1:-1:-1;37316:10:0;37292:20;37304:7;37292:11;:20::i;:::-;-1:-1:-1;;;;;37292:34:0;;37190:136;37168:199;;;;-1:-1:-1;;;37168:199:0;;15829:2:1;37168:199:0;;;15811:21:1;15868:2;15848:18;;;15841:30;-1:-1:-1;;;15887:18:1;;;15880:43;15940:18;;37168:199:0;15801:163:1;37168:199:0;37380:29;37397:1;37401:7;37380:8;:29::i;:::-;37422:18;;;;:9;:18;;;;;:23;;-1:-1:-1;;;;;;37422:23:0;-1:-1:-1;;;;;37422:23:0;;;;;37475:11;37422:18;-1:-1:-1;37475:11:0;:::i;:::-;37532:1;37503:17;;;:9;:17;;;;;;37458:28;;-1:-1:-1;;;;;;37503:17:0;:31;:57;;;;;37547:13;;37538:6;:22;37503:57;37499:118;;;37577:17;;;;:9;:17;;;;;:28;;-1:-1:-1;;;;;;37577:28:0;-1:-1:-1;;;;;37577:28:0;;;;;37499:118;-1:-1:-1;;;;;37629:19:0;;;;;;:9;:19;;;;;:24;;37652:1;;37629:19;:24;;37652:1;;37629:24;:::i;:::-;;;;-1:-1:-1;;;;;;;37664:13:0;;;;;;:9;:13;;;;;:18;;37681:1;;37664:13;:18;;37681:1;;37664:18;:::i;:::-;;;;-1:-1:-1;;37700:27:0;;37719:7;;-1:-1:-1;;;;;37700:27:0;;;;;;;;-1:-1:-1;;;;;;;;;;;37700:27:0;;;;36879:856;;;;;:::o;35321:165::-;-1:-1:-1;;;;;35384:13:0;;;;;;:9;:13;;;;;:23;;35401:6;;35384:13;:23;;35401:6;;35384:23;:::i;:::-;;;;-1:-1:-1;;;;;;;35418:16:0;;;;;;:12;:16;;;;;:26;;35438:6;;35418:16;:26;;35438:6;;35418:26;:::i;:::-;;;;;;;;35472:6;35455:13;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;35321:165:0:o;14189:317::-;14304:6;14279:21;:31;;14271:73;;;;-1:-1:-1;;;14271:73:0;;12768:2:1;14271:73:0;;;12750:21:1;12807:2;12787:18;;;12780:30;12846:31;12826:18;;;12819:59;12895:18;;14271:73:0;12740:179:1;14271:73:0;14358:12;14376:9;-1:-1:-1;;;;;14376:14:0;14398:6;14376:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14357:52;;;14428:7;14420:78;;;;-1:-1:-1;;;14420:78:0;;12341:2:1;14420:78:0;;;12323:21:1;12380:2;12360:18;;;12353:30;12419:34;12399:18;;;12392:62;12490:28;12470:18;;;12463:56;12536:19;;14420:78:0;12313:248:1;32960:315:0;33115:8;-1:-1:-1;;;;;33106:17:0;:5;-1:-1:-1;;;;;33106:17:0;;;33098:55;;;;-1:-1:-1;;;33098:55:0;;11642:2:1;33098:55:0;;;11624:21:1;11681:2;11661:18;;;11654:30;11720:27;11700:18;;;11693:55;11765:18;;33098:55:0;11614:175:1;33098:55:0;-1:-1:-1;;;;;33164:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;33164:46:0;;;;;;;;;;33226:41;;10821::1;;;33226::0;;10794:18:1;33226:41:0;;;;;;;32960:315;;;:::o;39395:921::-;39550:4;-1:-1:-1;;;;;39571:13:0;;13223:19;:23;39567:742;;39624:173;;-1:-1:-1;;;39624:173:0;;-1:-1:-1;;;;;39624:36:0;;;;;:173;;39683:10;;39716:4;;39743:7;;39773:5;;39624:173;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39624:173:0;;;;;;;;-1:-1:-1;;39624:173:0;;;;;;;;;;;;:::i;:::-;;;39603:651;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39984:13:0;;39980:259;;40034:40;;-1:-1:-1;;;40034:40:0;;;;;;;;;;;39980:259;40189:6;40183:13;40174:6;40170:2;40166:15;40159:38;39603:651;-1:-1:-1;;;;;;39861:55:0;-1:-1:-1;;;39861:55:0;;-1:-1:-1;39854:62:0;;39567:742;-1:-1:-1;40293:4:0;39567:742;39395:921;;;;;;:::o;402:723::-;458:13;679:10;675:53;;-1:-1:-1;;706:10:0;;;;;;;;;;;;-1:-1:-1;;;706:10:0;;;;;402:723::o;675:53::-;753:5;738:12;794:78;801:9;;794:78;;827:8;;;;:::i;:::-;;-1:-1:-1;850:10:0;;-1:-1:-1;858:2:0;850:10;;:::i;:::-;;;794:78;;;882:19;914:6;904:17;;;;;;-1:-1:-1;;;904:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;904:17:0;;882:39;;932:154;939:10;;932:154;;966:11;976:1;966:11;;:::i;:::-;;-1:-1:-1;1035:10:0;1043:2;1035:5;:10;:::i;:::-;1022:24;;:2;:24;:::i;:::-;1009:39;;992:6;999;992:14;;;;;;-1:-1:-1;;;992:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;992:56:0;;;;;;;;-1:-1:-1;1063:11:0;1072:2;1063:11;;:::i;:::-;;;932:154;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:2;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:2;;;309:1;306;299:12;268:2;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;88:332;;;;;:::o;425:768::-;479:5;532:3;525:4;517:6;513:17;509:27;499:2;;554:5;547;540:20;499:2;594:6;581:20;620:4;644:60;660:43;700:2;660:43;:::i;:::-;644:60;:::i;:::-;726:3;750:2;745:3;738:15;778:2;773:3;769:12;762:19;;813:2;805:6;801:15;865:3;860:2;854;851:1;847:10;839:6;835:23;831:32;828:41;825:2;;;886:5;879;872:20;825:2;912:5;926:238;940:2;937:1;934:9;926:238;;;1011:3;998:17;1028:31;1053:5;1028:31;:::i;:::-;1072:18;;1110:12;;;;1142;;;;958:1;951:9;926:238;;;-1:-1:-1;1182:5:1;;489:704;-1:-1:-1;;;;;;;489:704:1:o;1198:257::-;1257:6;1310:2;1298:9;1289:7;1285:23;1281:32;1278:2;;;1331:6;1323;1316:22;1278:2;1375:9;1362:23;1394:31;1419:5;1394:31;:::i;1730:398::-;1798:6;1806;1859:2;1847:9;1838:7;1834:23;1830:32;1827:2;;;1880:6;1872;1865:22;1827:2;1924:9;1911:23;1943:31;1968:5;1943:31;:::i;:::-;1993:5;-1:-1:-1;2050:2:1;2035:18;;2022:32;2063:33;2022:32;2063:33;:::i;:::-;2115:7;2105:17;;;1817:311;;;;;:::o;2133:466::-;2210:6;2218;2226;2279:2;2267:9;2258:7;2254:23;2250:32;2247:2;;;2300:6;2292;2285:22;2247:2;2344:9;2331:23;2363:31;2388:5;2363:31;:::i;:::-;2413:5;-1:-1:-1;2470:2:1;2455:18;;2442:32;2483:33;2442:32;2483:33;:::i;:::-;2237:362;;2535:7;;-1:-1:-1;;;2589:2:1;2574:18;;;;2561:32;;2237:362::o;2604:824::-;2699:6;2707;2715;2723;2776:3;2764:9;2755:7;2751:23;2747:33;2744:2;;;2798:6;2790;2783:22;2744:2;2842:9;2829:23;2861:31;2886:5;2861:31;:::i;:::-;2911:5;-1:-1:-1;2968:2:1;2953:18;;2940:32;2981:33;2940:32;2981:33;:::i;:::-;3033:7;-1:-1:-1;3087:2:1;3072:18;;3059:32;;-1:-1:-1;3142:2:1;3127:18;;3114:32;3169:18;3158:30;;3155:2;;;3206:6;3198;3191:22;3155:2;3234:22;;3287:4;3279:13;;3275:27;-1:-1:-1;3265:2:1;;3321:6;3313;3306:22;3265:2;3349:73;3414:7;3409:2;3396:16;3391:2;3387;3383:11;3349:73;:::i;:::-;3339:83;;;2734:694;;;;;;;:::o;3433:392::-;3498:6;3506;3559:2;3547:9;3538:7;3534:23;3530:32;3527:2;;;3580:6;3572;3565:22;3527:2;3624:9;3611:23;3643:31;3668:5;3643:31;:::i;:::-;3693:5;-1:-1:-1;3750:2:1;3735:18;;3722:32;3763:30;3722:32;3763:30;:::i;3830:325::-;3898:6;3906;3959:2;3947:9;3938:7;3934:23;3930:32;3927:2;;;3980:6;3972;3965:22;3927:2;4024:9;4011:23;4043:31;4068:5;4043:31;:::i;:::-;4093:5;4145:2;4130:18;;;;4117:32;;-1:-1:-1;;;3917:238:1:o;4160:1274::-;4287:6;4295;4303;4356:2;4344:9;4335:7;4331:23;4327:32;4324:2;;;4377:6;4369;4362:22;4324:2;4422:9;4409:23;4451:18;4492:2;4484:6;4481:14;4478:2;;;4513:6;4505;4498:22;4478:2;4556:6;4545:9;4541:22;4531:32;;4601:7;4594:4;4590:2;4586:13;4582:27;4572:2;;4628:6;4620;4613:22;4572:2;4669;4656:16;4691:4;4715:60;4731:43;4771:2;4731:43;:::i;4715:60::-;4797:3;4821:2;4816:3;4809:15;4849:2;4844:3;4840:12;4833:19;;4880:2;4876;4872:11;4928:7;4923:2;4917;4914:1;4910:10;4906:2;4902:19;4898:28;4895:41;4892:2;;;4954:6;4946;4939:22;4892:2;4981:6;4972:15;;4996:163;5010:2;5007:1;5004:9;4996:163;;;5067:17;;5055:30;;5028:1;5021:9;;;;;5105:12;;;;5137;;4996:163;;;-1:-1:-1;5178:5:1;-1:-1:-1;;5221:18:1;;5208:32;;-1:-1:-1;;5252:16:1;;;5249:2;;;5286:6;5278;5271:22;5249:2;;5314:63;5369:7;5358:8;5347:9;5343:24;5314:63;:::i;:::-;5304:73;;;5424:2;5413:9;5409:18;5396:32;5386:42;;4314:1120;;;;;:::o;5439:255::-;5506:6;5559:2;5547:9;5538:7;5534:23;5530:32;5527:2;;;5580:6;5572;5565:22;5527:2;5617:9;5611:16;5636:28;5658:5;5636:28;:::i;5699:255::-;5757:6;5810:2;5798:9;5789:7;5785:23;5781:32;5778:2;;;5831:6;5823;5816:22;5778:2;5875:9;5862:23;5894:30;5918:5;5894:30;:::i;5959:259::-;6028:6;6081:2;6069:9;6060:7;6056:23;6052:32;6049:2;;;6102:6;6094;6087:22;6049:2;6139:9;6133:16;6158:30;6182:5;6158:30;:::i;6223:480::-;6292:6;6345:2;6333:9;6324:7;6320:23;6316:32;6313:2;;;6366:6;6358;6351:22;6313:2;6411:9;6398:23;6444:18;6436:6;6433:30;6430:2;;;6481:6;6473;6466:22;6430:2;6509:22;;6562:4;6554:13;;6550:27;-1:-1:-1;6540:2:1;;6596:6;6588;6581:22;6540:2;6624:73;6689:7;6684:2;6671:16;6666:2;6662;6658:11;6624:73;:::i;6708:292::-;6766:6;6819:2;6807:9;6798:7;6794:23;6790:32;6787:2;;;6840:6;6832;6825:22;6787:2;6884:9;6871:23;6934:6;6927:5;6923:18;6916:5;6913:29;6903:2;;6961:6;6953;6946:22;7005:190;7064:6;7117:2;7105:9;7096:7;7092:23;7088:32;7085:2;;;7138:6;7130;7123:22;7085:2;-1:-1:-1;7166:23:1;;7075:120;-1:-1:-1;7075:120:1:o;7200:194::-;7270:6;7323:2;7311:9;7302:7;7298:23;7294:32;7291:2;;;7344:6;7336;7329:22;7291:2;-1:-1:-1;7372:16:1;;7281:113;-1:-1:-1;7281:113:1:o;7399:289::-;7456:6;7509:2;7497:9;7488:7;7484:23;7480:32;7477:2;;;7530:6;7522;7515:22;7477:2;7574:9;7561:23;7624:4;7617:5;7613:16;7606:5;7603:27;7593:2;;7649:6;7641;7634:22;7693:257;7734:3;7772:5;7766:12;7799:6;7794:3;7787:19;7815:63;7871:6;7864:4;7859:3;7855:14;7848:4;7841:5;7837:16;7815:63;:::i;:::-;7932:2;7911:15;-1:-1:-1;;7907:29:1;7898:39;;;;7939:4;7894:50;;7742:208;-1:-1:-1;;7742:208:1:o;7955:1531::-;8179:3;8217:6;8211:13;8243:4;8256:51;8300:6;8295:3;8290:2;8282:6;8278:15;8256:51;:::i;:::-;8370:13;;8329:16;;;;8392:55;8370:13;8329:16;8414:15;;;8392:55;:::i;:::-;8538:13;;8469:20;;;8509:3;;8598:1;8620:18;;;;8673;;;;8700:2;;8778:4;8768:8;8764:19;8752:31;;8700:2;8841;8831:8;8828:16;8808:18;8805:40;8802:2;;;-1:-1:-1;;;8868:33:1;;8924:4;8921:1;8914:15;8954:4;8875:3;8942:17;8802:2;8985:18;9012:110;;;;9136:1;9131:330;;;;8978:483;;9012:110;-1:-1:-1;;9047:24:1;;9033:39;;9092:20;;;;-1:-1:-1;9012:110:1;;9131:330;17756:4;17775:17;;;17825:4;17809:21;;9226:3;9242:169;9256:8;9253:1;9250:15;9242:169;;;9338:14;;9323:13;;;9316:37;9381:16;;;;9273:10;;9242:169;;;9246:3;;9442:8;9435:5;9431:20;9424:27;;8978:483;-1:-1:-1;9477:3:1;;8187:1299;-1:-1:-1;;;;;;;;;;;8187:1299:1:o;9909:488::-;-1:-1:-1;;;;;10178:15:1;;;10160:34;;10230:15;;10225:2;10210:18;;10203:43;10277:2;10262:18;;10255:34;;;10325:3;10320:2;10305:18;;10298:31;;;10103:4;;10346:45;;10371:19;;10363:6;10346:45;:::i;:::-;10338:53;10112:285;-1:-1:-1;;;;;;10112:285:1:o;10873:219::-;11022:2;11011:9;11004:21;10985:4;11042:44;11082:2;11071:9;11067:18;11059:6;11042:44;:::i;15278:344::-;15480:2;15462:21;;;15519:2;15499:18;;;15492:30;-1:-1:-1;;;15553:2:1;15538:18;;15531:50;15613:2;15598:18;;15452:170::o;17241:275::-;17312:2;17306:9;17377:2;17358:13;;-1:-1:-1;;17354:27:1;17342:40;;17412:18;17397:34;;17433:22;;;17394:62;17391:2;;;17459:18;;:::i;:::-;17495:2;17488:22;17286:230;;-1:-1:-1;17286:230:1:o;17521:183::-;17581:4;17614:18;17606:6;17603:30;17600:2;;;17636:18;;:::i;:::-;-1:-1:-1;17681:1:1;17677:14;17693:4;17673:25;;17590:114::o;17841:224::-;17880:3;17908:6;17941:2;17938:1;17934:10;17971:2;17968:1;17964:10;18002:3;17998:2;17994:12;17989:3;17986:21;17983:2;;;18010:18;;:::i;:::-;18046:13;;17888:177;-1:-1:-1;;;;17888:177:1:o;18070:128::-;18110:3;18141:1;18137:6;18134:1;18131:13;18128:2;;;18147:18;;:::i;:::-;-1:-1:-1;18183:9:1;;18118:80::o;18203:120::-;18243:1;18269;18259:2;;18274:18;;:::i;:::-;-1:-1:-1;18308:9:1;;18249:74::o;18328:168::-;18368:7;18434:1;18430;18426:6;18422:14;18419:1;18416:21;18411:1;18404:9;18397:17;18393:45;18390:2;;;18441:18;;:::i;:::-;-1:-1:-1;18481:9:1;;18380:116::o;18501:125::-;18541:4;18569:1;18566;18563:8;18560:2;;;18574:18;;:::i;:::-;-1:-1:-1;18611:9:1;;18550:76::o;18631:258::-;18703:1;18713:113;18727:6;18724:1;18721:13;18713:113;;;18803:11;;;18797:18;18784:11;;;18777:39;18749:2;18742:10;18713:113;;;18844:6;18841:1;18838:13;18835:2;;;-1:-1:-1;;18879:1:1;18861:16;;18854:27;18684:205::o;18894:380::-;18973:1;18969:12;;;;19016;;;19037:2;;19091:4;19083:6;19079:17;19069:27;;19037:2;19144;19136:6;19133:14;19113:18;19110:38;19107:2;;;19190:10;19185:3;19181:20;19178:1;19171:31;19225:4;19222:1;19215:15;19253:4;19250:1;19243:15;19107:2;;18949:325;;;:::o;19279:135::-;19318:3;-1:-1:-1;;19339:17:1;;19336:2;;;19359:18;;:::i;:::-;-1:-1:-1;19406:1:1;19395:13;;19326:88::o;19419:112::-;19451:1;19477;19467:2;;19482:18;;:::i;:::-;-1:-1:-1;19516:9:1;;19457:74::o;19536:127::-;19597:10;19592:3;19588:20;19585:1;19578:31;19628:4;19625:1;19618:15;19652:4;19649:1;19642:15;19668:127;19729:10;19724:3;19720:20;19717:1;19710:31;19760:4;19757:1;19750:15;19784:4;19781:1;19774:15;19800:127;19861:10;19856:3;19852:20;19849:1;19842:31;19892:4;19889:1;19882:15;19916:4;19913:1;19906:15;19932:131;-1:-1:-1;;;;;20007:31:1;;19997:42;;19987:2;;20053:1;20050;20043:12;20068:118;20154:5;20147:13;20140:21;20133:5;20130:32;20120:2;;20176:1;20173;20166:12;20191:131;-1:-1:-1;;;;;;20265:32:1;;20255:43;;20245:2;;20312:1;20309;20302:12

Swarm Source

ipfs://d858eafb2323f16b6f00e5795db80ecc91984e96717741c49a09a001fe431d78
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.