ETH Price: $3,667.64 (+2.48%)

Token

ERC-20: Maxigoons (GOON)
 

Overview

Max Total Supply

7,007 GOON

Holders

1,265

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
18 GOON
0x54e44b2185a7e2217d2a110a3ee8025bfa56349c
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Maxigoons

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 8 : Maxigoons.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

import "./NFT.sol";

contract Maxigoons is NFT {
  constructor(address vrfCoordinator, address linkToken)
    ERC721a("Maxigoons", "GOON")
    NFT(
      7007, // Max supply
      707, // Reserve amount
      100, // Max per wallet
      "bafybeicxiym4ou5ephvt4j66if3axll3s3uq7axspgcdjr5tvrtrfboqsa", // Content ID (CID)
      "bab93ab37b236a32545c4bb2239ac9da276bc18324bcdcf0d86e0d225299db7b", // Provenance Hash
      0x9d14CAea98d6Ef30Ae169c361D2540dd680Bc280, // Vault address
      vrfCoordinator,
      linkToken
    )
  {}

  function claim(bytes32[] memory proof) public {
    _sell(0, 1, 0, proof);
  }

  function presale(uint256 amount, bytes32[] memory proof) public payable {
    _sell(1, amount, msg.value, proof);
  }

  function buy(uint256 amount) public payable {
    _sell(2, amount, msg.value, new bytes32[](0));
  }

  function mint(
    uint256 index,
    uint256 amount,
    bytes32[] memory proof
  ) public payable {
    _sell(index, amount, msg.value, proof);
  }
}

File 2 of 8 : NFT.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import "@chainlink/contracts/src/v0.8/VRFConsumerBase.sol";
import "./ERC721a.sol";

abstract contract NFT is ERC721a, VRFConsumerBase {
  struct Sale {
    uint256 unitPrice;
    uint256 maxAmount;
    bytes32 treeRoot;
  }

  event OwnerUpdated(address indexed user, address indexed newOwner);

  event Revealed(uint256 seed, bytes32 requestId);

  bool public enabled;

  address public owner;

  address public vault;

  string public contentId;

  string public provenance;

  uint256 public maxSupply;

  uint256 public maxPerWallet;

  uint256 public reserveAmount;

  uint256 public seed;

  uint256 public level;

  uint256 public vrfFee = 2 * 10**18;

  bytes32 public vrfHash =
    0xAA77729D3466CA35AE8D28B3BBAC7CC36A5031EFDC430821C02BC31A238AF445;

  Sale[] public sales;

  mapping(uint256 => mapping(address => uint256)) public balanceOfSale;

  constructor(
    uint256 _maxSupply,
    uint256 _reserveAmount,
    uint256 _maxPerWallet,
    string memory _contentId,
    string memory _provenance,
    address _vault,
    address vrfCoordinator,
    address linkToken
  ) VRFConsumerBase(vrfCoordinator, linkToken) {
    maxSupply = _maxSupply;
    reserveAmount = _reserveAmount;
    maxPerWallet = _maxPerWallet;
    contentId = _contentId;
    provenance = _provenance;
    vault = _vault;

    owner = msg.sender;
  }

  modifier onlyOwner() {
    require(msg.sender == owner, "401");
    _;
  }

  function updateOwner(address newOwner) external onlyOwner {
    owner = newOwner;

    emit OwnerUpdated(msg.sender, newOwner);
  }

  function setVRF(uint256 fee, bytes32 _hash) external onlyOwner {
    vrfFee = fee;
    vrfHash = _hash;
  }

  function setSale(
    uint256 index,
    uint256 unitPrice,
    uint256 maxAmount,
    bytes32 treeRoot
  ) external onlyOwner {
    require(index <= sales.length, "422");

    if (index == sales.length) {
      // Create
      sales.push(Sale(unitPrice, maxAmount, treeRoot));
    } else {
      // Update
      Sale storage sale = sales[index];

      sale.unitPrice = unitPrice;
      sale.maxAmount = maxAmount;
      sale.treeRoot = treeRoot;
    }
  }

  function setLevel(uint256 index) external onlyOwner {
    require(sales.length > 0 && index < sales.length, "422");

    level = index;
  }

  function enable() external onlyOwner {
    enabled = true;
  }

  function disable() external onlyOwner {
    enabled = false;
  }

  function reveal() public onlyOwner returns (bytes32) {
    require(seed == 0, "403");
    require(LINK.balanceOf(address(this)) >= vrfFee, "402");

    return requestRandomness(vrfHash, vrfFee);
  }

  function fulfillRandomness(bytes32 requestId, uint256 randomness)
    internal
    override
  {
    require(seed == 0, "403");

    seed = randomness;

    emit Revealed(randomness, requestId);
  }

  function hasLevel(
    uint256 index,
    address candidate,
    bytes32[] memory proof
  ) public view returns (bool) {
    require(index < sales.length, "404");

    Sale memory sale = sales[index];

    return
      MerkleProof.verify(
        proof,
        sale.treeRoot,
        keccak256(abi.encodePacked(candidate))
      );
  }

  function withdraw() external onlyOwner {
    payable(vault).transfer(address(this).balance);
  }

  function baseURI() public view virtual returns (string memory) {
    return string(abi.encodePacked("ipfs://", contentId, "/metadata/"));
  }

  function tokenURI(uint256 id) public view override returns (string memory) {
    require(_ownerOf(id) != address(0), "404");

    uint256 metaId;

    if (seed == 0) {
      // Conceal
      metaId = 0;
    } else {
      // Reveal
      metaId = _metadataOf(id);
    }

    return string(abi.encodePacked(baseURI(), toString(metaId), ".json"));
  }

  function contractURI() public view virtual returns (string memory) {
    return string(abi.encodePacked(baseURI(), "contract.json"));
  }

  function reserve(uint256 amount) public virtual onlyOwner {
    require(seed == 0, "403");
    require(totalSupply + amount <= maxSupply, "403");
    require(balanceOf[vault] + amount <= reserveAmount, "403");

    _safeMintBatch(vault, amount);
  }

  function _metadataOf(uint256 id) internal view returns (uint256) {
    uint256 seed_ = seed;

    uint256 max = maxSupply;

    uint256[] memory idToMeta = new uint256[](max);

    for (uint256 i = 0; i < max; i++) {
      idToMeta[i] = i;
    }

    for (uint256 i = 0; i < max - 1; i++) {
      uint256 j = i + (uint256(keccak256(abi.encode(seed_, i))) % (max - i));

      (idToMeta[i], idToMeta[j]) = (idToMeta[j], idToMeta[i]);
    }

    // Token ID starts at #1
    return idToMeta[id - 1] + 1;
  }

  function _sell(
    uint256 index,
    uint256 amount,
    uint256 value,
    bytes32[] memory proof
  ) internal {
    Sale memory sale = sales[index];

    bool isProtected = sale.treeRoot != 0;

    // Unauthorized
    require(enabled && sales.length > 0, "401");

    if (isProtected) {
      require(hasLevel(index, msg.sender, proof), "401");
    }

    // Payment required
    require(amount * sale.unitPrice == value, "402");

    // Forbidden
    require(index <= level, "403");
    require(balanceOf[msg.sender] + amount <= maxPerWallet, "403");
    require(totalSupply + amount <= maxSupply, "403");

    if (isProtected) {
      balanceOfSale[index][msg.sender] += amount;

      require(balanceOfSale[index][msg.sender] <= sale.maxAmount, "403");
    } else {
      // Open sale
      // Trick `sale.maxAmount` becomes `maxPerTx`
      require(amount <= sale.maxAmount, "403");
    }

    _safeMintBatch(msg.sender, amount);
  }
}

File 3 of 8 : MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 4 of 8 : VRFConsumerBase.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./interfaces/LinkTokenInterface.sol";

import "./VRFRequestIDBase.sol";

/** ****************************************************************************
 * @notice Interface for contracts using VRF randomness
 * *****************************************************************************
 * @dev PURPOSE
 *
 * @dev Reggie the Random Oracle (not his real job) wants to provide randomness
 * @dev to Vera the verifier in such a way that Vera can be sure he's not
 * @dev making his output up to suit himself. Reggie provides Vera a public key
 * @dev to which he knows the secret key. Each time Vera provides a seed to
 * @dev Reggie, he gives back a value which is computed completely
 * @dev deterministically from the seed and the secret key.
 *
 * @dev Reggie provides a proof by which Vera can verify that the output was
 * @dev correctly computed once Reggie tells it to her, but without that proof,
 * @dev the output is indistinguishable to her from a uniform random sample
 * @dev from the output space.
 *
 * @dev The purpose of this contract is to make it easy for unrelated contracts
 * @dev to talk to Vera the verifier about the work Reggie is doing, to provide
 * @dev simple access to a verifiable source of randomness.
 * *****************************************************************************
 * @dev USAGE
 *
 * @dev Calling contracts must inherit from VRFConsumerBase, and can
 * @dev initialize VRFConsumerBase's attributes in their constructor as
 * @dev shown:
 *
 * @dev   contract VRFConsumer {
 * @dev     constructor(<other arguments>, address _vrfCoordinator, address _link)
 * @dev       VRFConsumerBase(_vrfCoordinator, _link) public {
 * @dev         <initialization with other arguments goes here>
 * @dev       }
 * @dev   }
 *
 * @dev The oracle will have given you an ID for the VRF keypair they have
 * @dev committed to (let's call it keyHash), and have told you the minimum LINK
 * @dev price for VRF service. Make sure your contract has sufficient LINK, and
 * @dev call requestRandomness(keyHash, fee, seed), where seed is the input you
 * @dev want to generate randomness from.
 *
 * @dev Once the VRFCoordinator has received and validated the oracle's response
 * @dev to your request, it will call your contract's fulfillRandomness method.
 *
 * @dev The randomness argument to fulfillRandomness is the actual random value
 * @dev generated from your seed.
 *
 * @dev The requestId argument is generated from the keyHash and the seed by
 * @dev makeRequestId(keyHash, seed). If your contract could have concurrent
 * @dev requests open, you can use the requestId to track which seed is
 * @dev associated with which randomness. See VRFRequestIDBase.sol for more
 * @dev details. (See "SECURITY CONSIDERATIONS" for principles to keep in mind,
 * @dev if your contract could have multiple requests in flight simultaneously.)
 *
 * @dev Colliding `requestId`s are cryptographically impossible as long as seeds
 * @dev differ. (Which is critical to making unpredictable randomness! See the
 * @dev next section.)
 *
 * *****************************************************************************
 * @dev SECURITY CONSIDERATIONS
 *
 * @dev A method with the ability to call your fulfillRandomness method directly
 * @dev could spoof a VRF response with any random value, so it's critical that
 * @dev it cannot be directly called by anything other than this base contract
 * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method).
 *
 * @dev For your users to trust that your contract's random behavior is free
 * @dev from malicious interference, it's best if you can write it so that all
 * @dev behaviors implied by a VRF response are executed *during* your
 * @dev fulfillRandomness method. If your contract must store the response (or
 * @dev anything derived from it) and use it later, you must ensure that any
 * @dev user-significant behavior which depends on that stored value cannot be
 * @dev manipulated by a subsequent VRF request.
 *
 * @dev Similarly, both miners and the VRF oracle itself have some influence
 * @dev over the order in which VRF responses appear on the blockchain, so if
 * @dev your contract could have multiple VRF requests in flight simultaneously,
 * @dev you must ensure that the order in which the VRF responses arrive cannot
 * @dev be used to manipulate your contract's user-significant behavior.
 *
 * @dev Since the ultimate input to the VRF is mixed with the block hash of the
 * @dev block in which the request is made, user-provided seeds have no impact
 * @dev on its economic security properties. They are only included for API
 * @dev compatability with previous versions of this contract.
 *
 * @dev Since the block hash of the block which contains the requestRandomness
 * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful
 * @dev miner could, in principle, fork the blockchain to evict the block
 * @dev containing the request, forcing the request to be included in a
 * @dev different block with a different hash, and therefore a different input
 * @dev to the VRF. However, such an attack would incur a substantial economic
 * @dev cost. This cost scales with the number of blocks the VRF oracle waits
 * @dev until it calls responds to a request.
 */
abstract contract VRFConsumerBase is VRFRequestIDBase {
  /**
   * @notice fulfillRandomness handles the VRF response. Your contract must
   * @notice implement it. See "SECURITY CONSIDERATIONS" above for important
   * @notice principles to keep in mind when implementing your fulfillRandomness
   * @notice method.
   *
   * @dev VRFConsumerBase expects its subcontracts to have a method with this
   * @dev signature, and will call it once it has verified the proof
   * @dev associated with the randomness. (It is triggered via a call to
   * @dev rawFulfillRandomness, below.)
   *
   * @param requestId The Id initially returned by requestRandomness
   * @param randomness the VRF output
   */
  function fulfillRandomness(bytes32 requestId, uint256 randomness) internal virtual;

  /**
   * @dev In order to keep backwards compatibility we have kept the user
   * seed field around. We remove the use of it because given that the blockhash
   * enters later, it overrides whatever randomness the used seed provides.
   * Given that it adds no security, and can easily lead to misunderstandings,
   * we have removed it from usage and can now provide a simpler API.
   */
  uint256 private constant USER_SEED_PLACEHOLDER = 0;

  /**
   * @notice requestRandomness initiates a request for VRF output given _seed
   *
   * @dev The fulfillRandomness method receives the output, once it's provided
   * @dev by the Oracle, and verified by the vrfCoordinator.
   *
   * @dev The _keyHash must already be registered with the VRFCoordinator, and
   * @dev the _fee must exceed the fee specified during registration of the
   * @dev _keyHash.
   *
   * @dev The _seed parameter is vestigial, and is kept only for API
   * @dev compatibility with older versions. It can't *hurt* to mix in some of
   * @dev your own randomness, here, but it's not necessary because the VRF
   * @dev oracle will mix the hash of the block containing your request into the
   * @dev VRF seed it ultimately uses.
   *
   * @param _keyHash ID of public key against which randomness is generated
   * @param _fee The amount of LINK to send with the request
   *
   * @return requestId unique ID for this request
   *
   * @dev The returned requestId can be used to distinguish responses to
   * @dev concurrent requests. It is passed as the first argument to
   * @dev fulfillRandomness.
   */
  function requestRandomness(bytes32 _keyHash, uint256 _fee) internal returns (bytes32 requestId) {
    LINK.transferAndCall(vrfCoordinator, _fee, abi.encode(_keyHash, USER_SEED_PLACEHOLDER));
    // This is the seed passed to VRFCoordinator. The oracle will mix this with
    // the hash of the block containing this request to obtain the seed/input
    // which is finally passed to the VRF cryptographic machinery.
    uint256 vRFSeed = makeVRFInputSeed(_keyHash, USER_SEED_PLACEHOLDER, address(this), nonces[_keyHash]);
    // nonces[_keyHash] must stay in sync with
    // VRFCoordinator.nonces[_keyHash][this], which was incremented by the above
    // successful LINK.transferAndCall (in VRFCoordinator.randomnessRequest).
    // This provides protection against the user repeating their input seed,
    // which would result in a predictable/duplicate output, if multiple such
    // requests appeared in the same block.
    nonces[_keyHash] = nonces[_keyHash] + 1;
    return makeRequestId(_keyHash, vRFSeed);
  }

  LinkTokenInterface internal immutable LINK;
  address private immutable vrfCoordinator;

  // Nonces for each VRF key from which randomness has been requested.
  //
  // Must stay in sync with VRFCoordinator[_keyHash][this]
  mapping(bytes32 => uint256) /* keyHash */ /* nonce */
    private nonces;

  /**
   * @param _vrfCoordinator address of VRFCoordinator contract
   * @param _link address of LINK token contract
   *
   * @dev https://docs.chain.link/docs/link-token-contracts
   */
  constructor(address _vrfCoordinator, address _link) {
    vrfCoordinator = _vrfCoordinator;
    LINK = LinkTokenInterface(_link);
  }

  // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF
  // proof. rawFulfillRandomness then calls fulfillRandomness, after validating
  // the origin of the call
  function rawFulfillRandomness(bytes32 requestId, uint256 randomness) external {
    require(msg.sender == vrfCoordinator, "Only VRFCoordinator can fulfill");
    fulfillRandomness(requestId, randomness);
  }
}

File 5 of 8 : ERC721a.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

import "./ERC721TokenReceiver.sol";

/// @notice Credits: https://github.com/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol

/// @dev Note Assumes serials are sequentially minted starting at 1 (e.g. 1, 2, 3, 4...).
/// @dev Note Does not support burning tokens to address(0).

/// @author Modified from solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)

abstract contract ERC721a {
  /*///////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

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

  event Approval(
    address indexed owner,
    address indexed spender,
    uint256 indexed id
  );

  event ApprovalForAll(
    address indexed owner,
    address indexed operator,
    bool approved
  );

  /*///////////////////////////////////////////////////////////////
                          METADATA STORAGE/LOGIC
    //////////////////////////////////////////////////////////////*/

  string public name;

  string public symbol;

  function tokenURI(uint256 id) public view virtual returns (string memory);

  /*///////////////////////////////////////////////////////////////
                            ERC721 STORAGE                        
    //////////////////////////////////////////////////////////////*/

  uint256 public totalSupply;

  mapping(address => uint256) public balanceOf;

  mapping(uint256 => address) public getApproved;

  mapping(address => mapping(address => bool)) public isApprovedForAll;

  mapping(uint256 => address) internal owners;

  /*///////////////////////////////////////////////////////////////
                              CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

  constructor(string memory _name, string memory _symbol) {
    name = _name;
    symbol = _symbol;
  }

  /*///////////////////////////////////////////////////////////////
                              ERC721 LOGIC
    //////////////////////////////////////////////////////////////*/

  function setApprovalForAll(address operator, bool approved) public virtual {
    isApprovedForAll[msg.sender][operator] = approved;

    emit ApprovalForAll(msg.sender, operator, approved);
  }

  function safeTransferFrom(
    address from,
    address to,
    uint256 id
  ) public virtual {
    transferFrom(from, to, id);

    require(
      to.code.length == 0 ||
        ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
        ERC721TokenReceiver.onERC721Received.selector,
      "UNSAFE_RECIPIENT"
    );
  }

  function safeTransferFrom(
    address from,
    address to,
    uint256 id,
    bytes memory data
  ) public virtual {
    transferFrom(from, to, id);

    require(
      to.code.length == 0 ||
        ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
        ERC721TokenReceiver.onERC721Received.selector,
      "UNSAFE_RECIPIENT"
    );
  }

  /*///////////////////////////////////////////////////////////////
                              ERC721a LOGIC
    //////////////////////////////////////////////////////////////*/

  function ownerOf(uint256 id) public view returns (address) {
    return _ownerOf(id);
  }

  function approve(address spender, uint256 id) public {
    address owner = _ownerOf(id);

    require(
      msg.sender == owner || isApprovedForAll[owner][msg.sender],
      "NOT_AUTHORIZED"
    );

    getApproved[id] = spender;

    emit Approval(owner, spender, id);
  }

  function transferFrom(
    address from,
    address to,
    uint256 id
  ) public {
    address owner = _ownerOf(id);

    require(from == owner, "WRONG_FROM");

    require(to != address(0), "INVALID_RECIPIENT");

    require(
      msg.sender == from ||
        msg.sender == getApproved[id] ||
        isApprovedForAll[from][msg.sender],
      "NOT_AUTHORIZED"
    );

    // https://github.com/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol#L395
    unchecked {
      balanceOf[from]--;

      balanceOf[to]++;
    }

    owners[id] = to;

    // https://github.com/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol#L405
    if (id + 1 <= totalSupply && owners[id + 1] == address(0)) {
      owners[id + 1] = owner;
    }

    delete getApproved[id];

    emit Transfer(from, to, id);
  }

  function _safeMintBatch(address to, uint256 amount) internal {
    _safeMintBatch(to, amount, "");
  }

  function _safeMintBatch(
    address to,
    uint256 amount,
    bytes memory data
  ) internal {
    _mintBatch(to, amount, data, true);
  }

  function _mintBatch(address to, uint256 amount) internal {
    _mintBatch(to, amount, "", false);
  }

  function _mintBatch(
    address to,
    uint256 amount,
    bytes memory data
  ) internal {
    _mintBatch(to, amount, data, false);
  }

  function _mintBatch(
    address to,
    uint256 amount,
    bytes memory data,
    bool safe
  ) internal {
    require(to != address(0), "INVALID_RECIPIENT");

    unchecked {
      uint256 id = totalSupply + 1;

      totalSupply += amount;
      balanceOf[to] += amount;
      owners[id] = to;

      for (uint256 i = 0; i < amount; i++) {
        emit Transfer(address(0), to, id);

        if (safe) {
          require(
            to.code.length == 0 ||
              ERC721TokenReceiver(to).onERC721Received(
                msg.sender,
                address(0),
                id,
                data
              ) ==
              ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
          );
        }

        id++;
      }
    }
  }

  function _ownerOf(uint256 id) internal view returns (address) {
    if (id > totalSupply) {
      return address(0);
    }

    unchecked {
      while (id > 0) {
        if (owners[id] != address(0)) {
          return owners[id];
        }

        id--;
      }
    }

    // Happens only when `id == 0`
    return address(0);
  }

  /// @notice Credits: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol#L15

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

  /*///////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

  function supportsInterface(bytes4 interfaceId)
    public
    pure
    virtual
    returns (bool)
  {
    return
      interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
      interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
      interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
  }
}

File 6 of 8 : LinkTokenInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface LinkTokenInterface {
  function allowance(address owner, address spender) external view returns (uint256 remaining);

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

  function balanceOf(address owner) external view returns (uint256 balance);

  function decimals() external view returns (uint8 decimalPlaces);

  function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);

  function increaseApproval(address spender, uint256 subtractedValue) external;

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

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

  function totalSupply() external view returns (uint256 totalTokensIssued);

  function transfer(address to, uint256 value) external returns (bool success);

  function transferAndCall(
    address to,
    uint256 value,
    bytes calldata data
  ) external returns (bool success);

  function transferFrom(
    address from,
    address to,
    uint256 value
  ) external returns (bool success);
}

File 7 of 8 : VRFRequestIDBase.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract VRFRequestIDBase {
  /**
   * @notice returns the seed which is actually input to the VRF coordinator
   *
   * @dev To prevent repetition of VRF output due to repetition of the
   * @dev user-supplied seed, that seed is combined in a hash with the
   * @dev user-specific nonce, and the address of the consuming contract. The
   * @dev risk of repetition is mostly mitigated by inclusion of a blockhash in
   * @dev the final seed, but the nonce does protect against repetition in
   * @dev requests which are included in a single block.
   *
   * @param _userSeed VRF seed input provided by user
   * @param _requester Address of the requesting contract
   * @param _nonce User-specific nonce at the time of the request
   */
  function makeVRFInputSeed(
    bytes32 _keyHash,
    uint256 _userSeed,
    address _requester,
    uint256 _nonce
  ) internal pure returns (uint256) {
    return uint256(keccak256(abi.encode(_keyHash, _userSeed, _requester, _nonce)));
  }

  /**
   * @notice Returns the id for this request
   * @param _keyHash The serviceAgreement ID to be used for this request
   * @param _vRFInputSeed The seed to be passed directly to the VRF
   * @return The id for this request
   *
   * @dev Note that _vRFInputSeed is not the seed passed by the consuming
   * @dev contract, but the one generated by makeVRFInputSeed
   */
  function makeRequestId(bytes32 _keyHash, uint256 _vRFInputSeed) internal pure returns (bytes32) {
    return keccak256(abi.encodePacked(_keyHash, _vRFInputSeed));
  }
}

File 8 of 8 : ERC721TokenReceiver.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
interface ERC721TokenReceiver {
  function onERC721Received(
    address operator,
    address from,
    uint256 id,
    bytes calldata data
  ) external returns (bytes4);
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"vrfCoordinator","type":"address"},{"internalType":"address","name":"linkToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","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":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"seed","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"Revealed","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":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"balanceOfSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contentId","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"candidate","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"hasLevel","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"level","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"presale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"uint256","name":"randomness","type":"uint256"}],"name":"rawFulfillRandomness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reveal","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","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":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"sales","outputs":[{"internalType":"uint256","name":"unitPrice","type":"uint256"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"bytes32","name":"treeRoot","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"seed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"setLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"unitPrice","type":"uint256"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"bytes32","name":"treeRoot","type":"bytes32"}],"name":"setSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"setVRF","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"updateOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vrfFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vrfHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052671bc16d674ec800006011557faa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af44560001b6012553480156200004457600080fd5b50604051620051963803806200519683398181016040528101906200006a91906200036f565b611b5f6102c360646040518060600160405280603b81526020016200511b603b91396040518060600160405280604081526020016200515660409139739d14caea98d6ef30ae169c361d2540dd680bc280878781816040518060400160405280600981526020017f4d617869676f6f6e7300000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f474f4f4e00000000000000000000000000000000000000000000000000000000815250816000908051906020019062000143929190620002a8565b5080600190805190602001906200015c929190620002a8565b5050508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050505087600c8190555086600e8190555085600d8190555084600a9080519060200190620001fc929190620002a8565b5083600b908051906020019062000215929190620002a8565b5082600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600860016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505050505062000463565b828054620002b690620003e4565b90600052602060002090601f016020900481019282620002da576000855562000326565b82601f10620002f557805160ff191683800117855562000326565b8280016001018555821562000326579182015b828111156200032557825182559160200191906001019062000308565b5b50905062000335919062000339565b5090565b5b80821115620003545760008160009055506001016200033a565b5090565b600081519050620003698162000449565b92915050565b600080604083850312156200038357600080fd5b6000620003938582860162000358565b9250506020620003a68582860162000358565b9150509250929050565b6000620003bd82620003c4565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006002820490506001821680620003fd57607f821691505b602082108114156200041457620004136200041a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6200045481620003b0565b81146200046057600080fd5b50565b60805160601c60a05160601c614c7e6200049d60003960008181611de0015261288201526000818161218e01526128460152614c7e6000f3fe6080604052600436106102725760003560e01c80637d94792a1161014f578063b391c508116100c1578063d96a094a1161007a578063d96a094a14610933578063d97aa9771461094f578063e6d37b881461097a578063e8a3d48514610996578063e985e9c5146109c1578063fbfa77cf146109fe57610272565b8063b391c5081461081e578063b5f522f714610847578063b88d4fde14610886578063c13bd95c146108af578063c87b56dd146108cb578063d5abeb011461090857610272565b8063907316d011610113578063907316d01461073457806394985ddd1461075f57806395d89b4114610788578063a22cb465146107b3578063a3907d71146107dc578063a475b5dd146107f357610272565b80637d94792a1461064f578063819b25ba1461067a57806381e3e88a146106a3578063880cdc31146106e05780638da5cb5b1461070957610272565b80632f2770db116101e85780634b09b72a116101ac5780634b09b72a146105175780635feb1446146105425780636352211e1461057f5780636c0360eb146105bc5780636fd5ae15146105e757806370a082311461061257610272565b80632f2770db1461046c5780633ccfd60b1461048357806342842e0e1461049a578063453c2310146104c357806349f2f929146104ee57610272565b80631017507d1161023a5780631017507d1461037057806318160ddd1461039b57806319f428fa146103c6578063238dafe0146103ef57806323b872dd1461041a57806327a5428b1461044357610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c5780630f7309e814610345575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613a47565b610a29565b6040516102ab919061424c565b60405180910390f35b3480156102c057600080fd5b506102c9610abb565b6040516102d691906142f0565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190613a99565b610b49565b604051610313919061415d565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190613965565b610b7c565b005b34801561035157600080fd5b5061035a610d3a565b60405161036791906142f0565b60405180910390f35b34801561037c57600080fd5b50610385610dc8565b6040516103929190614452565b60405180910390f35b3480156103a757600080fd5b506103b0610dce565b6040516103bd9190614452565b60405180910390f35b3480156103d257600080fd5b506103ed60048036038101906103e89190613be2565b610dd4565b005b3480156103fb57600080fd5b50610404610e76565b604051610411919061424c565b60405180910390f35b34801561042657600080fd5b50610441600480360381019061043c919061385f565b610e89565b005b34801561044f57600080fd5b5061046a60048036038101906104659190613a99565b611351565b005b34801561047857600080fd5b50610481611443565b005b34801561048f57600080fd5b506104986114f0565b005b3480156104a657600080fd5b506104c160048036038101906104bc919061385f565b6115eb565b005b3480156104cf57600080fd5b506104d8611732565b6040516104e59190614452565b60405180910390f35b3480156104fa57600080fd5b5061051560048036038101906105109190613c85565b611738565b005b34801561052357600080fd5b5061052c6118f7565b6040516105399190614452565b60405180910390f35b34801561054e57600080fd5b5061056960048036038101906105649190613aeb565b6118fd565b6040516105769190614452565b60405180910390f35b34801561058b57600080fd5b506105a660048036038101906105a19190613a99565b611922565b6040516105b3919061415d565b60405180910390f35b3480156105c857600080fd5b506105d1611934565b6040516105de91906142f0565b60405180910390f35b3480156105f357600080fd5b506105fc61195c565b6040516106099190614452565b60405180910390f35b34801561061e57600080fd5b50610639600480360381019061063491906137fa565b611962565b6040516106469190614452565b60405180910390f35b34801561065b57600080fd5b5061066461197a565b6040516106719190614452565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190613a99565b611980565b005b3480156106af57600080fd5b506106ca60048036038101906106c59190613b27565b611b87565b6040516106d7919061424c565b60405180910390f35b3480156106ec57600080fd5b50610707600480360381019061070291906137fa565b611c84565b005b34801561071557600080fd5b5061071e611db2565b60405161072b919061415d565b60405180910390f35b34801561074057600080fd5b50610749611dd8565b6040516107569190614267565b60405180910390f35b34801561076b57600080fd5b5061078660048036038101906107819190613a0b565b611dde565b005b34801561079457600080fd5b5061079d611e7a565b6040516107aa91906142f0565b60405180910390f35b3480156107bf57600080fd5b506107da60048036038101906107d59190613929565b611f08565b005b3480156107e857600080fd5b506107f1612005565b005b3480156107ff57600080fd5b506108086120b2565b6040516108159190614267565b60405180910390f35b34801561082a57600080fd5b50610845600480360381019061084091906139a1565b612289565b005b34801561085357600080fd5b5061086e60048036038101906108699190613a99565b61229b565b60405161087d939291906144bf565b60405180910390f35b34801561089257600080fd5b506108ad60048036038101906108a891906138ae565b6122d5565b005b6108c960048036038101906108c49190613b8e565b61241f565b005b3480156108d757600080fd5b506108f260048036038101906108ed9190613a99565b612430565b6040516108ff91906142f0565b60405180910390f35b34801561091457600080fd5b5061091d612504565b60405161092a9190614452565b60405180910390f35b61094d60048036038101906109489190613a99565b61250a565b005b34801561095b57600080fd5b50610964612589565b60405161097191906142f0565b60405180910390f35b610994600480360381019061098f9190613c1e565b612617565b005b3480156109a257600080fd5b506109ab612628565b6040516109b891906142f0565b60405180910390f35b3480156109cd57600080fd5b506109e860048036038101906109e39190613823565b612656565b6040516109f5919061424c565b60405180910390f35b348015610a0a57600080fd5b50610a13612685565b604051610a20919061415d565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ab45750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60008054610ac8906147a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610af4906147a5565b8015610b415780601f10610b1657610100808354040283529160200191610b41565b820191906000526020600020905b815481529060010190602001808311610b2457829003601f168201915b505050505081565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610b87826126ab565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610c495750600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7f90614412565b60405180910390fd5b826004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600b8054610d47906147a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d73906147a5565b8015610dc05780601f10610d9557610100808354040283529160200191610dc0565b820191906000526020600020905b815481529060010190602001808311610da357829003601f168201915b505050505081565b60115481565b60025481565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5b90614332565b60405180910390fd5b81601181905550806012819055505050565b600860009054906101000a900460ff1681565b6000610e94826126ab565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efb90614432565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b90614372565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061100c57506004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061109d5750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6110dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d390614412565b60405180910390fd5b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506002546001836111dd91906145d0565b111580156112565750600073ffffffffffffffffffffffffffffffffffffffff166006600060018561120f91906145d0565b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b156112ba57806006600060018561126d91906145d0565b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d890614332565b60405180910390fd5b60006013805490501180156113fa575060138054905081105b611439576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143090614352565b60405180910390fd5b8060108190555050565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ca90614332565b60405180910390fd5b6000600860006101000a81548160ff021916908315150217905550565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157790614332565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156115e8573d6000803e3d6000fd5b50565b6115f6838383610e89565b60008273ffffffffffffffffffffffffffffffffffffffff163b14806116ee575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b815260040161167b939291906141c4565b602060405180830381600087803b15801561169557600080fd5b505af11580156116a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116cd9190613a70565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b61172d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611724906143b2565b60405180910390fd5b505050565b600d5481565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bf90614332565b60405180910390fd5b601380549050841115611810576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180790614352565b60405180910390fd5b601380549050841415611888576013604051806060016040528085815260200184815260200183815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000155602082015181600101556040820151816002015550506118f1565b6000601385815481106118c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600302019050838160000181905550828160010181905550818160020181905550505b50505050565b600e5481565b6014602052816000526040600020602052806000526040600020600091509150505481565b600061192d826126ab565b9050919050565b6060600a6040516020016119489190614130565b604051602081830303815290604052905090565b60105481565b60036020528060005260406000206000915090505481565b600f5481565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0790614332565b60405180910390fd5b6000600f5414611a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4c90614312565b60405180910390fd5b600c5481600254611a6691906145d0565b1115611aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9e90614312565b60405180910390fd5b600e548160036000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b1791906145d0565b1115611b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4f90614312565b60405180910390fd5b611b84600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612784565b50565b60006013805490508410611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc7906143f2565b60405180910390fd5b600060138581548110611c0c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820154815250509050611c7a83826040015186604051602001611c5f9190614098565b604051602081830303815290604052805190602001206127a2565b9150509392505050565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0b90614332565b60405180910390fd5b80600860016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7660405160405180910390a350565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60125481565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e63906143d2565b60405180910390fd5b611e7682826127b9565b5050565b60018054611e87906147a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611eb3906147a5565b8015611f005780601f10611ed557610100808354040283529160200191611f00565b820191906000526020600020905b815481529060010190602001808311611ee357829003601f168201915b505050505081565b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ff9919061424c565b60405180910390a35050565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208c90614332565b60405180910390fd5b6001600860006101000a81548160ff021916908315150217905550565b6000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213b90614332565b60405180910390fd5b6000600f5414612189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218090614312565b60405180910390fd5b6011547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016121e5919061415d565b60206040518083038186803b1580156121fd57600080fd5b505afa158015612211573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122359190613ac2565b1015612276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226d90614392565b60405180910390fd5b612284601254601154612842565b905090565b612298600060016000846129a4565b50565b601381815481106122ab57600080fd5b90600052602060002090600302016000915090508060000154908060010154908060020154905083565b6122e0848484610e89565b60008373ffffffffffffffffffffffffffffffffffffffff163b14806123da575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b81526004016123679493929190614178565b602060405180830381600087803b15801561238157600080fd5b505af1158015612395573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b99190613a70565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b612419576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612410906143b2565b60405180910390fd5b50505050565b61242c60018334846129a4565b5050565b6060600073ffffffffffffffffffffffffffffffffffffffff16612453836126ab565b73ffffffffffffffffffffffffffffffffffffffff1614156124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a1906143f2565b60405180910390fd5b600080600f5414156124bf57600090506124cb565b6124c883612db3565b90505b6124d3611934565b6124dc82613086565b6040516020016124ed9291906140df565b604051602081830303815290604052915050919050565b600c5481565b61258660028234600067ffffffffffffffff811115612552577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156125805781602001602082028036833780820191505090505b506129a4565b50565b600a8054612596906147a5565b80601f01602080910402602001604051908101604052809291908181526020018280546125c2906147a5565b801561260f5780601f106125e45761010080835404028352916020019161260f565b820191906000526020600020905b8154815290600101906020018083116125f257829003601f168201915b505050505081565b612623838334846129a4565b505050565b6060612632611934565b604051602001612642919061410e565b604051602081830303815290604052905090565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006002548211156126c0576000905061277f565b5b600082111561277a57600073ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461276c576006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061277f565b8180600190039250506126c1565b600090505b919050565b61279e828260405180602001604052806000815250613233565b5050565b6000826127af8584613245565b1490509392505050565b6000600f54146127fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f590614312565b60405180910390fd5b80600f819055507f7d69e344e8948ee2d0ae2411f140ed9d811e9281db0368d2f77a802d9d8346f5818360405161283692919061446d565b60405180910390a15050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634000aea07f0000000000000000000000000000000000000000000000000000000000000000848660006040516020016128b6929190614282565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016128e39392919061420e565b602060405180830381600087803b1580156128fd57600080fd5b505af1158015612911573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061293591906139e2565b5060006129588460003060076000898152602001908152602001600020546132e0565b90506001600760008681526020019081526020016000205461297a91906145d0565b600760008681526020019081526020016000208190555061299b848261331c565b91505092915050565b6000601385815481106129e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905060008060001b826040015114159050600860009054906101000a900460ff168015612a4957506000601380549050115b612a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7f90614332565b60405180910390fd5b8015612ad957612a99863385611b87565b612ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acf90614332565b60405180910390fd5b5b83826000015186612aea9190614657565b14612b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2190614392565b60405180910390fd5b601054861115612b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6690614312565b60405180910390fd5b600d5485600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bbd91906145d0565b1115612bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf590614312565b60405180910390fd5b600c5485600254612c0f91906145d0565b1115612c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4790614312565b60405180910390fd5b8015612d5957846014600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cb691906145d0565b9250508190555081602001516014600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115612d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4b90614312565b60405180910390fd5b612da1565b8160200151851115612da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9790614312565b60405180910390fd5b5b612dab3386612784565b505050505050565b600080600f5490506000600c54905060008167ffffffffffffffff811115612e04577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015612e325781602001602082028036833780820191505090505b50905060005b82811015612e995780828281518110612e7a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080612e9190614808565b915050612e38565b5060005b600183612eaa91906146b1565b8110156130225760008184612ebf91906146b1565b8583604051602001612ed2929190614496565b6040516020818303038152906040528051906020012060001c612ef59190614889565b82612f0091906145d0565b9050828181518110612f3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151838381518110612f7c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151848481518110612fbd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101858481518110612ffd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018281525082815250505050808061301a90614808565b915050612e9d565b5060018160018761303391906146b1565b8151811061306a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161307c91906145d0565b9350505050919050565b606060008214156130ce576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061322e565b600082905060005b600082146131005780806130e990614808565b915050600a826130f99190614626565b91506130d6565b60008167ffffffffffffffff811115613142577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156131745781602001600182028036833780820191505090505b5090505b600085146132275760018261318d91906146b1565b9150600a8561319c9190614889565b60306131a891906145d0565b60f81b8183815181106131e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132209190614626565b9450613178565b8093505050505b919050565b613240838383600161334f565b505050565b60008082905060005b84518110156132d5576000858281518110613292577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508083116132b4576132ad838261363d565b92506132c1565b6132be818461363d565b92505b5080806132cd90614808565b91505061324e565b508091505092915050565b6000848484846040516020016132f994939291906142ab565b6040516020818303038152906040528051906020012060001c9050949350505050565b600082826040516020016133319291906140b3565b60405160208183030381529060405280519060200120905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156133bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b690614372565b60405180910390fd5b600060016002540190508360026000828254019250508190555083600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550846006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b8481101561363557818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a482156136205760008673ffffffffffffffffffffffffffffffffffffffff163b14806135e0575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168673ffffffffffffffffffffffffffffffffffffffff1663150b7a0233600086896040518563ffffffff1660e01b815260040161356d9493929190614178565b602060405180830381600087803b15801561358757600080fd5b505af115801561359b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135bf9190613a70565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b61361f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613616906143b2565b60405180910390fd5b5b8180600101925050808060010191505061347b565b505050505050565b600082600052816020526040600020905092915050565b60006136676136628461451b565b6144f6565b9050808382526020820190508285602086028201111561368657600080fd5b60005b858110156136b6578161369c8882613767565b845260208401935060208301925050600181019050613689565b5050509392505050565b60006136d36136ce84614547565b6144f6565b9050828152602081018484840111156136eb57600080fd5b6136f6848285614763565b509392505050565b60008135905061370d81614bd5565b92915050565b600082601f83011261372457600080fd5b8135613734848260208601613654565b91505092915050565b60008135905061374c81614bec565b92915050565b60008151905061376181614bec565b92915050565b60008135905061377681614c03565b92915050565b60008135905061378b81614c1a565b92915050565b6000815190506137a081614c1a565b92915050565b600082601f8301126137b757600080fd5b81356137c78482602086016136c0565b91505092915050565b6000813590506137df81614c31565b92915050565b6000815190506137f481614c31565b92915050565b60006020828403121561380c57600080fd5b600061381a848285016136fe565b91505092915050565b6000806040838503121561383657600080fd5b6000613844858286016136fe565b9250506020613855858286016136fe565b9150509250929050565b60008060006060848603121561387457600080fd5b6000613882868287016136fe565b9350506020613893868287016136fe565b92505060406138a4868287016137d0565b9150509250925092565b600080600080608085870312156138c457600080fd5b60006138d2878288016136fe565b94505060206138e3878288016136fe565b93505060406138f4878288016137d0565b925050606085013567ffffffffffffffff81111561391157600080fd5b61391d878288016137a6565b91505092959194509250565b6000806040838503121561393c57600080fd5b600061394a858286016136fe565b925050602061395b8582860161373d565b9150509250929050565b6000806040838503121561397857600080fd5b6000613986858286016136fe565b9250506020613997858286016137d0565b9150509250929050565b6000602082840312156139b357600080fd5b600082013567ffffffffffffffff8111156139cd57600080fd5b6139d984828501613713565b91505092915050565b6000602082840312156139f457600080fd5b6000613a0284828501613752565b91505092915050565b60008060408385031215613a1e57600080fd5b6000613a2c85828601613767565b9250506020613a3d858286016137d0565b9150509250929050565b600060208284031215613a5957600080fd5b6000613a678482850161377c565b91505092915050565b600060208284031215613a8257600080fd5b6000613a9084828501613791565b91505092915050565b600060208284031215613aab57600080fd5b6000613ab9848285016137d0565b91505092915050565b600060208284031215613ad457600080fd5b6000613ae2848285016137e5565b91505092915050565b60008060408385031215613afe57600080fd5b6000613b0c858286016137d0565b9250506020613b1d858286016136fe565b9150509250929050565b600080600060608486031215613b3c57600080fd5b6000613b4a868287016137d0565b9350506020613b5b868287016136fe565b925050604084013567ffffffffffffffff811115613b7857600080fd5b613b8486828701613713565b9150509250925092565b60008060408385031215613ba157600080fd5b6000613baf858286016137d0565b925050602083013567ffffffffffffffff811115613bcc57600080fd5b613bd885828601613713565b9150509250929050565b60008060408385031215613bf557600080fd5b6000613c03858286016137d0565b9250506020613c1485828601613767565b9150509250929050565b600080600060608486031215613c3357600080fd5b6000613c41868287016137d0565b9350506020613c52868287016137d0565b925050604084013567ffffffffffffffff811115613c6f57600080fd5b613c7b86828701613713565b9150509250925092565b60008060008060808587031215613c9b57600080fd5b6000613ca9878288016137d0565b9450506020613cba878288016137d0565b9350506040613ccb878288016137d0565b9250506060613cdc87828801613767565b91505092959194509250565b613cf1816146e5565b82525050565b613d08613d03826146e5565b614851565b82525050565b613d17816146f7565b82525050565b613d2681614703565b82525050565b613d3d613d3882614703565b614863565b82525050565b6000613d4e8261458d565b613d5881856145a3565b9350613d68818560208601614772565b613d7181614976565b840191505092915050565b6000613d8782614598565b613d9181856145b4565b9350613da1818560208601614772565b613daa81614976565b840191505092915050565b6000613dc082614598565b613dca81856145c5565b9350613dda818560208601614772565b80840191505092915050565b60008154613df3816147a5565b613dfd81866145c5565b94506001821660008114613e185760018114613e2957613e5c565b60ff19831686528186019350613e5c565b613e3285614578565b60005b83811015613e5457815481890152600182019150602081019050613e35565b838801955050505b50505092915050565b6000613e726003836145b4565b9150613e7d82614994565b602082019050919050565b6000613e95600d836145c5565b9150613ea0826149bd565b600d82019050919050565b6000613eb86003836145b4565b9150613ec3826149e6565b602082019050919050565b6000613edb600a836145c5565b9150613ee682614a0f565b600a82019050919050565b6000613efe6003836145b4565b9150613f0982614a38565b602082019050919050565b6000613f216011836145b4565b9150613f2c82614a61565b602082019050919050565b6000613f446007836145c5565b9150613f4f82614a8a565b600782019050919050565b6000613f676003836145b4565b9150613f7282614ab3565b602082019050919050565b6000613f8a6010836145b4565b9150613f9582614adc565b602082019050919050565b6000613fad6005836145c5565b9150613fb882614b05565b600582019050919050565b6000613fd0601f836145b4565b9150613fdb82614b2e565b602082019050919050565b6000613ff36000836145a3565b9150613ffe82614b57565b600082019050919050565b60006140166003836145b4565b915061402182614b5a565b602082019050919050565b6000614039600e836145b4565b915061404482614b83565b602082019050919050565b600061405c600a836145b4565b915061406782614bac565b602082019050919050565b61407b81614759565b82525050565b61409261408d82614759565b61487f565b82525050565b60006140a48284613cf7565b60148201915081905092915050565b60006140bf8285613d2c565b6020820191506140cf8284614081565b6020820191508190509392505050565b60006140eb8285613db5565b91506140f78284613db5565b915061410282613fa0565b91508190509392505050565b600061411a8284613db5565b915061412582613e88565b915081905092915050565b600061413b82613f37565b91506141478284613de6565b915061415282613ece565b915081905092915050565b60006020820190506141726000830184613ce8565b92915050565b600060808201905061418d6000830187613ce8565b61419a6020830186613ce8565b6141a76040830185614072565b81810360608301526141b98184613d43565b905095945050505050565b60006080820190506141d96000830186613ce8565b6141e66020830185613ce8565b6141f36040830184614072565b818103606083015261420481613fe6565b9050949350505050565b60006060820190506142236000830186613ce8565b6142306020830185614072565b81810360408301526142428184613d43565b9050949350505050565b60006020820190506142616000830184613d0e565b92915050565b600060208201905061427c6000830184613d1d565b92915050565b60006040820190506142976000830185613d1d565b6142a46020830184614072565b9392505050565b60006080820190506142c06000830187613d1d565b6142cd6020830186614072565b6142da6040830185613ce8565b6142e76060830184614072565b95945050505050565b6000602082019050818103600083015261430a8184613d7c565b905092915050565b6000602082019050818103600083015261432b81613e65565b9050919050565b6000602082019050818103600083015261434b81613eab565b9050919050565b6000602082019050818103600083015261436b81613ef1565b9050919050565b6000602082019050818103600083015261438b81613f14565b9050919050565b600060208201905081810360008301526143ab81613f5a565b9050919050565b600060208201905081810360008301526143cb81613f7d565b9050919050565b600060208201905081810360008301526143eb81613fc3565b9050919050565b6000602082019050818103600083015261440b81614009565b9050919050565b6000602082019050818103600083015261442b8161402c565b9050919050565b6000602082019050818103600083015261444b8161404f565b9050919050565b60006020820190506144676000830184614072565b92915050565b60006040820190506144826000830185614072565b61448f6020830184613d1d565b9392505050565b60006040820190506144ab6000830185614072565b6144b86020830184614072565b9392505050565b60006060820190506144d46000830186614072565b6144e16020830185614072565b6144ee6040830184613d1d565b949350505050565b6000614500614511565b905061450c82826147d7565b919050565b6000604051905090565b600067ffffffffffffffff82111561453657614535614947565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561456257614561614947565b5b61456b82614976565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006145db82614759565b91506145e683614759565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561461b5761461a6148ba565b5b828201905092915050565b600061463182614759565b915061463c83614759565b92508261464c5761464b6148e9565b5b828204905092915050565b600061466282614759565b915061466d83614759565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146a6576146a56148ba565b5b828202905092915050565b60006146bc82614759565b91506146c783614759565b9250828210156146da576146d96148ba565b5b828203905092915050565b60006146f082614739565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614790578082015181840152602081019050614775565b8381111561479f576000848401525b50505050565b600060028204905060018216806147bd57607f821691505b602082108114156147d1576147d0614918565b5b50919050565b6147e082614976565b810181811067ffffffffffffffff821117156147ff576147fe614947565b5b80604052505050565b600061481382614759565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614846576148456148ba565b5b600182019050919050565b600061485c8261486d565b9050919050565b6000819050919050565b600061487882614987565b9050919050565b6000819050919050565b600061489482614759565b915061489f83614759565b9250826148af576148ae6148e9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f3430330000000000000000000000000000000000000000000000000000000000600082015250565b7f636f6e74726163742e6a736f6e00000000000000000000000000000000000000600082015250565b7f3430310000000000000000000000000000000000000000000000000000000000600082015250565b7f2f6d657461646174612f00000000000000000000000000000000000000000000600082015250565b7f3432320000000000000000000000000000000000000000000000000000000000600082015250565b7f494e56414c49445f524543495049454e54000000000000000000000000000000600082015250565b7f697066733a2f2f00000000000000000000000000000000000000000000000000600082015250565b7f3430320000000000000000000000000000000000000000000000000000000000600082015250565b7f554e534146455f524543495049454e5400000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c00600082015250565b50565b7f3430340000000000000000000000000000000000000000000000000000000000600082015250565b7f4e4f545f415554484f52495a4544000000000000000000000000000000000000600082015250565b7f57524f4e475f46524f4d00000000000000000000000000000000000000000000600082015250565b614bde816146e5565b8114614be957600080fd5b50565b614bf5816146f7565b8114614c0057600080fd5b50565b614c0c81614703565b8114614c1757600080fd5b50565b614c238161470d565b8114614c2e57600080fd5b50565b614c3a81614759565b8114614c4557600080fd5b5056fea264697066735822122033f5b2e2c305daab558a54fe73ecc6627545d3b396b6309d3c6ccd37815aaeaf64736f6c6343000804003362616679626569637869796d346f75356570687674346a363669663361786c6c337333757137617873706763646a7235747672747266626f71736162616239336162333762323336613332353435633462623232333961633964613237366263313833323462636463663064383665306432323532393964623762000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca

Deployed Bytecode

0x6080604052600436106102725760003560e01c80637d94792a1161014f578063b391c508116100c1578063d96a094a1161007a578063d96a094a14610933578063d97aa9771461094f578063e6d37b881461097a578063e8a3d48514610996578063e985e9c5146109c1578063fbfa77cf146109fe57610272565b8063b391c5081461081e578063b5f522f714610847578063b88d4fde14610886578063c13bd95c146108af578063c87b56dd146108cb578063d5abeb011461090857610272565b8063907316d011610113578063907316d01461073457806394985ddd1461075f57806395d89b4114610788578063a22cb465146107b3578063a3907d71146107dc578063a475b5dd146107f357610272565b80637d94792a1461064f578063819b25ba1461067a57806381e3e88a146106a3578063880cdc31146106e05780638da5cb5b1461070957610272565b80632f2770db116101e85780634b09b72a116101ac5780634b09b72a146105175780635feb1446146105425780636352211e1461057f5780636c0360eb146105bc5780636fd5ae15146105e757806370a082311461061257610272565b80632f2770db1461046c5780633ccfd60b1461048357806342842e0e1461049a578063453c2310146104c357806349f2f929146104ee57610272565b80631017507d1161023a5780631017507d1461037057806318160ddd1461039b57806319f428fa146103c6578063238dafe0146103ef57806323b872dd1461041a57806327a5428b1461044357610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c5780630f7309e814610345575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613a47565b610a29565b6040516102ab919061424c565b60405180910390f35b3480156102c057600080fd5b506102c9610abb565b6040516102d691906142f0565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190613a99565b610b49565b604051610313919061415d565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190613965565b610b7c565b005b34801561035157600080fd5b5061035a610d3a565b60405161036791906142f0565b60405180910390f35b34801561037c57600080fd5b50610385610dc8565b6040516103929190614452565b60405180910390f35b3480156103a757600080fd5b506103b0610dce565b6040516103bd9190614452565b60405180910390f35b3480156103d257600080fd5b506103ed60048036038101906103e89190613be2565b610dd4565b005b3480156103fb57600080fd5b50610404610e76565b604051610411919061424c565b60405180910390f35b34801561042657600080fd5b50610441600480360381019061043c919061385f565b610e89565b005b34801561044f57600080fd5b5061046a60048036038101906104659190613a99565b611351565b005b34801561047857600080fd5b50610481611443565b005b34801561048f57600080fd5b506104986114f0565b005b3480156104a657600080fd5b506104c160048036038101906104bc919061385f565b6115eb565b005b3480156104cf57600080fd5b506104d8611732565b6040516104e59190614452565b60405180910390f35b3480156104fa57600080fd5b5061051560048036038101906105109190613c85565b611738565b005b34801561052357600080fd5b5061052c6118f7565b6040516105399190614452565b60405180910390f35b34801561054e57600080fd5b5061056960048036038101906105649190613aeb565b6118fd565b6040516105769190614452565b60405180910390f35b34801561058b57600080fd5b506105a660048036038101906105a19190613a99565b611922565b6040516105b3919061415d565b60405180910390f35b3480156105c857600080fd5b506105d1611934565b6040516105de91906142f0565b60405180910390f35b3480156105f357600080fd5b506105fc61195c565b6040516106099190614452565b60405180910390f35b34801561061e57600080fd5b50610639600480360381019061063491906137fa565b611962565b6040516106469190614452565b60405180910390f35b34801561065b57600080fd5b5061066461197a565b6040516106719190614452565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190613a99565b611980565b005b3480156106af57600080fd5b506106ca60048036038101906106c59190613b27565b611b87565b6040516106d7919061424c565b60405180910390f35b3480156106ec57600080fd5b50610707600480360381019061070291906137fa565b611c84565b005b34801561071557600080fd5b5061071e611db2565b60405161072b919061415d565b60405180910390f35b34801561074057600080fd5b50610749611dd8565b6040516107569190614267565b60405180910390f35b34801561076b57600080fd5b5061078660048036038101906107819190613a0b565b611dde565b005b34801561079457600080fd5b5061079d611e7a565b6040516107aa91906142f0565b60405180910390f35b3480156107bf57600080fd5b506107da60048036038101906107d59190613929565b611f08565b005b3480156107e857600080fd5b506107f1612005565b005b3480156107ff57600080fd5b506108086120b2565b6040516108159190614267565b60405180910390f35b34801561082a57600080fd5b50610845600480360381019061084091906139a1565b612289565b005b34801561085357600080fd5b5061086e60048036038101906108699190613a99565b61229b565b60405161087d939291906144bf565b60405180910390f35b34801561089257600080fd5b506108ad60048036038101906108a891906138ae565b6122d5565b005b6108c960048036038101906108c49190613b8e565b61241f565b005b3480156108d757600080fd5b506108f260048036038101906108ed9190613a99565b612430565b6040516108ff91906142f0565b60405180910390f35b34801561091457600080fd5b5061091d612504565b60405161092a9190614452565b60405180910390f35b61094d60048036038101906109489190613a99565b61250a565b005b34801561095b57600080fd5b50610964612589565b60405161097191906142f0565b60405180910390f35b610994600480360381019061098f9190613c1e565b612617565b005b3480156109a257600080fd5b506109ab612628565b6040516109b891906142f0565b60405180910390f35b3480156109cd57600080fd5b506109e860048036038101906109e39190613823565b612656565b6040516109f5919061424c565b60405180910390f35b348015610a0a57600080fd5b50610a13612685565b604051610a20919061415d565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ab45750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60008054610ac8906147a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610af4906147a5565b8015610b415780601f10610b1657610100808354040283529160200191610b41565b820191906000526020600020905b815481529060010190602001808311610b2457829003601f168201915b505050505081565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610b87826126ab565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610c495750600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7f90614412565b60405180910390fd5b826004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600b8054610d47906147a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d73906147a5565b8015610dc05780601f10610d9557610100808354040283529160200191610dc0565b820191906000526020600020905b815481529060010190602001808311610da357829003601f168201915b505050505081565b60115481565b60025481565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5b90614332565b60405180910390fd5b81601181905550806012819055505050565b600860009054906101000a900460ff1681565b6000610e94826126ab565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efb90614432565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b90614372565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061100c57506004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061109d5750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6110dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d390614412565b60405180910390fd5b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506002546001836111dd91906145d0565b111580156112565750600073ffffffffffffffffffffffffffffffffffffffff166006600060018561120f91906145d0565b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b156112ba57806006600060018561126d91906145d0565b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d890614332565b60405180910390fd5b60006013805490501180156113fa575060138054905081105b611439576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143090614352565b60405180910390fd5b8060108190555050565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ca90614332565b60405180910390fd5b6000600860006101000a81548160ff021916908315150217905550565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157790614332565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156115e8573d6000803e3d6000fd5b50565b6115f6838383610e89565b60008273ffffffffffffffffffffffffffffffffffffffff163b14806116ee575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b815260040161167b939291906141c4565b602060405180830381600087803b15801561169557600080fd5b505af11580156116a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116cd9190613a70565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b61172d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611724906143b2565b60405180910390fd5b505050565b600d5481565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bf90614332565b60405180910390fd5b601380549050841115611810576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180790614352565b60405180910390fd5b601380549050841415611888576013604051806060016040528085815260200184815260200183815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000155602082015181600101556040820151816002015550506118f1565b6000601385815481106118c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600302019050838160000181905550828160010181905550818160020181905550505b50505050565b600e5481565b6014602052816000526040600020602052806000526040600020600091509150505481565b600061192d826126ab565b9050919050565b6060600a6040516020016119489190614130565b604051602081830303815290604052905090565b60105481565b60036020528060005260406000206000915090505481565b600f5481565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0790614332565b60405180910390fd5b6000600f5414611a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4c90614312565b60405180910390fd5b600c5481600254611a6691906145d0565b1115611aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9e90614312565b60405180910390fd5b600e548160036000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b1791906145d0565b1115611b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4f90614312565b60405180910390fd5b611b84600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612784565b50565b60006013805490508410611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc7906143f2565b60405180910390fd5b600060138581548110611c0c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820154815250509050611c7a83826040015186604051602001611c5f9190614098565b604051602081830303815290604052805190602001206127a2565b9150509392505050565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0b90614332565b60405180910390fd5b80600860016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7660405160405180910390a350565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60125481565b7f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb795273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e63906143d2565b60405180910390fd5b611e7682826127b9565b5050565b60018054611e87906147a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611eb3906147a5565b8015611f005780601f10611ed557610100808354040283529160200191611f00565b820191906000526020600020905b815481529060010190602001808311611ee357829003601f168201915b505050505081565b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ff9919061424c565b60405180910390a35050565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208c90614332565b60405180910390fd5b6001600860006101000a81548160ff021916908315150217905550565b6000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213b90614332565b60405180910390fd5b6000600f5414612189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218090614312565b60405180910390fd5b6011547f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016121e5919061415d565b60206040518083038186803b1580156121fd57600080fd5b505afa158015612211573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122359190613ac2565b1015612276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226d90614392565b60405180910390fd5b612284601254601154612842565b905090565b612298600060016000846129a4565b50565b601381815481106122ab57600080fd5b90600052602060002090600302016000915090508060000154908060010154908060020154905083565b6122e0848484610e89565b60008373ffffffffffffffffffffffffffffffffffffffff163b14806123da575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b81526004016123679493929190614178565b602060405180830381600087803b15801561238157600080fd5b505af1158015612395573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b99190613a70565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b612419576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612410906143b2565b60405180910390fd5b50505050565b61242c60018334846129a4565b5050565b6060600073ffffffffffffffffffffffffffffffffffffffff16612453836126ab565b73ffffffffffffffffffffffffffffffffffffffff1614156124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a1906143f2565b60405180910390fd5b600080600f5414156124bf57600090506124cb565b6124c883612db3565b90505b6124d3611934565b6124dc82613086565b6040516020016124ed9291906140df565b604051602081830303815290604052915050919050565b600c5481565b61258660028234600067ffffffffffffffff811115612552577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156125805781602001602082028036833780820191505090505b506129a4565b50565b600a8054612596906147a5565b80601f01602080910402602001604051908101604052809291908181526020018280546125c2906147a5565b801561260f5780601f106125e45761010080835404028352916020019161260f565b820191906000526020600020905b8154815290600101906020018083116125f257829003601f168201915b505050505081565b612623838334846129a4565b505050565b6060612632611934565b604051602001612642919061410e565b604051602081830303815290604052905090565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006002548211156126c0576000905061277f565b5b600082111561277a57600073ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461276c576006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061277f565b8180600190039250506126c1565b600090505b919050565b61279e828260405180602001604052806000815250613233565b5050565b6000826127af8584613245565b1490509392505050565b6000600f54146127fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f590614312565b60405180910390fd5b80600f819055507f7d69e344e8948ee2d0ae2411f140ed9d811e9281db0368d2f77a802d9d8346f5818360405161283692919061446d565b60405180910390a15050565b60007f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca73ffffffffffffffffffffffffffffffffffffffff16634000aea07f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952848660006040516020016128b6929190614282565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016128e39392919061420e565b602060405180830381600087803b1580156128fd57600080fd5b505af1158015612911573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061293591906139e2565b5060006129588460003060076000898152602001908152602001600020546132e0565b90506001600760008681526020019081526020016000205461297a91906145d0565b600760008681526020019081526020016000208190555061299b848261331c565b91505092915050565b6000601385815481106129e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905060008060001b826040015114159050600860009054906101000a900460ff168015612a4957506000601380549050115b612a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7f90614332565b60405180910390fd5b8015612ad957612a99863385611b87565b612ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acf90614332565b60405180910390fd5b5b83826000015186612aea9190614657565b14612b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2190614392565b60405180910390fd5b601054861115612b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6690614312565b60405180910390fd5b600d5485600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bbd91906145d0565b1115612bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf590614312565b60405180910390fd5b600c5485600254612c0f91906145d0565b1115612c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4790614312565b60405180910390fd5b8015612d5957846014600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cb691906145d0565b9250508190555081602001516014600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115612d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4b90614312565b60405180910390fd5b612da1565b8160200151851115612da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9790614312565b60405180910390fd5b5b612dab3386612784565b505050505050565b600080600f5490506000600c54905060008167ffffffffffffffff811115612e04577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015612e325781602001602082028036833780820191505090505b50905060005b82811015612e995780828281518110612e7a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080612e9190614808565b915050612e38565b5060005b600183612eaa91906146b1565b8110156130225760008184612ebf91906146b1565b8583604051602001612ed2929190614496565b6040516020818303038152906040528051906020012060001c612ef59190614889565b82612f0091906145d0565b9050828181518110612f3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151838381518110612f7c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151848481518110612fbd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101858481518110612ffd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018281525082815250505050808061301a90614808565b915050612e9d565b5060018160018761303391906146b1565b8151811061306a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161307c91906145d0565b9350505050919050565b606060008214156130ce576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061322e565b600082905060005b600082146131005780806130e990614808565b915050600a826130f99190614626565b91506130d6565b60008167ffffffffffffffff811115613142577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156131745781602001600182028036833780820191505090505b5090505b600085146132275760018261318d91906146b1565b9150600a8561319c9190614889565b60306131a891906145d0565b60f81b8183815181106131e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132209190614626565b9450613178565b8093505050505b919050565b613240838383600161334f565b505050565b60008082905060005b84518110156132d5576000858281518110613292577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508083116132b4576132ad838261363d565b92506132c1565b6132be818461363d565b92505b5080806132cd90614808565b91505061324e565b508091505092915050565b6000848484846040516020016132f994939291906142ab565b6040516020818303038152906040528051906020012060001c9050949350505050565b600082826040516020016133319291906140b3565b60405160208183030381529060405280519060200120905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156133bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b690614372565b60405180910390fd5b600060016002540190508360026000828254019250508190555083600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550846006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b8481101561363557818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a482156136205760008673ffffffffffffffffffffffffffffffffffffffff163b14806135e0575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168673ffffffffffffffffffffffffffffffffffffffff1663150b7a0233600086896040518563ffffffff1660e01b815260040161356d9493929190614178565b602060405180830381600087803b15801561358757600080fd5b505af115801561359b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135bf9190613a70565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b61361f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613616906143b2565b60405180910390fd5b5b8180600101925050808060010191505061347b565b505050505050565b600082600052816020526040600020905092915050565b60006136676136628461451b565b6144f6565b9050808382526020820190508285602086028201111561368657600080fd5b60005b858110156136b6578161369c8882613767565b845260208401935060208301925050600181019050613689565b5050509392505050565b60006136d36136ce84614547565b6144f6565b9050828152602081018484840111156136eb57600080fd5b6136f6848285614763565b509392505050565b60008135905061370d81614bd5565b92915050565b600082601f83011261372457600080fd5b8135613734848260208601613654565b91505092915050565b60008135905061374c81614bec565b92915050565b60008151905061376181614bec565b92915050565b60008135905061377681614c03565b92915050565b60008135905061378b81614c1a565b92915050565b6000815190506137a081614c1a565b92915050565b600082601f8301126137b757600080fd5b81356137c78482602086016136c0565b91505092915050565b6000813590506137df81614c31565b92915050565b6000815190506137f481614c31565b92915050565b60006020828403121561380c57600080fd5b600061381a848285016136fe565b91505092915050565b6000806040838503121561383657600080fd5b6000613844858286016136fe565b9250506020613855858286016136fe565b9150509250929050565b60008060006060848603121561387457600080fd5b6000613882868287016136fe565b9350506020613893868287016136fe565b92505060406138a4868287016137d0565b9150509250925092565b600080600080608085870312156138c457600080fd5b60006138d2878288016136fe565b94505060206138e3878288016136fe565b93505060406138f4878288016137d0565b925050606085013567ffffffffffffffff81111561391157600080fd5b61391d878288016137a6565b91505092959194509250565b6000806040838503121561393c57600080fd5b600061394a858286016136fe565b925050602061395b8582860161373d565b9150509250929050565b6000806040838503121561397857600080fd5b6000613986858286016136fe565b9250506020613997858286016137d0565b9150509250929050565b6000602082840312156139b357600080fd5b600082013567ffffffffffffffff8111156139cd57600080fd5b6139d984828501613713565b91505092915050565b6000602082840312156139f457600080fd5b6000613a0284828501613752565b91505092915050565b60008060408385031215613a1e57600080fd5b6000613a2c85828601613767565b9250506020613a3d858286016137d0565b9150509250929050565b600060208284031215613a5957600080fd5b6000613a678482850161377c565b91505092915050565b600060208284031215613a8257600080fd5b6000613a9084828501613791565b91505092915050565b600060208284031215613aab57600080fd5b6000613ab9848285016137d0565b91505092915050565b600060208284031215613ad457600080fd5b6000613ae2848285016137e5565b91505092915050565b60008060408385031215613afe57600080fd5b6000613b0c858286016137d0565b9250506020613b1d858286016136fe565b9150509250929050565b600080600060608486031215613b3c57600080fd5b6000613b4a868287016137d0565b9350506020613b5b868287016136fe565b925050604084013567ffffffffffffffff811115613b7857600080fd5b613b8486828701613713565b9150509250925092565b60008060408385031215613ba157600080fd5b6000613baf858286016137d0565b925050602083013567ffffffffffffffff811115613bcc57600080fd5b613bd885828601613713565b9150509250929050565b60008060408385031215613bf557600080fd5b6000613c03858286016137d0565b9250506020613c1485828601613767565b9150509250929050565b600080600060608486031215613c3357600080fd5b6000613c41868287016137d0565b9350506020613c52868287016137d0565b925050604084013567ffffffffffffffff811115613c6f57600080fd5b613c7b86828701613713565b9150509250925092565b60008060008060808587031215613c9b57600080fd5b6000613ca9878288016137d0565b9450506020613cba878288016137d0565b9350506040613ccb878288016137d0565b9250506060613cdc87828801613767565b91505092959194509250565b613cf1816146e5565b82525050565b613d08613d03826146e5565b614851565b82525050565b613d17816146f7565b82525050565b613d2681614703565b82525050565b613d3d613d3882614703565b614863565b82525050565b6000613d4e8261458d565b613d5881856145a3565b9350613d68818560208601614772565b613d7181614976565b840191505092915050565b6000613d8782614598565b613d9181856145b4565b9350613da1818560208601614772565b613daa81614976565b840191505092915050565b6000613dc082614598565b613dca81856145c5565b9350613dda818560208601614772565b80840191505092915050565b60008154613df3816147a5565b613dfd81866145c5565b94506001821660008114613e185760018114613e2957613e5c565b60ff19831686528186019350613e5c565b613e3285614578565b60005b83811015613e5457815481890152600182019150602081019050613e35565b838801955050505b50505092915050565b6000613e726003836145b4565b9150613e7d82614994565b602082019050919050565b6000613e95600d836145c5565b9150613ea0826149bd565b600d82019050919050565b6000613eb86003836145b4565b9150613ec3826149e6565b602082019050919050565b6000613edb600a836145c5565b9150613ee682614a0f565b600a82019050919050565b6000613efe6003836145b4565b9150613f0982614a38565b602082019050919050565b6000613f216011836145b4565b9150613f2c82614a61565b602082019050919050565b6000613f446007836145c5565b9150613f4f82614a8a565b600782019050919050565b6000613f676003836145b4565b9150613f7282614ab3565b602082019050919050565b6000613f8a6010836145b4565b9150613f9582614adc565b602082019050919050565b6000613fad6005836145c5565b9150613fb882614b05565b600582019050919050565b6000613fd0601f836145b4565b9150613fdb82614b2e565b602082019050919050565b6000613ff36000836145a3565b9150613ffe82614b57565b600082019050919050565b60006140166003836145b4565b915061402182614b5a565b602082019050919050565b6000614039600e836145b4565b915061404482614b83565b602082019050919050565b600061405c600a836145b4565b915061406782614bac565b602082019050919050565b61407b81614759565b82525050565b61409261408d82614759565b61487f565b82525050565b60006140a48284613cf7565b60148201915081905092915050565b60006140bf8285613d2c565b6020820191506140cf8284614081565b6020820191508190509392505050565b60006140eb8285613db5565b91506140f78284613db5565b915061410282613fa0565b91508190509392505050565b600061411a8284613db5565b915061412582613e88565b915081905092915050565b600061413b82613f37565b91506141478284613de6565b915061415282613ece565b915081905092915050565b60006020820190506141726000830184613ce8565b92915050565b600060808201905061418d6000830187613ce8565b61419a6020830186613ce8565b6141a76040830185614072565b81810360608301526141b98184613d43565b905095945050505050565b60006080820190506141d96000830186613ce8565b6141e66020830185613ce8565b6141f36040830184614072565b818103606083015261420481613fe6565b9050949350505050565b60006060820190506142236000830186613ce8565b6142306020830185614072565b81810360408301526142428184613d43565b9050949350505050565b60006020820190506142616000830184613d0e565b92915050565b600060208201905061427c6000830184613d1d565b92915050565b60006040820190506142976000830185613d1d565b6142a46020830184614072565b9392505050565b60006080820190506142c06000830187613d1d565b6142cd6020830186614072565b6142da6040830185613ce8565b6142e76060830184614072565b95945050505050565b6000602082019050818103600083015261430a8184613d7c565b905092915050565b6000602082019050818103600083015261432b81613e65565b9050919050565b6000602082019050818103600083015261434b81613eab565b9050919050565b6000602082019050818103600083015261436b81613ef1565b9050919050565b6000602082019050818103600083015261438b81613f14565b9050919050565b600060208201905081810360008301526143ab81613f5a565b9050919050565b600060208201905081810360008301526143cb81613f7d565b9050919050565b600060208201905081810360008301526143eb81613fc3565b9050919050565b6000602082019050818103600083015261440b81614009565b9050919050565b6000602082019050818103600083015261442b8161402c565b9050919050565b6000602082019050818103600083015261444b8161404f565b9050919050565b60006020820190506144676000830184614072565b92915050565b60006040820190506144826000830185614072565b61448f6020830184613d1d565b9392505050565b60006040820190506144ab6000830185614072565b6144b86020830184614072565b9392505050565b60006060820190506144d46000830186614072565b6144e16020830185614072565b6144ee6040830184613d1d565b949350505050565b6000614500614511565b905061450c82826147d7565b919050565b6000604051905090565b600067ffffffffffffffff82111561453657614535614947565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561456257614561614947565b5b61456b82614976565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006145db82614759565b91506145e683614759565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561461b5761461a6148ba565b5b828201905092915050565b600061463182614759565b915061463c83614759565b92508261464c5761464b6148e9565b5b828204905092915050565b600061466282614759565b915061466d83614759565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146a6576146a56148ba565b5b828202905092915050565b60006146bc82614759565b91506146c783614759565b9250828210156146da576146d96148ba565b5b828203905092915050565b60006146f082614739565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614790578082015181840152602081019050614775565b8381111561479f576000848401525b50505050565b600060028204905060018216806147bd57607f821691505b602082108114156147d1576147d0614918565b5b50919050565b6147e082614976565b810181811067ffffffffffffffff821117156147ff576147fe614947565b5b80604052505050565b600061481382614759565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614846576148456148ba565b5b600182019050919050565b600061485c8261486d565b9050919050565b6000819050919050565b600061487882614987565b9050919050565b6000819050919050565b600061489482614759565b915061489f83614759565b9250826148af576148ae6148e9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f3430330000000000000000000000000000000000000000000000000000000000600082015250565b7f636f6e74726163742e6a736f6e00000000000000000000000000000000000000600082015250565b7f3430310000000000000000000000000000000000000000000000000000000000600082015250565b7f2f6d657461646174612f00000000000000000000000000000000000000000000600082015250565b7f3432320000000000000000000000000000000000000000000000000000000000600082015250565b7f494e56414c49445f524543495049454e54000000000000000000000000000000600082015250565b7f697066733a2f2f00000000000000000000000000000000000000000000000000600082015250565b7f3430320000000000000000000000000000000000000000000000000000000000600082015250565b7f554e534146455f524543495049454e5400000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c00600082015250565b50565b7f3430340000000000000000000000000000000000000000000000000000000000600082015250565b7f4e4f545f415554484f52495a4544000000000000000000000000000000000000600082015250565b7f57524f4e475f46524f4d00000000000000000000000000000000000000000000600082015250565b614bde816146e5565b8114614be957600080fd5b50565b614bf5816146f7565b8114614c0057600080fd5b50565b614c0c81614703565b8114614c1757600080fd5b50565b614c238161470d565b8114614c2e57600080fd5b50565b614c3a81614759565b8114614c4557600080fd5b5056fea264697066735822122033f5b2e2c305daab558a54fe73ecc6627545d3b396b6309d3c6ccd37815aaeaf64736f6c63430008040033

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

000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca

-----Decoded View---------------
Arg [0] : vrfCoordinator (address): 0xf0d54349aDdcf704F77AE15b96510dEA15cb7952
Arg [1] : linkToken (address): 0x514910771AF9Ca656af840dff83E8264EcF986CA

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952
Arg [1] : 000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.