ETH Price: $2,574.68 (+0.78%)

Token

BoredApepurged (PURGE)
 

Overview

Max Total Supply

6,957 PURGE

Holders

558

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 PURGE
0xe1279b8a2bb4e7fc2cd8074ef6e019b7f9f25341
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:
BoredApePurged

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 7: boredapepurged.sol
//Bored Ape Purged
//All links to racism and or other forms of hate have been removed from the collection.


// SPDX-License-Identifier: None

pragma solidity ^0.8.4;

import "./ERC721A.sol";
import "./Ownable.sol";
import "./ERC721AQueryable.sol";
import "./Context.sol";

contract BoredApePurged is ERC721A, ERC721AQueryable, Ownable {
  uint256 public EXTRA_MINT_PRICE = 0 ether;
  uint256 public MAX_SUPPLY_PLUS_ONE  = 8387;
  uint256 public MAX_FREE_SUPPLY = 0;
  uint256 public constant MAX_PER_TRANSACTION_PLUS_ONE = 6;


  string tokenBaseUri = "ipfs:QmXmBUkDF1tHF8mfbWKS6DxMyW25aLmERAo2pRyZ96pLoM/";

  bool public paused = true;

  address public immutable proxyRegistryAddress;

  mapping(address => uint256) private _freeMintedCount;

  constructor(address _proxyRegistryAddress) ERC721A("BoredApepurged", "PURGE") {
    proxyRegistryAddress = _proxyRegistryAddress;
  }

  function FREEmint(uint256 _quantity) external payable {
    require(!paused, "Minting is Paused");

    uint256 _totalSupply = totalSupply();

    require(_totalSupply + _quantity < MAX_SUPPLY_PLUS_ONE, "Exceeds Supply");
    require(_quantity < MAX_PER_TRANSACTION_PLUS_ONE, "Exceed Max Supply");

    // Free Mints
    uint256 payForCount = _quantity;
    uint256 freeMintCount = _freeMintedCount[msg.sender];

    if (freeMintCount < MAX_FREE_SUPPLY) {
      if (_quantity > MAX_FREE_SUPPLY) {
        payForCount = _quantity - MAX_FREE_SUPPLY;
      } else {
        payForCount = 0;
      }

      _freeMintedCount[msg.sender] = MAX_FREE_SUPPLY;
    }



    require(msg.value >= payForCount * EXTRA_MINT_PRICE, "Ether amount sent wrong");

    _mint(msg.sender, _quantity);
  }

  function freeMintedCount(address owner) external view returns (uint256) {
    return _freeMintedCount[owner];
  }

  function _startTokenId() internal pure override returns (uint256) {
    return 0;
  }

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

  function configMaxFreePrice(uint256 newPrice) public onlyOwner {
        MAX_FREE_SUPPLY = newPrice;
    }


 function configActualPrice(uint256 newnewPrice) public onlyOwner {
        EXTRA_MINT_PRICE = newnewPrice;
    }

    function configtotalsupply(uint256 newsupply) public onlyOwner {
        MAX_SUPPLY_PLUS_ONE = newsupply;
    }
    
  function isApprovedForAll(address owner, address operator)
    public
    view
   override(ERC721A, IERC721A)
    returns (bool)
  {
    OpenSeaProxyRegistry proxyRegistry = OpenSeaProxyRegistry(
      proxyRegistryAddress
    );

    if (address(proxyRegistry.proxies(owner)) == operator) {
      return true;
    }

    return super.isApprovedForAll(owner, operator);
  }

  function setBaseURI(string calldata _newBaseUri) external onlyOwner {
    tokenBaseUri = _newBaseUri;
  }

  function flipSale() external onlyOwner {
    paused = !paused;
  }

function collectReserves(address[] calldata addresses, uint256 quantity)
    external
    onlyOwner
  {
    uint256 _totalSupply = totalSupply();

    require(
      _totalSupply + quantity * addresses.length <= MAX_SUPPLY_PLUS_ONE,
      "Exceeds max supply"
    );

    for (uint256 i = 0; i < addresses.length; i++) {
      _mint(addresses[i], quantity);
    }
  }

  function withdraw() external onlyOwner {
    require(
      payable(owner()).send(address(this).balance),
      "Withdraw Unsuccessful"
    );
  }
}


contract OwnableDelegateProxy {}

contract OpenSeaProxyRegistry {
  mapping(address => OwnableDelegateProxy) public proxies;
}

File 2 of 7: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 3 of 7: ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 4 of 7: ERC721AQueryable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721AQueryable.sol';
import './ERC721A.sol';

/**
 * @title ERC721A Queryable
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) public view override returns (TokenOwnership memory) {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
            return ownership;
        }
        ownership = _ownershipAt(tokenId);
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view override returns (TokenOwnership[] memory) {
        unchecked {
            uint256 tokenIdsLength = tokenIds.length;
            TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
            for (uint256 i; i != tokenIdsLength; ++i) {
                ownerships[i] = explicitOwnershipOf(tokenIds[i]);
            }
            return ownerships;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view override returns (uint256[] memory) {
        unchecked {
            if (start >= stop) revert InvalidQueryRange();
            uint256 tokenIdsIdx;
            uint256 stopLimit = _nextTokenId();
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            // Set `stop = min(stop, stopLimit)`.
            if (stop > stopLimit) {
                stop = stopLimit;
            }
            uint256 tokenIdsMaxLength = balanceOf(owner);
            // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
            // to cater for cases where `balanceOf(owner)` is too big.
            if (start < stop) {
                uint256 rangeLength = stop - start;
                if (rangeLength < tokenIdsMaxLength) {
                    tokenIdsMaxLength = rangeLength;
                }
            } else {
                tokenIdsMaxLength = 0;
            }
            uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
            if (tokenIdsMaxLength == 0) {
                return tokenIds;
            }
            // We need to call `explicitOwnershipOf(start)`,
            // because the slot at `start` may not be initialized.
            TokenOwnership memory ownership = explicitOwnershipOf(start);
            address currOwnershipAddr;
            // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
            // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
            if (!ownership.burned) {
                currOwnershipAddr = ownership.addr;
            }
            for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            // Downsize the array to fit.
            assembly {
                mstore(tokenIds, tokenIdsIdx)
            }
            return tokenIds;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view override returns (uint256[] memory) {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }
}

File 5 of 7: IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 6 of 7: IERC721AQueryable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';

/**
 * @dev Interface of an ERC721AQueryable compliant contract.
 */
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}

File 7 of 7: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"EXTRA_MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"FREEmint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"MAX_FREE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_TRANSACTION_PLUS_ONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_PLUS_ONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"collectReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newnewPrice","type":"uint256"}],"name":"configActualPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"configMaxFreePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newsupply","type":"uint256"}],"name":"configtotalsupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"freeMintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a060405260006009556120c3600a556000600b55604051806060016040528060348152602001620045c660349139600c90816200003e9190620004dd565b506001600d60006101000a81548160ff0219169083151502179055503480156200006757600080fd5b50604051620045fa380380620045fa83398181016040528101906200008d91906200062e565b6040518060400160405280600e81526020017f426f7265644170657075726765640000000000000000000000000000000000008152506040518060400160405280600581526020017f505552474500000000000000000000000000000000000000000000000000000081525081600290816200010a9190620004dd565b5080600390816200011c9190620004dd565b506200012d6200019060201b60201c565b600081905550505062000155620001496200019560201b60201c565b6200019d60201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505062000660565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002e557607f821691505b602082108103620002fb57620002fa6200029d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003657fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000326565b62000371868362000326565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003be620003b8620003b28462000389565b62000393565b62000389565b9050919050565b6000819050919050565b620003da836200039d565b620003f2620003e982620003c5565b84845462000333565b825550505050565b600090565b62000409620003fa565b62000416818484620003cf565b505050565b5b818110156200043e5762000432600082620003ff565b6001810190506200041c565b5050565b601f8211156200048d57620004578162000301565b620004628462000316565b8101602085101562000472578190505b6200048a620004818562000316565b8301826200041b565b50505b505050565b600082821c905092915050565b6000620004b26000198460080262000492565b1980831691505092915050565b6000620004cd83836200049f565b9150826002028217905092915050565b620004e88262000263565b67ffffffffffffffff8111156200050457620005036200026e565b5b620005108254620002cc565b6200051d82828562000442565b600060209050601f83116001811462000555576000841562000540578287015190505b6200054c8582620004bf565b865550620005bc565b601f198416620005658662000301565b60005b828110156200058f5784890151825560018201915060208501945060208101905062000568565b86831015620005af5784890151620005ab601f8916826200049f565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005f682620005c9565b9050919050565b6200060881620005e9565b81146200061457600080fd5b50565b6000815190506200062881620005fd565b92915050565b600060208284031215620006475762000646620005c4565b5b6000620006578482850162000617565b91505092915050565b608051613f436200068360003960008181611c210152611c480152613f436000f3fe60806040526004361061020f5760003560e01c80637ba5e6211161011857806399a2557a116100a0578063c87b56dd1161006f578063c87b56dd1461078e578063cd7c0326146107cb578063e985e9c5146107f6578063f2b7813214610833578063f2fde38b1461085c5761020f565b806399a2557a146106c2578063a22cb465146106ff578063b88d4fde14610728578063c23dc68f146107515761020f565b80638da5cb5b116100e75780638da5cb5b146105db578063909c0c201461060657806395d89b411461062f57806396b04c751461065a57806398133235146106855761020f565b80637ba5e62114610533578063809083931461054a57806382d5b249146105735780638462151c1461059e5761020f565b80633ccfd60b1161019b5780635c975abb1161016a5780635c975abb1461044c5780636352211e146104775780636b1ec2e4146104b457806370a08231146104df578063715018a61461051c5761020f565b80633ccfd60b146103a657806342842e0e146103bd57806355f804b3146103e65780635bbb21771461040f5761020f565b8063081812fc116101e2578063081812fc146102c3578063095ea7b31461030057806318160ddd1461032957806323b872dd1461035457806333f15a1f1461037d5761020f565b806301ffc9a71461021457806302ddb65b14610251578063039618d61461027c57806306fdde0314610298575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612abe565b610885565b6040516102489190612b06565b60405180910390f35b34801561025d57600080fd5b50610266610917565b6040516102739190612b3a565b60405180910390f35b61029660048036038101906102919190612b81565b61091d565b005b3480156102a457600080fd5b506102ad610b29565b6040516102ba9190612c47565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e59190612b81565b610bbb565b6040516102f79190612caa565b60405180910390f35b34801561030c57600080fd5b5061032760048036038101906103229190612cf1565b610c37565b005b34801561033557600080fd5b5061033e610ddd565b60405161034b9190612b3a565b60405180910390f35b34801561036057600080fd5b5061037b60048036038101906103769190612d31565b610df4565b005b34801561038957600080fd5b506103a4600480360381019061039f9190612de9565b610e04565b005b3480156103b257600080fd5b506103bb610f43565b005b3480156103c957600080fd5b506103e460048036038101906103df9190612d31565b61103c565b005b3480156103f257600080fd5b5061040d60048036038101906104089190612e9f565b61105c565b005b34801561041b57600080fd5b506104366004803603810190610431919061302a565b6110ee565b60405161044391906131a5565b60405180910390f35b34801561045857600080fd5b506104616111af565b60405161046e9190612b06565b60405180910390f35b34801561048357600080fd5b5061049e60048036038101906104999190612b81565b6111c2565b6040516104ab9190612caa565b60405180910390f35b3480156104c057600080fd5b506104c96111d4565b6040516104d69190612b3a565b60405180910390f35b3480156104eb57600080fd5b50610506600480360381019061050191906131c7565b6111d9565b6040516105139190612b3a565b60405180910390f35b34801561052857600080fd5b50610531611291565b005b34801561053f57600080fd5b50610548611319565b005b34801561055657600080fd5b50610571600480360381019061056c9190612b81565b6113c1565b005b34801561057f57600080fd5b50610588611447565b6040516105959190612b3a565b60405180910390f35b3480156105aa57600080fd5b506105c560048036038101906105c091906131c7565b61144d565b6040516105d291906132b2565b60405180910390f35b3480156105e757600080fd5b506105f0611590565b6040516105fd9190612caa565b60405180910390f35b34801561061257600080fd5b5061062d60048036038101906106289190612b81565b6115ba565b005b34801561063b57600080fd5b50610644611640565b6040516106519190612c47565b60405180910390f35b34801561066657600080fd5b5061066f6116d2565b60405161067c9190612b3a565b60405180910390f35b34801561069157600080fd5b506106ac60048036038101906106a791906131c7565b6116d8565b6040516106b99190612b3a565b60405180910390f35b3480156106ce57600080fd5b506106e960048036038101906106e491906132d4565b611721565b6040516106f691906132b2565b60405180910390f35b34801561070b57600080fd5b5061072660048036038101906107219190613353565b61192d565b005b34801561073457600080fd5b5061074f600480360381019061074a9190613448565b611aa4565b005b34801561075d57600080fd5b5061077860048036038101906107739190612b81565b611b17565b604051610785919061350d565b60405180910390f35b34801561079a57600080fd5b506107b560048036038101906107b09190612b81565b611b81565b6040516107c29190612c47565b60405180910390f35b3480156107d757600080fd5b506107e0611c1f565b6040516107ed9190612caa565b60405180910390f35b34801561080257600080fd5b5061081d60048036038101906108189190613528565b611c43565b60405161082a9190612b06565b60405180910390f35b34801561083f57600080fd5b5061085a60048036038101906108559190612b81565b611d33565b005b34801561086857600080fd5b50610883600480360381019061087e91906131c7565b611db9565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108e057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109105750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600b5481565b600d60009054906101000a900460ff161561096d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610964906135b4565b60405180910390fd5b6000610977610ddd565b9050600a5482826109889190613603565b106109c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bf906136a5565b60405180910390fd5b60068210610a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0290613711565b60405180910390fd5b60008290506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600b54811015610ac957600b54841115610a7d57600b5484610a769190613731565b9150610a82565b600091505b600b54600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60095482610ad79190613765565b341015610b19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b109061380b565b60405180910390fd5b610b233385611eb0565b50505050565b606060028054610b389061385a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b649061385a565b8015610bb15780601f10610b8657610100808354040283529160200191610bb1565b820191906000526020600020905b815481529060010190602001808311610b9457829003601f168201915b5050505050905090565b6000610bc682612082565b610bfc576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c42826120e1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ca9576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cc86121ad565b73ffffffffffffffffffffffffffffffffffffffff1614610d2b57610cf481610cef6121ad565b611c43565b610d2a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610de76121b5565b6001546000540303905090565b610dff8383836121ba565b505050565b610e0c612561565b73ffffffffffffffffffffffffffffffffffffffff16610e2a611590565b73ffffffffffffffffffffffffffffffffffffffff1614610e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e77906138d7565b60405180910390fd5b6000610e8a610ddd565b9050600a548484905083610e9e9190613765565b82610ea99190613603565b1115610eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee190613943565b60405180910390fd5b60005b84849050811015610f3c57610f29858583818110610f0e57610f0d613963565b5b9050602002016020810190610f2391906131c7565b84611eb0565b8080610f3490613992565b915050610eed565b5050505050565b610f4b612561565b73ffffffffffffffffffffffffffffffffffffffff16610f69611590565b73ffffffffffffffffffffffffffffffffffffffff1614610fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb6906138d7565b60405180910390fd5b610fc7611590565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061103a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103190613a26565b60405180910390fd5b565b61105783838360405180602001604052806000815250611aa4565b505050565b611064612561565b73ffffffffffffffffffffffffffffffffffffffff16611082611590565b73ffffffffffffffffffffffffffffffffffffffff16146110d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cf906138d7565b60405180910390fd5b8181600c91826110e9929190613bfd565b505050565b606060008251905060008167ffffffffffffffff81111561111257611111612eec565b5b60405190808252806020026020018201604052801561114b57816020015b611138612a0f565b8152602001906001900390816111305790505b50905060005b8281146111a45761117b85828151811061116e5761116d613963565b5b6020026020010151611b17565b82828151811061118e5761118d613963565b5b6020026020010181905250806001019050611151565b508092505050919050565b600d60009054906101000a900460ff1681565b60006111cd826120e1565b9050919050565b600681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611240576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611299612561565b73ffffffffffffffffffffffffffffffffffffffff166112b7611590565b73ffffffffffffffffffffffffffffffffffffffff161461130d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611304906138d7565b60405180910390fd5b6113176000612569565b565b611321612561565b73ffffffffffffffffffffffffffffffffffffffff1661133f611590565b73ffffffffffffffffffffffffffffffffffffffff1614611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c906138d7565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6113c9612561565b73ffffffffffffffffffffffffffffffffffffffff166113e7611590565b73ffffffffffffffffffffffffffffffffffffffff161461143d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611434906138d7565b60405180910390fd5b80600a8190555050565b600a5481565b6060600080600061145d856111d9565b905060008167ffffffffffffffff81111561147b5761147a612eec565b5b6040519080825280602002602001820160405280156114a95781602001602082028036833780820191505090505b5090506114b4612a0f565b60006114be6121b5565b90505b838614611582576114d18161262f565b9150816040015161157757600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461151c57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611576578083878060010198508151811061156957611568613963565b5b6020026020010181815250505b5b8060010190506114c1565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6115c2612561565b73ffffffffffffffffffffffffffffffffffffffff166115e0611590565b73ffffffffffffffffffffffffffffffffffffffff1614611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d906138d7565b60405180910390fd5b80600b8190555050565b60606003805461164f9061385a565b80601f016020809104026020016040519081016040528092919081815260200182805461167b9061385a565b80156116c85780601f1061169d576101008083540402835291602001916116c8565b820191906000526020600020905b8154815290600101906020018083116116ab57829003601f168201915b5050505050905090565b60095481565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606081831061175c576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061176761265a565b90506117716121b5565b851015611783576117806121b5565b94505b8084111561178f578093505b600061179a876111d9565b9050848610156117bd5760008686039050818110156117b7578091505b506117c2565b600090505b60008167ffffffffffffffff8111156117de576117dd612eec565b5b60405190808252806020026020018201604052801561180c5781602001602082028036833780820191505090505b509050600082036118235780945050505050611926565b600061182e88611b17565b90506000816040015161184357816000015190505b60008990505b8881141580156118595750848714155b15611918576118678161262f565b9250826040015161190d57600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146118b257826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361190c57808488806001019950815181106118ff576118fe613963565b5b6020026020010181815250505b5b806001019050611849565b508583528296505050505050505b9392505050565b6119356121ad565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611999576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006119a66121ad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a536121ad565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a989190612b06565b60405180910390a35050565b611aaf8484846121ba565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611b1157611ada84848484612663565b611b10576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611b1f612a0f565b611b27612a0f565b611b2f6121b5565b831080611b435750611b3f61265a565b8310155b15611b515780915050611b7c565b611b5a8361262f565b9050806040015115611b6f5780915050611b7c565b611b78836127b3565b9150505b919050565b6060611b8c82612082565b611bc2576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611bcc6127d3565b90506000815103611bec5760405180602001604052806000815250611c17565b80611bf684612865565b604051602001611c07929190613d09565b6040516020818303038152906040525b915050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000807f000000000000000000000000000000000000000000000000000000000000000090508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401611cb99190612caa565b602060405180830381865afa158015611cd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cfa9190613d6b565b73ffffffffffffffffffffffffffffffffffffffff1603611d1f576001915050611d2d565b611d2984846128bf565b9150505b92915050565b611d3b612561565b73ffffffffffffffffffffffffffffffffffffffff16611d59611590565b73ffffffffffffffffffffffffffffffffffffffff1614611daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da6906138d7565b60405180910390fd5b8060098190555050565b611dc1612561565b73ffffffffffffffffffffffffffffffffffffffff16611ddf611590565b73ffffffffffffffffffffffffffffffffffffffff1614611e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2c906138d7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ea4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9b90613e0a565b60405180910390fd5b611ead81612569565b50565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f1c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203611f56576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f636000848385612953565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1611fc860018414612959565b901b60a042901b611fd885612963565b171760046000838152602001908152602001600020819055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210611ffe5781600081905550505061207d600084838561296d565b505050565b60008161208d6121b5565b1115801561209c575060005482105b80156120da575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806120f06121b5565b11612176576000548110156121755760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612173575b6000810361216957600460008360019003935083815260200190815260200160002054905061213f565b80925050506121a8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b60006121c5826120e1565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461222c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661224d6121ad565b73ffffffffffffffffffffffffffffffffffffffff16148061227c575061227b856122766121ad565b611c43565b5b806122c1575061228a6121ad565b73ffffffffffffffffffffffffffffffffffffffff166122a984610bbb565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806122fa576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612360576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61236d8585856001612953565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61246a86612963565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316036124f257600060018401905060006004600083815260200190815260200160002054036124f05760005481146124ef578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461255a858585600161296d565b5050505050565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612637612a0f565b6126536004600084815260200190815260200160002054612973565b9050919050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126896121ad565b8786866040518563ffffffff1660e01b81526004016126ab9493929190613e7f565b6020604051808303816000875af19250505080156126e757506040513d601f19601f820116820180604052508101906126e49190613ee0565b60015b612760573d8060008114612717576040519150601f19603f3d011682016040523d82523d6000602084013e61271c565b606091505b506000815103612758576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6127bb612a0f565b6127cc6127c7836120e1565b612973565b9050919050565b6060600c80546127e29061385a565b80601f016020809104026020016040519081016040528092919081815260200182805461280e9061385a565b801561285b5780601f106128305761010080835404028352916020019161285b565b820191906000526020600020905b81548152906001019060200180831161283e57829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156128ab57600183039250600a81066030018353600a8104905061288b565b508181036020830392508083525050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b50505050565b6000819050919050565b6000819050919050565b50505050565b61297b612a0f565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c010000000000000000000000000000000000000000000000000000000083161415816040019015159081151581525050919050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a9b81612a66565b8114612aa657600080fd5b50565b600081359050612ab881612a92565b92915050565b600060208284031215612ad457612ad3612a5c565b5b6000612ae284828501612aa9565b91505092915050565b60008115159050919050565b612b0081612aeb565b82525050565b6000602082019050612b1b6000830184612af7565b92915050565b6000819050919050565b612b3481612b21565b82525050565b6000602082019050612b4f6000830184612b2b565b92915050565b612b5e81612b21565b8114612b6957600080fd5b50565b600081359050612b7b81612b55565b92915050565b600060208284031215612b9757612b96612a5c565b5b6000612ba584828501612b6c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612be8578082015181840152602081019050612bcd565b83811115612bf7576000848401525b50505050565b6000601f19601f8301169050919050565b6000612c1982612bae565b612c238185612bb9565b9350612c33818560208601612bca565b612c3c81612bfd565b840191505092915050565b60006020820190508181036000830152612c618184612c0e565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612c9482612c69565b9050919050565b612ca481612c89565b82525050565b6000602082019050612cbf6000830184612c9b565b92915050565b612cce81612c89565b8114612cd957600080fd5b50565b600081359050612ceb81612cc5565b92915050565b60008060408385031215612d0857612d07612a5c565b5b6000612d1685828601612cdc565b9250506020612d2785828601612b6c565b9150509250929050565b600080600060608486031215612d4a57612d49612a5c565b5b6000612d5886828701612cdc565b9350506020612d6986828701612cdc565b9250506040612d7a86828701612b6c565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112612da957612da8612d84565b5b8235905067ffffffffffffffff811115612dc657612dc5612d89565b5b602083019150836020820283011115612de257612de1612d8e565b5b9250929050565b600080600060408486031215612e0257612e01612a5c565b5b600084013567ffffffffffffffff811115612e2057612e1f612a61565b5b612e2c86828701612d93565b93509350506020612e3f86828701612b6c565b9150509250925092565b60008083601f840112612e5f57612e5e612d84565b5b8235905067ffffffffffffffff811115612e7c57612e7b612d89565b5b602083019150836001820283011115612e9857612e97612d8e565b5b9250929050565b60008060208385031215612eb657612eb5612a5c565b5b600083013567ffffffffffffffff811115612ed457612ed3612a61565b5b612ee085828601612e49565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f2482612bfd565b810181811067ffffffffffffffff82111715612f4357612f42612eec565b5b80604052505050565b6000612f56612a52565b9050612f628282612f1b565b919050565b600067ffffffffffffffff821115612f8257612f81612eec565b5b602082029050602081019050919050565b6000612fa6612fa184612f67565b612f4c565b90508083825260208201905060208402830185811115612fc957612fc8612d8e565b5b835b81811015612ff25780612fde8882612b6c565b845260208401935050602081019050612fcb565b5050509392505050565b600082601f83011261301157613010612d84565b5b8135613021848260208601612f93565b91505092915050565b6000602082840312156130405761303f612a5c565b5b600082013567ffffffffffffffff81111561305e5761305d612a61565b5b61306a84828501612ffc565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6130a881612c89565b82525050565b600067ffffffffffffffff82169050919050565b6130cb816130ae565b82525050565b6130da81612aeb565b82525050565b6060820160008201516130f6600085018261309f565b50602082015161310960208501826130c2565b50604082015161311c60408501826130d1565b50505050565b600061312e83836130e0565b60608301905092915050565b6000602082019050919050565b600061315282613073565b61315c818561307e565b93506131678361308f565b8060005b8381101561319857815161317f8882613122565b975061318a8361313a565b92505060018101905061316b565b5085935050505092915050565b600060208201905081810360008301526131bf8184613147565b905092915050565b6000602082840312156131dd576131dc612a5c565b5b60006131eb84828501612cdc565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61322981612b21565b82525050565b600061323b8383613220565b60208301905092915050565b6000602082019050919050565b600061325f826131f4565b61326981856131ff565b935061327483613210565b8060005b838110156132a557815161328c888261322f565b975061329783613247565b925050600181019050613278565b5085935050505092915050565b600060208201905081810360008301526132cc8184613254565b905092915050565b6000806000606084860312156132ed576132ec612a5c565b5b60006132fb86828701612cdc565b935050602061330c86828701612b6c565b925050604061331d86828701612b6c565b9150509250925092565b61333081612aeb565b811461333b57600080fd5b50565b60008135905061334d81613327565b92915050565b6000806040838503121561336a57613369612a5c565b5b600061337885828601612cdc565b92505060206133898582860161333e565b9150509250929050565b600080fd5b600067ffffffffffffffff8211156133b3576133b2612eec565b5b6133bc82612bfd565b9050602081019050919050565b82818337600083830152505050565b60006133eb6133e684613398565b612f4c565b90508281526020810184848401111561340757613406613393565b5b6134128482856133c9565b509392505050565b600082601f83011261342f5761342e612d84565b5b813561343f8482602086016133d8565b91505092915050565b6000806000806080858703121561346257613461612a5c565b5b600061347087828801612cdc565b945050602061348187828801612cdc565b935050604061349287828801612b6c565b925050606085013567ffffffffffffffff8111156134b3576134b2612a61565b5b6134bf8782880161341a565b91505092959194509250565b6060820160008201516134e1600085018261309f565b5060208201516134f460208501826130c2565b50604082015161350760408501826130d1565b50505050565b600060608201905061352260008301846134cb565b92915050565b6000806040838503121561353f5761353e612a5c565b5b600061354d85828601612cdc565b925050602061355e85828601612cdc565b9150509250929050565b7f4d696e74696e6720697320506175736564000000000000000000000000000000600082015250565b600061359e601183612bb9565b91506135a982613568565b602082019050919050565b600060208201905081810360008301526135cd81613591565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061360e82612b21565b915061361983612b21565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561364e5761364d6135d4565b5b828201905092915050565b7f4578636565647320537570706c79000000000000000000000000000000000000600082015250565b600061368f600e83612bb9565b915061369a82613659565b602082019050919050565b600060208201905081810360008301526136be81613682565b9050919050565b7f457863656564204d617820537570706c79000000000000000000000000000000600082015250565b60006136fb601183612bb9565b9150613706826136c5565b602082019050919050565b6000602082019050818103600083015261372a816136ee565b9050919050565b600061373c82612b21565b915061374783612b21565b92508282101561375a576137596135d4565b5b828203905092915050565b600061377082612b21565b915061377b83612b21565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156137b4576137b36135d4565b5b828202905092915050565b7f457468657220616d6f756e742073656e742077726f6e67000000000000000000600082015250565b60006137f5601783612bb9565b9150613800826137bf565b602082019050919050565b60006020820190508181036000830152613824816137e8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061387257607f821691505b6020821081036138855761388461382b565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006138c1602083612bb9565b91506138cc8261388b565b602082019050919050565b600060208201905081810360008301526138f0816138b4565b9050919050565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b600061392d601283612bb9565b9150613938826138f7565b602082019050919050565b6000602082019050818103600083015261395c81613920565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061399d82612b21565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036139cf576139ce6135d4565b5b600182019050919050565b7f576974686472617720556e7375636365737366756c0000000000000000000000600082015250565b6000613a10601583612bb9565b9150613a1b826139da565b602082019050919050565b60006020820190508181036000830152613a3f81613a03565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613ab37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613a76565b613abd8683613a76565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613afa613af5613af084612b21565b613ad5565b612b21565b9050919050565b6000819050919050565b613b1483613adf565b613b28613b2082613b01565b848454613a83565b825550505050565b600090565b613b3d613b30565b613b48818484613b0b565b505050565b5b81811015613b6c57613b61600082613b35565b600181019050613b4e565b5050565b601f821115613bb157613b8281613a51565b613b8b84613a66565b81016020851015613b9a578190505b613bae613ba685613a66565b830182613b4d565b50505b505050565b600082821c905092915050565b6000613bd460001984600802613bb6565b1980831691505092915050565b6000613bed8383613bc3565b9150826002028217905092915050565b613c078383613a46565b67ffffffffffffffff811115613c2057613c1f612eec565b5b613c2a825461385a565b613c35828285613b70565b6000601f831160018114613c645760008415613c52578287013590505b613c5c8582613be1565b865550613cc4565b601f198416613c7286613a51565b60005b82811015613c9a57848901358255600182019150602085019450602081019050613c75565b86831015613cb75784890135613cb3601f891682613bc3565b8355505b6001600288020188555050505b50505050505050565b600081905092915050565b6000613ce382612bae565b613ced8185613ccd565b9350613cfd818560208601612bca565b80840191505092915050565b6000613d158285613cd8565b9150613d218284613cd8565b91508190509392505050565b6000613d3882612c89565b9050919050565b613d4881613d2d565b8114613d5357600080fd5b50565b600081519050613d6581613d3f565b92915050565b600060208284031215613d8157613d80612a5c565b5b6000613d8f84828501613d56565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613df4602683612bb9565b9150613dff82613d98565b604082019050919050565b60006020820190508181036000830152613e2381613de7565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613e5182613e2a565b613e5b8185613e35565b9350613e6b818560208601612bca565b613e7481612bfd565b840191505092915050565b6000608082019050613e946000830187612c9b565b613ea16020830186612c9b565b613eae6040830185612b2b565b8181036060830152613ec08184613e46565b905095945050505050565b600081519050613eda81612a92565b92915050565b600060208284031215613ef657613ef5612a5c565b5b6000613f0484828501613ecb565b9150509291505056fea264697066735822122012e4f6f52ff41829cd2353bf4bcf77263b591811dbd1b13dffd613299122e12564736f6c634300080f0033697066733a516d586d42556b444631744846386d6662574b533644784d79573235614c6d4552416f327052795a3936704c6f4d2f000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1

Deployed Bytecode

0x60806040526004361061020f5760003560e01c80637ba5e6211161011857806399a2557a116100a0578063c87b56dd1161006f578063c87b56dd1461078e578063cd7c0326146107cb578063e985e9c5146107f6578063f2b7813214610833578063f2fde38b1461085c5761020f565b806399a2557a146106c2578063a22cb465146106ff578063b88d4fde14610728578063c23dc68f146107515761020f565b80638da5cb5b116100e75780638da5cb5b146105db578063909c0c201461060657806395d89b411461062f57806396b04c751461065a57806398133235146106855761020f565b80637ba5e62114610533578063809083931461054a57806382d5b249146105735780638462151c1461059e5761020f565b80633ccfd60b1161019b5780635c975abb1161016a5780635c975abb1461044c5780636352211e146104775780636b1ec2e4146104b457806370a08231146104df578063715018a61461051c5761020f565b80633ccfd60b146103a657806342842e0e146103bd57806355f804b3146103e65780635bbb21771461040f5761020f565b8063081812fc116101e2578063081812fc146102c3578063095ea7b31461030057806318160ddd1461032957806323b872dd1461035457806333f15a1f1461037d5761020f565b806301ffc9a71461021457806302ddb65b14610251578063039618d61461027c57806306fdde0314610298575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612abe565b610885565b6040516102489190612b06565b60405180910390f35b34801561025d57600080fd5b50610266610917565b6040516102739190612b3a565b60405180910390f35b61029660048036038101906102919190612b81565b61091d565b005b3480156102a457600080fd5b506102ad610b29565b6040516102ba9190612c47565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e59190612b81565b610bbb565b6040516102f79190612caa565b60405180910390f35b34801561030c57600080fd5b5061032760048036038101906103229190612cf1565b610c37565b005b34801561033557600080fd5b5061033e610ddd565b60405161034b9190612b3a565b60405180910390f35b34801561036057600080fd5b5061037b60048036038101906103769190612d31565b610df4565b005b34801561038957600080fd5b506103a4600480360381019061039f9190612de9565b610e04565b005b3480156103b257600080fd5b506103bb610f43565b005b3480156103c957600080fd5b506103e460048036038101906103df9190612d31565b61103c565b005b3480156103f257600080fd5b5061040d60048036038101906104089190612e9f565b61105c565b005b34801561041b57600080fd5b506104366004803603810190610431919061302a565b6110ee565b60405161044391906131a5565b60405180910390f35b34801561045857600080fd5b506104616111af565b60405161046e9190612b06565b60405180910390f35b34801561048357600080fd5b5061049e60048036038101906104999190612b81565b6111c2565b6040516104ab9190612caa565b60405180910390f35b3480156104c057600080fd5b506104c96111d4565b6040516104d69190612b3a565b60405180910390f35b3480156104eb57600080fd5b50610506600480360381019061050191906131c7565b6111d9565b6040516105139190612b3a565b60405180910390f35b34801561052857600080fd5b50610531611291565b005b34801561053f57600080fd5b50610548611319565b005b34801561055657600080fd5b50610571600480360381019061056c9190612b81565b6113c1565b005b34801561057f57600080fd5b50610588611447565b6040516105959190612b3a565b60405180910390f35b3480156105aa57600080fd5b506105c560048036038101906105c091906131c7565b61144d565b6040516105d291906132b2565b60405180910390f35b3480156105e757600080fd5b506105f0611590565b6040516105fd9190612caa565b60405180910390f35b34801561061257600080fd5b5061062d60048036038101906106289190612b81565b6115ba565b005b34801561063b57600080fd5b50610644611640565b6040516106519190612c47565b60405180910390f35b34801561066657600080fd5b5061066f6116d2565b60405161067c9190612b3a565b60405180910390f35b34801561069157600080fd5b506106ac60048036038101906106a791906131c7565b6116d8565b6040516106b99190612b3a565b60405180910390f35b3480156106ce57600080fd5b506106e960048036038101906106e491906132d4565b611721565b6040516106f691906132b2565b60405180910390f35b34801561070b57600080fd5b5061072660048036038101906107219190613353565b61192d565b005b34801561073457600080fd5b5061074f600480360381019061074a9190613448565b611aa4565b005b34801561075d57600080fd5b5061077860048036038101906107739190612b81565b611b17565b604051610785919061350d565b60405180910390f35b34801561079a57600080fd5b506107b560048036038101906107b09190612b81565b611b81565b6040516107c29190612c47565b60405180910390f35b3480156107d757600080fd5b506107e0611c1f565b6040516107ed9190612caa565b60405180910390f35b34801561080257600080fd5b5061081d60048036038101906108189190613528565b611c43565b60405161082a9190612b06565b60405180910390f35b34801561083f57600080fd5b5061085a60048036038101906108559190612b81565b611d33565b005b34801561086857600080fd5b50610883600480360381019061087e91906131c7565b611db9565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108e057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109105750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600b5481565b600d60009054906101000a900460ff161561096d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610964906135b4565b60405180910390fd5b6000610977610ddd565b9050600a5482826109889190613603565b106109c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bf906136a5565b60405180910390fd5b60068210610a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0290613711565b60405180910390fd5b60008290506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600b54811015610ac957600b54841115610a7d57600b5484610a769190613731565b9150610a82565b600091505b600b54600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60095482610ad79190613765565b341015610b19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b109061380b565b60405180910390fd5b610b233385611eb0565b50505050565b606060028054610b389061385a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b649061385a565b8015610bb15780601f10610b8657610100808354040283529160200191610bb1565b820191906000526020600020905b815481529060010190602001808311610b9457829003601f168201915b5050505050905090565b6000610bc682612082565b610bfc576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c42826120e1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ca9576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cc86121ad565b73ffffffffffffffffffffffffffffffffffffffff1614610d2b57610cf481610cef6121ad565b611c43565b610d2a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610de76121b5565b6001546000540303905090565b610dff8383836121ba565b505050565b610e0c612561565b73ffffffffffffffffffffffffffffffffffffffff16610e2a611590565b73ffffffffffffffffffffffffffffffffffffffff1614610e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e77906138d7565b60405180910390fd5b6000610e8a610ddd565b9050600a548484905083610e9e9190613765565b82610ea99190613603565b1115610eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee190613943565b60405180910390fd5b60005b84849050811015610f3c57610f29858583818110610f0e57610f0d613963565b5b9050602002016020810190610f2391906131c7565b84611eb0565b8080610f3490613992565b915050610eed565b5050505050565b610f4b612561565b73ffffffffffffffffffffffffffffffffffffffff16610f69611590565b73ffffffffffffffffffffffffffffffffffffffff1614610fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb6906138d7565b60405180910390fd5b610fc7611590565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061103a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103190613a26565b60405180910390fd5b565b61105783838360405180602001604052806000815250611aa4565b505050565b611064612561565b73ffffffffffffffffffffffffffffffffffffffff16611082611590565b73ffffffffffffffffffffffffffffffffffffffff16146110d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cf906138d7565b60405180910390fd5b8181600c91826110e9929190613bfd565b505050565b606060008251905060008167ffffffffffffffff81111561111257611111612eec565b5b60405190808252806020026020018201604052801561114b57816020015b611138612a0f565b8152602001906001900390816111305790505b50905060005b8281146111a45761117b85828151811061116e5761116d613963565b5b6020026020010151611b17565b82828151811061118e5761118d613963565b5b6020026020010181905250806001019050611151565b508092505050919050565b600d60009054906101000a900460ff1681565b60006111cd826120e1565b9050919050565b600681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611240576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611299612561565b73ffffffffffffffffffffffffffffffffffffffff166112b7611590565b73ffffffffffffffffffffffffffffffffffffffff161461130d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611304906138d7565b60405180910390fd5b6113176000612569565b565b611321612561565b73ffffffffffffffffffffffffffffffffffffffff1661133f611590565b73ffffffffffffffffffffffffffffffffffffffff1614611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c906138d7565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6113c9612561565b73ffffffffffffffffffffffffffffffffffffffff166113e7611590565b73ffffffffffffffffffffffffffffffffffffffff161461143d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611434906138d7565b60405180910390fd5b80600a8190555050565b600a5481565b6060600080600061145d856111d9565b905060008167ffffffffffffffff81111561147b5761147a612eec565b5b6040519080825280602002602001820160405280156114a95781602001602082028036833780820191505090505b5090506114b4612a0f565b60006114be6121b5565b90505b838614611582576114d18161262f565b9150816040015161157757600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461151c57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611576578083878060010198508151811061156957611568613963565b5b6020026020010181815250505b5b8060010190506114c1565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6115c2612561565b73ffffffffffffffffffffffffffffffffffffffff166115e0611590565b73ffffffffffffffffffffffffffffffffffffffff1614611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d906138d7565b60405180910390fd5b80600b8190555050565b60606003805461164f9061385a565b80601f016020809104026020016040519081016040528092919081815260200182805461167b9061385a565b80156116c85780601f1061169d576101008083540402835291602001916116c8565b820191906000526020600020905b8154815290600101906020018083116116ab57829003601f168201915b5050505050905090565b60095481565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606081831061175c576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061176761265a565b90506117716121b5565b851015611783576117806121b5565b94505b8084111561178f578093505b600061179a876111d9565b9050848610156117bd5760008686039050818110156117b7578091505b506117c2565b600090505b60008167ffffffffffffffff8111156117de576117dd612eec565b5b60405190808252806020026020018201604052801561180c5781602001602082028036833780820191505090505b509050600082036118235780945050505050611926565b600061182e88611b17565b90506000816040015161184357816000015190505b60008990505b8881141580156118595750848714155b15611918576118678161262f565b9250826040015161190d57600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146118b257826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361190c57808488806001019950815181106118ff576118fe613963565b5b6020026020010181815250505b5b806001019050611849565b508583528296505050505050505b9392505050565b6119356121ad565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611999576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006119a66121ad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a536121ad565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a989190612b06565b60405180910390a35050565b611aaf8484846121ba565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611b1157611ada84848484612663565b611b10576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611b1f612a0f565b611b27612a0f565b611b2f6121b5565b831080611b435750611b3f61265a565b8310155b15611b515780915050611b7c565b611b5a8361262f565b9050806040015115611b6f5780915050611b7c565b611b78836127b3565b9150505b919050565b6060611b8c82612082565b611bc2576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611bcc6127d3565b90506000815103611bec5760405180602001604052806000815250611c17565b80611bf684612865565b604051602001611c07929190613d09565b6040516020818303038152906040525b915050919050565b7f000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c181565b6000807f000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c190508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401611cb99190612caa565b602060405180830381865afa158015611cd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cfa9190613d6b565b73ffffffffffffffffffffffffffffffffffffffff1603611d1f576001915050611d2d565b611d2984846128bf565b9150505b92915050565b611d3b612561565b73ffffffffffffffffffffffffffffffffffffffff16611d59611590565b73ffffffffffffffffffffffffffffffffffffffff1614611daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da6906138d7565b60405180910390fd5b8060098190555050565b611dc1612561565b73ffffffffffffffffffffffffffffffffffffffff16611ddf611590565b73ffffffffffffffffffffffffffffffffffffffff1614611e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2c906138d7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ea4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9b90613e0a565b60405180910390fd5b611ead81612569565b50565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f1c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203611f56576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f636000848385612953565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1611fc860018414612959565b901b60a042901b611fd885612963565b171760046000838152602001908152602001600020819055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210611ffe5781600081905550505061207d600084838561296d565b505050565b60008161208d6121b5565b1115801561209c575060005482105b80156120da575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806120f06121b5565b11612176576000548110156121755760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612173575b6000810361216957600460008360019003935083815260200190815260200160002054905061213f565b80925050506121a8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b60006121c5826120e1565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461222c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661224d6121ad565b73ffffffffffffffffffffffffffffffffffffffff16148061227c575061227b856122766121ad565b611c43565b5b806122c1575061228a6121ad565b73ffffffffffffffffffffffffffffffffffffffff166122a984610bbb565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806122fa576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612360576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61236d8585856001612953565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61246a86612963565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316036124f257600060018401905060006004600083815260200190815260200160002054036124f05760005481146124ef578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461255a858585600161296d565b5050505050565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612637612a0f565b6126536004600084815260200190815260200160002054612973565b9050919050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126896121ad565b8786866040518563ffffffff1660e01b81526004016126ab9493929190613e7f565b6020604051808303816000875af19250505080156126e757506040513d601f19601f820116820180604052508101906126e49190613ee0565b60015b612760573d8060008114612717576040519150601f19603f3d011682016040523d82523d6000602084013e61271c565b606091505b506000815103612758576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6127bb612a0f565b6127cc6127c7836120e1565b612973565b9050919050565b6060600c80546127e29061385a565b80601f016020809104026020016040519081016040528092919081815260200182805461280e9061385a565b801561285b5780601f106128305761010080835404028352916020019161285b565b820191906000526020600020905b81548152906001019060200180831161283e57829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156128ab57600183039250600a81066030018353600a8104905061288b565b508181036020830392508083525050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b50505050565b6000819050919050565b6000819050919050565b50505050565b61297b612a0f565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c010000000000000000000000000000000000000000000000000000000083161415816040019015159081151581525050919050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a9b81612a66565b8114612aa657600080fd5b50565b600081359050612ab881612a92565b92915050565b600060208284031215612ad457612ad3612a5c565b5b6000612ae284828501612aa9565b91505092915050565b60008115159050919050565b612b0081612aeb565b82525050565b6000602082019050612b1b6000830184612af7565b92915050565b6000819050919050565b612b3481612b21565b82525050565b6000602082019050612b4f6000830184612b2b565b92915050565b612b5e81612b21565b8114612b6957600080fd5b50565b600081359050612b7b81612b55565b92915050565b600060208284031215612b9757612b96612a5c565b5b6000612ba584828501612b6c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612be8578082015181840152602081019050612bcd565b83811115612bf7576000848401525b50505050565b6000601f19601f8301169050919050565b6000612c1982612bae565b612c238185612bb9565b9350612c33818560208601612bca565b612c3c81612bfd565b840191505092915050565b60006020820190508181036000830152612c618184612c0e565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612c9482612c69565b9050919050565b612ca481612c89565b82525050565b6000602082019050612cbf6000830184612c9b565b92915050565b612cce81612c89565b8114612cd957600080fd5b50565b600081359050612ceb81612cc5565b92915050565b60008060408385031215612d0857612d07612a5c565b5b6000612d1685828601612cdc565b9250506020612d2785828601612b6c565b9150509250929050565b600080600060608486031215612d4a57612d49612a5c565b5b6000612d5886828701612cdc565b9350506020612d6986828701612cdc565b9250506040612d7a86828701612b6c565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112612da957612da8612d84565b5b8235905067ffffffffffffffff811115612dc657612dc5612d89565b5b602083019150836020820283011115612de257612de1612d8e565b5b9250929050565b600080600060408486031215612e0257612e01612a5c565b5b600084013567ffffffffffffffff811115612e2057612e1f612a61565b5b612e2c86828701612d93565b93509350506020612e3f86828701612b6c565b9150509250925092565b60008083601f840112612e5f57612e5e612d84565b5b8235905067ffffffffffffffff811115612e7c57612e7b612d89565b5b602083019150836001820283011115612e9857612e97612d8e565b5b9250929050565b60008060208385031215612eb657612eb5612a5c565b5b600083013567ffffffffffffffff811115612ed457612ed3612a61565b5b612ee085828601612e49565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f2482612bfd565b810181811067ffffffffffffffff82111715612f4357612f42612eec565b5b80604052505050565b6000612f56612a52565b9050612f628282612f1b565b919050565b600067ffffffffffffffff821115612f8257612f81612eec565b5b602082029050602081019050919050565b6000612fa6612fa184612f67565b612f4c565b90508083825260208201905060208402830185811115612fc957612fc8612d8e565b5b835b81811015612ff25780612fde8882612b6c565b845260208401935050602081019050612fcb565b5050509392505050565b600082601f83011261301157613010612d84565b5b8135613021848260208601612f93565b91505092915050565b6000602082840312156130405761303f612a5c565b5b600082013567ffffffffffffffff81111561305e5761305d612a61565b5b61306a84828501612ffc565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6130a881612c89565b82525050565b600067ffffffffffffffff82169050919050565b6130cb816130ae565b82525050565b6130da81612aeb565b82525050565b6060820160008201516130f6600085018261309f565b50602082015161310960208501826130c2565b50604082015161311c60408501826130d1565b50505050565b600061312e83836130e0565b60608301905092915050565b6000602082019050919050565b600061315282613073565b61315c818561307e565b93506131678361308f565b8060005b8381101561319857815161317f8882613122565b975061318a8361313a565b92505060018101905061316b565b5085935050505092915050565b600060208201905081810360008301526131bf8184613147565b905092915050565b6000602082840312156131dd576131dc612a5c565b5b60006131eb84828501612cdc565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61322981612b21565b82525050565b600061323b8383613220565b60208301905092915050565b6000602082019050919050565b600061325f826131f4565b61326981856131ff565b935061327483613210565b8060005b838110156132a557815161328c888261322f565b975061329783613247565b925050600181019050613278565b5085935050505092915050565b600060208201905081810360008301526132cc8184613254565b905092915050565b6000806000606084860312156132ed576132ec612a5c565b5b60006132fb86828701612cdc565b935050602061330c86828701612b6c565b925050604061331d86828701612b6c565b9150509250925092565b61333081612aeb565b811461333b57600080fd5b50565b60008135905061334d81613327565b92915050565b6000806040838503121561336a57613369612a5c565b5b600061337885828601612cdc565b92505060206133898582860161333e565b9150509250929050565b600080fd5b600067ffffffffffffffff8211156133b3576133b2612eec565b5b6133bc82612bfd565b9050602081019050919050565b82818337600083830152505050565b60006133eb6133e684613398565b612f4c565b90508281526020810184848401111561340757613406613393565b5b6134128482856133c9565b509392505050565b600082601f83011261342f5761342e612d84565b5b813561343f8482602086016133d8565b91505092915050565b6000806000806080858703121561346257613461612a5c565b5b600061347087828801612cdc565b945050602061348187828801612cdc565b935050604061349287828801612b6c565b925050606085013567ffffffffffffffff8111156134b3576134b2612a61565b5b6134bf8782880161341a565b91505092959194509250565b6060820160008201516134e1600085018261309f565b5060208201516134f460208501826130c2565b50604082015161350760408501826130d1565b50505050565b600060608201905061352260008301846134cb565b92915050565b6000806040838503121561353f5761353e612a5c565b5b600061354d85828601612cdc565b925050602061355e85828601612cdc565b9150509250929050565b7f4d696e74696e6720697320506175736564000000000000000000000000000000600082015250565b600061359e601183612bb9565b91506135a982613568565b602082019050919050565b600060208201905081810360008301526135cd81613591565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061360e82612b21565b915061361983612b21565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561364e5761364d6135d4565b5b828201905092915050565b7f4578636565647320537570706c79000000000000000000000000000000000000600082015250565b600061368f600e83612bb9565b915061369a82613659565b602082019050919050565b600060208201905081810360008301526136be81613682565b9050919050565b7f457863656564204d617820537570706c79000000000000000000000000000000600082015250565b60006136fb601183612bb9565b9150613706826136c5565b602082019050919050565b6000602082019050818103600083015261372a816136ee565b9050919050565b600061373c82612b21565b915061374783612b21565b92508282101561375a576137596135d4565b5b828203905092915050565b600061377082612b21565b915061377b83612b21565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156137b4576137b36135d4565b5b828202905092915050565b7f457468657220616d6f756e742073656e742077726f6e67000000000000000000600082015250565b60006137f5601783612bb9565b9150613800826137bf565b602082019050919050565b60006020820190508181036000830152613824816137e8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061387257607f821691505b6020821081036138855761388461382b565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006138c1602083612bb9565b91506138cc8261388b565b602082019050919050565b600060208201905081810360008301526138f0816138b4565b9050919050565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b600061392d601283612bb9565b9150613938826138f7565b602082019050919050565b6000602082019050818103600083015261395c81613920565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061399d82612b21565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036139cf576139ce6135d4565b5b600182019050919050565b7f576974686472617720556e7375636365737366756c0000000000000000000000600082015250565b6000613a10601583612bb9565b9150613a1b826139da565b602082019050919050565b60006020820190508181036000830152613a3f81613a03565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613ab37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613a76565b613abd8683613a76565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613afa613af5613af084612b21565b613ad5565b612b21565b9050919050565b6000819050919050565b613b1483613adf565b613b28613b2082613b01565b848454613a83565b825550505050565b600090565b613b3d613b30565b613b48818484613b0b565b505050565b5b81811015613b6c57613b61600082613b35565b600181019050613b4e565b5050565b601f821115613bb157613b8281613a51565b613b8b84613a66565b81016020851015613b9a578190505b613bae613ba685613a66565b830182613b4d565b50505b505050565b600082821c905092915050565b6000613bd460001984600802613bb6565b1980831691505092915050565b6000613bed8383613bc3565b9150826002028217905092915050565b613c078383613a46565b67ffffffffffffffff811115613c2057613c1f612eec565b5b613c2a825461385a565b613c35828285613b70565b6000601f831160018114613c645760008415613c52578287013590505b613c5c8582613be1565b865550613cc4565b601f198416613c7286613a51565b60005b82811015613c9a57848901358255600182019150602085019450602081019050613c75565b86831015613cb75784890135613cb3601f891682613bc3565b8355505b6001600288020188555050505b50505050505050565b600081905092915050565b6000613ce382612bae565b613ced8185613ccd565b9350613cfd818560208601612bca565b80840191505092915050565b6000613d158285613cd8565b9150613d218284613cd8565b91508190509392505050565b6000613d3882612c89565b9050919050565b613d4881613d2d565b8114613d5357600080fd5b50565b600081519050613d6581613d3f565b92915050565b600060208284031215613d8157613d80612a5c565b5b6000613d8f84828501613d56565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613df4602683612bb9565b9150613dff82613d98565b604082019050919050565b60006020820190508181036000830152613e2381613de7565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613e5182613e2a565b613e5b8185613e35565b9350613e6b818560208601612bca565b613e7481612bfd565b840191505092915050565b6000608082019050613e946000830187612c9b565b613ea16020830186612c9b565b613eae6040830185612b2b565b8181036060830152613ec08184613e46565b905095945050505050565b600081519050613eda81612a92565b92915050565b600060208284031215613ef657613ef5612a5c565b5b6000613f0484828501613ecb565b9150509291505056fea264697066735822122012e4f6f52ff41829cd2353bf4bcf77263b591811dbd1b13dffd613299122e12564736f6c634300080f0033

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

000000000000000000000000a5409ec958C83C3f309868babACA7c86DCB077c1

-----Decoded View---------------
Arg [0] : _proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1

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


Deployed Bytecode Sourcemap

287:3246:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5031:615:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;447:34:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;918:810;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10044:100:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12112:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11572:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4085:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12998:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2992:381:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3379:151;;;;;;;;;;;;;:::i;:::-;;13239:185:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2807:107:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1549:468:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;634:25:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9833:144:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;486:56:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5710:224:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1714:103:5;;;;;;;;;;;;;:::i;:::-;;2920:68:6;;;;;;;;;;;;;:::i;:::-;;2290:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;400:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5361:892:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1063:87:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2053:108:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10213:104:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;354:41:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1734:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2407:2505:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12388:308:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13495:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;970:420:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10388:318:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;666:45:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2413:388;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2168:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1972:201:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5031:615:1;5116:4;5431:10;5416:25;;:11;:25;;;;:102;;;;5508:10;5493:25;;:11;:25;;;;5416:102;:179;;;;5585:10;5570:25;;:11;:25;;;;5416:179;5396:199;;5031:615;;;:::o;447:34:6:-;;;;:::o;918:810::-;988:6;;;;;;;;;;;987:7;979:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;1025:20;1048:13;:11;:13::i;:::-;1025:36;;1105:19;;1093:9;1078:12;:24;;;;:::i;:::-;:46;1070:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;541:1;1158:9;:40;1150:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;1248:19;1270:9;1248:31;;1286:21;1310:16;:28;1327:10;1310:28;;;;;;;;;;;;;;;;1286:52;;1367:15;;1351:13;:31;1347:247;;;1409:15;;1397:9;:27;1393:137;;;1463:15;;1451:9;:27;;;;:::i;:::-;1437:41;;1393:137;;;1519:1;1505:15;;1393:137;1571:15;;1540:16;:28;1557:10;1540:28;;;;;;;;;;;;;;;:46;;;;1347:247;1641:16;;1627:11;:30;;;;:::i;:::-;1614:9;:43;;1606:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;1694:28;1700:10;1712:9;1694:5;:28::i;:::-;972:756;;;918:810;:::o;10044:100:1:-;10098:13;10131:5;10124:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10044:100;:::o;12112:204::-;12180:7;12205:16;12213:7;12205;:16::i;:::-;12200:64;;12230:34;;;;;;;;;;;;;;12200:64;12284:15;:24;12300:7;12284:24;;;;;;;;;;;;;;;;;;;;;12277:31;;12112:204;;;:::o;11572:474::-;11645:13;11677:27;11696:7;11677:18;:27::i;:::-;11645:61;;11727:5;11721:11;;:2;:11;;;11717:48;;11741:24;;;;;;;;;;;;;;11717:48;11805:5;11782:28;;:19;:17;:19::i;:::-;:28;;;11778:175;;11830:44;11847:5;11854:19;:17;:19::i;:::-;11830:16;:44::i;:::-;11825:128;;11902:35;;;;;;;;;;;;;;11825:128;11778:175;11992:2;11965:15;:24;11981:7;11965:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;12030:7;12026:2;12010:28;;12019:5;12010:28;;;;;;;;;;;;11634:412;11572:474;;:::o;4085:315::-;4138:7;4366:15;:13;:15::i;:::-;4351:12;;4335:13;;:28;:46;4328:53;;4085:315;:::o;12998:170::-;13132:28;13142:4;13148:2;13152:7;13132:9;:28::i;:::-;12998:170;;;:::o;2992:381:6:-;1294:12:5;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3104:20:6::1;3127:13;:11;:13::i;:::-;3104:36;;3211:19;;3191:9;;:16;;3180:8;:27;;;;:::i;:::-;3165:12;:42;;;;:::i;:::-;:65;;3149:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;3280:9;3275:93;3299:9;;:16;;3295:1;:20;3275:93;;;3331:29;3337:9;;3347:1;3337:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;3351:8;3331:5;:29::i;:::-;3317:3;;;;;:::i;:::-;;;;3275:93;;;;3097:276;2992:381:::0;;;:::o;3379:151::-;1294:12:5;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3449:7:6::1;:5;:7::i;:::-;3441:21;;:44;3463:21;3441:44;;;;;;;;;;;;;;;;;;;;;;;3425:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;3379:151::o:0;13239:185:1:-;13377:39;13394:4;13400:2;13404:7;13377:39;;;;;;;;;;;;:16;:39::i;:::-;13239:185;;;:::o;2807:107:6:-;1294:12:5;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2897:11:6::1;;2882:12;:26;;;;;;;:::i;:::-;;2807:107:::0;;:::o;1549:468:2:-;1638:23;1699:22;1724:8;:15;1699:40;;1754:34;1812:14;1791:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1754:73;;1847:9;1842:125;1863:14;1858:1;:19;1842:125;;1919:32;1939:8;1948:1;1939:11;;;;;;;;:::i;:::-;;;;;;;;1919:19;:32::i;:::-;1903:10;1914:1;1903:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;1879:3;;;;;1842:125;;;;1988:10;1981:17;;;;1549:468;;;:::o;634:25:6:-;;;;;;;;;;;;;:::o;9833:144:1:-;9897:7;9940:27;9959:7;9940:18;:27::i;:::-;9917:52;;9833:144;;;:::o;486:56:6:-;541:1;486:56;:::o;5710:224:1:-;5774:7;5815:1;5798:19;;:5;:19;;;5794:60;;5826:28;;;;;;;;;;;;;;5794:60;1049:13;5872:18;:25;5891:5;5872:25;;;;;;;;;;;;;;;;:54;5865:61;;5710:224;;;:::o;1714:103:5:-;1294:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1779:30:::1;1806:1;1779:18;:30::i;:::-;1714:103::o:0;2920:68:6:-;1294:12:5;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2976:6:6::1;;;;;;;;;;;2975:7;2966:6;;:16;;;;;;;;;;;;;;;;;;2920:68::o:0;2290:113::-;1294:12:5;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2386:9:6::1;2364:19;:31;;;;2290:113:::0;:::o;400:42::-;;;;:::o;5361:892:2:-;5431:16;5485:19;5519:25;5559:22;5584:16;5594:5;5584:9;:16::i;:::-;5559:41;;5615:25;5657:14;5643:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5615:57;;5687:31;;:::i;:::-;5738:9;5750:15;:13;:15::i;:::-;5738:27;;5733:472;5782:14;5767:11;:29;5733:472;;5834:15;5847:1;5834:12;:15::i;:::-;5822:27;;5872:9;:16;;;5913:8;5868:73;5989:1;5963:28;;:9;:14;;;:28;;;5959:111;;6036:9;:14;;;6016:34;;5959:111;6113:5;6092:26;;:17;:26;;;6088:102;;6169:1;6143:8;6152:13;;;;;;6143:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;6088:102;5733:472;5798:3;;;;;5733:472;;;;6226:8;6219:15;;;;;;;5361:892;;;:::o;1063:87:5:-;1109:7;1136:6;;;;;;;;;;;1129:13;;1063:87;:::o;2053:108:6:-;1294:12:5;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2145:8:6::1;2127:15;:26;;;;2053:108:::0;:::o;10213:104:1:-;10269:13;10302:7;10295:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10213:104;:::o;354:41:6:-;;;;:::o;1734:115::-;1797:7;1820:16;:23;1837:5;1820:23;;;;;;;;;;;;;;;;1813:30;;1734:115;;;:::o;2407:2505:2:-;2542:16;2609:4;2600:5;:13;2596:45;;2622:19;;;;;;;;;;;;;;2596:45;2656:19;2690:17;2710:14;:12;:14::i;:::-;2690:34;;2810:15;:13;:15::i;:::-;2802:5;:23;2798:87;;;2854:15;:13;:15::i;:::-;2846:23;;2798:87;2961:9;2954:4;:16;2950:73;;;2998:9;2991:16;;2950:73;3037:25;3065:16;3075:5;3065:9;:16::i;:::-;3037:44;;3259:4;3251:5;:12;3247:278;;;3284:19;3313:5;3306:4;:12;3284:34;;3355:17;3341:11;:31;3337:111;;;3417:11;3397:31;;3337:111;3265:198;3247:278;;;3508:1;3488:21;;3247:278;3539:25;3581:17;3567:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3539:60;;3639:1;3618:17;:22;3614:78;;3668:8;3661:15;;;;;;;;3614:78;3836:31;3870:26;3890:5;3870:19;:26::i;:::-;3836:60;;3911:25;4156:9;:16;;;4151:92;;4213:9;:14;;;4193:34;;4151:92;4262:9;4274:5;4262:17;;4257:478;4286:4;4281:1;:9;;:45;;;;;4309:17;4294:11;:32;;4281:45;4257:478;;;4364:15;4377:1;4364:12;:15::i;:::-;4352:27;;4402:9;:16;;;4443:8;4398:73;4519:1;4493:28;;:9;:14;;;:28;;;4489:111;;4566:9;:14;;;4546:34;;4489:111;4643:5;4622:26;;:17;:26;;;4618:102;;4699:1;4673:8;4682:13;;;;;;4673:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;4618:102;4257:478;4328:3;;;;;4257:478;;;;4837:11;4827:8;4820:29;4885:8;4878:15;;;;;;;;2407:2505;;;;;;:::o;12388:308:1:-;12499:19;:17;:19::i;:::-;12487:31;;:8;:31;;;12483:61;;12527:17;;;;;;;;;;;;;;12483:61;12609:8;12557:18;:39;12576:19;:17;:19::i;:::-;12557:39;;;;;;;;;;;;;;;:49;12597:8;12557:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;12669:8;12633:55;;12648:19;:17;:19::i;:::-;12633:55;;;12679:8;12633:55;;;;;;:::i;:::-;;;;;;;;12388:308;;:::o;13495:396::-;13662:28;13672:4;13678:2;13682:7;13662:9;:28::i;:::-;13723:1;13705:2;:14;;;:19;13701:183;;13744:56;13775:4;13781:2;13785:7;13794:5;13744:30;:56::i;:::-;13739:145;;13828:40;;;;;;;;;;;;;;13739:145;13701:183;13495:396;;;;:::o;970:420:2:-;1046:21;;:::i;:::-;1080:31;;:::i;:::-;1136:15;:13;:15::i;:::-;1126:7;:25;:54;;;;1166:14;:12;:14::i;:::-;1155:7;:25;;1126:54;1122:103;;;1204:9;1197:16;;;;;1122:103;1247:21;1260:7;1247:12;:21::i;:::-;1235:33;;1283:9;:16;;;1279:65;;;1323:9;1316:16;;;;;1279:65;1361:21;1374:7;1361:12;:21::i;:::-;1354:28;;;970:420;;;;:::o;10388:318:1:-;10461:13;10492:16;10500:7;10492;:16::i;:::-;10487:59;;10517:29;;;;;;;;;;;;;;10487:59;10559:21;10583:10;:8;:10::i;:::-;10559:34;;10636:1;10617:7;10611:21;:26;:87;;;;;;;;;;;;;;;;;10664:7;10673:18;10683:7;10673:9;:18::i;:::-;10647:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10611:87;10604:94;;;10388:318;;;:::o;666:45:6:-;;;:::o;2413:388::-;2540:4;2556:34;2622:20;2556:93;;2703:8;2662:49;;2670:13;:21;;;2692:5;2670:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2662:49;;;2658:83;;2729:4;2722:11;;;;;2658:83;2756:39;2779:5;2786:8;2756:22;:39::i;:::-;2749:46;;;2413:388;;;;;:::o;2168:114::-;1294:12:5;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2263:11:6::1;2244:16;:30;;;;2168:114:::0;:::o;1972:201:5:-;1294:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:1:::1;2061:22;;:8;:22;;::::0;2053:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2137:28;2156:8;2137:18;:28::i;:::-;1972:201:::0;:::o;17475:1656:1:-;17540:20;17563:13;;17540:36;;17605:1;17591:16;;:2;:16;;;17587:48;;17616:19;;;;;;;;;;;;;;17587:48;17662:1;17650:8;:13;17646:44;;17672:18;;;;;;;;;;;;;;17646:44;17703:61;17733:1;17737:2;17741:12;17755:8;17703:21;:61::i;:::-;18307:1;1186:2;18278:1;:25;;18277:31;18265:8;:44;18239:18;:22;18258:2;18239:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;1966:3;18708:29;18735:1;18723:8;:13;18708:14;:29::i;:::-;:56;;1703:3;18645:15;:41;;18603:21;18621:2;18603:17;:21::i;:::-;:84;:162;18552:17;:31;18570:12;18552:31;;;;;;;;;;;:213;;;;18782:20;18805:12;18782:35;;18832:11;18861:8;18846:12;:23;18832:37;;18886:111;18938:14;;;;;;18934:2;18913:40;;18930:1;18913:40;;;;;;;;;;;;18992:3;18977:12;:18;18886:111;;19029:12;19013:13;:28;;;;18016:1037;;19063:60;19092:1;19096:2;19100:12;19114:8;19063:20;:60::i;:::-;17529:1602;17475:1656;;:::o;14146:273::-;14203:4;14259:7;14240:15;:13;:15::i;:::-;:26;;:66;;;;;14293:13;;14283:7;:23;14240:66;:152;;;;;14391:1;1819:8;14344:17;:26;14362:7;14344:26;;;;;;;;;;;;:43;:48;14240:152;14220:172;;14146:273;;;:::o;7348:1129::-;7415:7;7435:12;7450:7;7435:22;;7518:4;7499:15;:13;:15::i;:::-;:23;7495:915;;7552:13;;7545:4;:20;7541:869;;;7590:14;7607:17;:23;7625:4;7607:23;;;;;;;;;;;;7590:40;;7723:1;1819:8;7696:6;:23;:28;7692:699;;8215:113;8232:1;8222:6;:11;8215:113;;8275:17;:25;8293:6;;;;;;;8275:25;;;;;;;;;;;;8266:34;;8215:113;;;8361:6;8354:13;;;;;;7692:699;7567:843;7541:869;7495:915;8438:31;;;;;;;;;;;;;;7348:1129;;;;:::o;28128:105::-;28188:7;28215:10;28208:17;;28128:105;:::o;1855:87:6:-;1912:7;1855:87;:::o;19385:2515:1:-;19500:27;19530;19549:7;19530:18;:27::i;:::-;19500:57;;19615:4;19574:45;;19590:19;19574:45;;;19570:86;;19628:28;;;;;;;;;;;;;;19570:86;19669:22;19718:4;19695:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;19739:43;19756:4;19762:19;:17;:19::i;:::-;19739:16;:43::i;:::-;19695:87;:147;;;;19823:19;:17;:19::i;:::-;19799:43;;:20;19811:7;19799:11;:20::i;:::-;:43;;;19695:147;19669:174;;19861:17;19856:66;;19887:35;;;;;;;;;;;;;;19856:66;19951:1;19937:16;;:2;:16;;;19933:52;;19962:23;;;;;;;;;;;;;;19933:52;19998:43;20020:4;20026:2;20030:7;20039:1;19998:21;:43::i;:::-;20114:15;:24;20130:7;20114:24;;;;;;;;;;;;20107:31;;;;;;;;;;;20506:18;:24;20525:4;20506:24;;;;;;;;;;;;;;;;20504:26;;;;;;;;;;;;20575:18;:22;20594:2;20575:22;;;;;;;;;;;;;;;;20573:24;;;;;;;;;;;2101:8;1703:3;20956:15;:41;;20914:21;20932:2;20914:17;:21::i;:::-;:84;:128;20868:17;:26;20886:7;20868:26;;;;;;;;;;;:174;;;;21212:1;2101:8;21162:19;:46;:51;21158:626;;21234:19;21266:1;21256:7;:11;21234:33;;21423:1;21389:17;:30;21407:11;21389:30;;;;;;;;;;;;:35;21385:384;;21527:13;;21512:11;:28;21508:242;;21707:19;21674:17;:30;21692:11;21674:30;;;;;;;;;;;:52;;;;21508:242;21385:384;21215:569;21158:626;21831:7;21827:2;21812:27;;21821:4;21812:27;;;;;;;;;;;;21850:42;21871:4;21877:2;21881:7;21890:1;21850:20;:42::i;:::-;19489:2411;;19385:2515;;;:::o;656:98:0:-;709:7;736:10;729:17;;656:98;:::o;2333:191:5:-;2407:16;2426:6;;;;;;;;;;;2407:25;;2452:8;2443:6;;:17;;;;;;;;;;;;;;;;;;2507:8;2476:40;;2497:8;2476:40;;;;;;;;;;;;2396:128;2333:191;:::o;8957:153:1:-;9017:21;;:::i;:::-;9058:44;9077:17;:24;9095:5;9077:24;;;;;;;;;;;;9058:18;:44::i;:::-;9051:51;;8957:153;;;:::o;3779:95::-;3826:7;3853:13;;3846:20;;3779:95;:::o;25597:716::-;25760:4;25806:2;25781:45;;;25827:19;:17;:19::i;:::-;25848:4;25854:7;25863:5;25781:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;25777:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26081:1;26064:6;:13;:18;26060:235;;26110:40;;;;;;;;;;;;;;26060:235;26253:6;26247:13;26238:6;26234:2;26230:15;26223:38;25777:529;25950:54;;;25940:64;;;:6;:64;;;;25933:71;;;25597:716;;;;;;:::o;9613:158::-;9675:21;;:::i;:::-;9716:47;9735:27;9754:7;9735:18;:27::i;:::-;9716:18;:47::i;:::-;9709:54;;9613:158;;;:::o;1948:99:6:-;2000:13;2029:12;2022:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1948:99;:::o;28339:1959:1:-;28396:17;28817:3;28810:4;28804:11;28800:21;28793:28;;28908:3;28902:4;28895:17;29014:3;29471:5;29601:1;29596:3;29592:11;29585:18;;29738:2;29732:4;29728:13;29724:2;29720:22;29715:3;29707:36;29779:2;29773:4;29769:13;29761:21;;29362:682;29798:4;29362:682;;;29973:1;29968:3;29964:11;29957:18;;30024:2;30018:4;30014:13;30010:2;30006:22;30001:3;29993:36;29894:2;29888:4;29884:13;29876:21;;29362:682;;;29366:431;30095:3;30090;30086:13;30210:2;30205:3;30201:12;30194:19;;30273:6;30268:3;30261:19;28435:1856;;28339:1959;;;:::o;12767:164::-;12864:4;12888:18;:25;12907:5;12888:25;;;;;;;;;;;;;;;:35;12914:8;12888:35;;;;;;;;;;;;;;;;;;;;;;;;;12881:42;;12767:164;;;;:::o;26961:159::-;;;;;:::o;11368:142::-;11426:14;11487:5;11477:15;;11368:142;;;:::o;11133:148::-;11197:14;11258:5;11248:15;;11133:148;;;:::o;27779:158::-;;;;;:::o;8571:295::-;8637:31;;:::i;:::-;8714:6;8681:9;:14;;:41;;;;;;;;;;;1703:3;8767:6;:32;;8733:9;:24;;:67;;;;;;;;;;;8857:1;1819:8;8830:6;:23;:28;;8811:9;:16;;:47;;;;;;;;;;;8571:295;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:7:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:122::-;2026:24;2044:5;2026:24;:::i;:::-;2019:5;2016:35;2006:63;;2065:1;2062;2055:12;2006:63;1953:122;:::o;2081:139::-;2127:5;2165:6;2152:20;2143:29;;2181:33;2208:5;2181:33;:::i;:::-;2081:139;;;;:::o;2226:329::-;2285:6;2334:2;2322:9;2313:7;2309:23;2305:32;2302:119;;;2340:79;;:::i;:::-;2302:119;2460:1;2485:53;2530:7;2521:6;2510:9;2506:22;2485:53;:::i;:::-;2475:63;;2431:117;2226:329;;;;:::o;2561:99::-;2613:6;2647:5;2641:12;2631:22;;2561:99;;;:::o;2666:169::-;2750:11;2784:6;2779:3;2772:19;2824:4;2819:3;2815:14;2800:29;;2666:169;;;;:::o;2841:307::-;2909:1;2919:113;2933:6;2930:1;2927:13;2919:113;;;3018:1;3013:3;3009:11;3003:18;2999:1;2994:3;2990:11;2983:39;2955:2;2952:1;2948:10;2943:15;;2919:113;;;3050:6;3047:1;3044:13;3041:101;;;3130:1;3121:6;3116:3;3112:16;3105:27;3041:101;2890:258;2841:307;;;:::o;3154:102::-;3195:6;3246:2;3242:7;3237:2;3230:5;3226:14;3222:28;3212:38;;3154:102;;;:::o;3262:364::-;3350:3;3378:39;3411:5;3378:39;:::i;:::-;3433:71;3497:6;3492:3;3433:71;:::i;:::-;3426:78;;3513:52;3558:6;3553:3;3546:4;3539:5;3535:16;3513:52;:::i;:::-;3590:29;3612:6;3590:29;:::i;:::-;3585:3;3581:39;3574:46;;3354:272;3262:364;;;;:::o;3632:313::-;3745:4;3783:2;3772:9;3768:18;3760:26;;3832:9;3826:4;3822:20;3818:1;3807:9;3803:17;3796:47;3860:78;3933:4;3924:6;3860:78;:::i;:::-;3852:86;;3632:313;;;;:::o;3951:126::-;3988:7;4028:42;4021:5;4017:54;4006:65;;3951:126;;;:::o;4083:96::-;4120:7;4149:24;4167:5;4149:24;:::i;:::-;4138:35;;4083:96;;;:::o;4185:118::-;4272:24;4290:5;4272:24;:::i;:::-;4267:3;4260:37;4185:118;;:::o;4309:222::-;4402:4;4440:2;4429:9;4425:18;4417:26;;4453:71;4521:1;4510:9;4506:17;4497:6;4453:71;:::i;:::-;4309:222;;;;:::o;4537:122::-;4610:24;4628:5;4610:24;:::i;:::-;4603:5;4600:35;4590:63;;4649:1;4646;4639:12;4590:63;4537:122;:::o;4665:139::-;4711:5;4749:6;4736:20;4727:29;;4765:33;4792:5;4765:33;:::i;:::-;4665:139;;;;:::o;4810:474::-;4878:6;4886;4935:2;4923:9;4914:7;4910:23;4906:32;4903:119;;;4941:79;;:::i;:::-;4903:119;5061:1;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5032:117;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4810:474;;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:117;6147:1;6144;6137:12;6161:117;6270:1;6267;6260:12;6301:568;6374:8;6384:6;6434:3;6427:4;6419:6;6415:17;6411:27;6401:122;;6442:79;;:::i;:::-;6401:122;6555:6;6542:20;6532:30;;6585:18;6577:6;6574:30;6571:117;;;6607:79;;:::i;:::-;6571:117;6721:4;6713:6;6709:17;6697:29;;6775:3;6767:4;6759:6;6755:17;6745:8;6741:32;6738:41;6735:128;;;6782:79;;:::i;:::-;6735:128;6301:568;;;;;:::o;6875:704::-;6970:6;6978;6986;7035:2;7023:9;7014:7;7010:23;7006:32;7003:119;;;7041:79;;:::i;:::-;7003:119;7189:1;7178:9;7174:17;7161:31;7219:18;7211:6;7208:30;7205:117;;;7241:79;;:::i;:::-;7205:117;7354:80;7426:7;7417:6;7406:9;7402:22;7354:80;:::i;:::-;7336:98;;;;7132:312;7483:2;7509:53;7554:7;7545:6;7534:9;7530:22;7509:53;:::i;:::-;7499:63;;7454:118;6875:704;;;;;:::o;7599:553::-;7657:8;7667:6;7717:3;7710:4;7702:6;7698:17;7694:27;7684:122;;7725:79;;:::i;:::-;7684:122;7838:6;7825:20;7815:30;;7868:18;7860:6;7857:30;7854:117;;;7890:79;;:::i;:::-;7854:117;8004:4;7996:6;7992:17;7980:29;;8058:3;8050:4;8042:6;8038:17;8028:8;8024:32;8021:41;8018:128;;;8065:79;;:::i;:::-;8018:128;7599:553;;;;;:::o;8158:529::-;8229:6;8237;8286:2;8274:9;8265:7;8261:23;8257:32;8254:119;;;8292:79;;:::i;:::-;8254:119;8440:1;8429:9;8425:17;8412:31;8470:18;8462:6;8459:30;8456:117;;;8492:79;;:::i;:::-;8456:117;8605:65;8662:7;8653:6;8642:9;8638:22;8605:65;:::i;:::-;8587:83;;;;8383:297;8158:529;;;;;:::o;8693:180::-;8741:77;8738:1;8731:88;8838:4;8835:1;8828:15;8862:4;8859:1;8852:15;8879:281;8962:27;8984:4;8962:27;:::i;:::-;8954:6;8950:40;9092:6;9080:10;9077:22;9056:18;9044:10;9041:34;9038:62;9035:88;;;9103:18;;:::i;:::-;9035:88;9143:10;9139:2;9132:22;8922:238;8879:281;;:::o;9166:129::-;9200:6;9227:20;;:::i;:::-;9217:30;;9256:33;9284:4;9276:6;9256:33;:::i;:::-;9166:129;;;:::o;9301:311::-;9378:4;9468:18;9460:6;9457:30;9454:56;;;9490:18;;:::i;:::-;9454:56;9540:4;9532:6;9528:17;9520:25;;9600:4;9594;9590:15;9582:23;;9301:311;;;:::o;9635:710::-;9731:5;9756:81;9772:64;9829:6;9772:64;:::i;:::-;9756:81;:::i;:::-;9747:90;;9857:5;9886:6;9879:5;9872:21;9920:4;9913:5;9909:16;9902:23;;9973:4;9965:6;9961:17;9953:6;9949:30;10002:3;9994:6;9991:15;9988:122;;;10021:79;;:::i;:::-;9988:122;10136:6;10119:220;10153:6;10148:3;10145:15;10119:220;;;10228:3;10257:37;10290:3;10278:10;10257:37;:::i;:::-;10252:3;10245:50;10324:4;10319:3;10315:14;10308:21;;10195:144;10179:4;10174:3;10170:14;10163:21;;10119:220;;;10123:21;9737:608;;9635:710;;;;;:::o;10368:370::-;10439:5;10488:3;10481:4;10473:6;10469:17;10465:27;10455:122;;10496:79;;:::i;:::-;10455:122;10613:6;10600:20;10638:94;10728:3;10720:6;10713:4;10705:6;10701:17;10638:94;:::i;:::-;10629:103;;10445:293;10368:370;;;;:::o;10744:539::-;10828:6;10877:2;10865:9;10856:7;10852:23;10848:32;10845:119;;;10883:79;;:::i;:::-;10845:119;11031:1;11020:9;11016:17;11003:31;11061:18;11053:6;11050:30;11047:117;;;11083:79;;:::i;:::-;11047:117;11188:78;11258:7;11249:6;11238:9;11234:22;11188:78;:::i;:::-;11178:88;;10974:302;10744:539;;;;:::o;11289:146::-;11388:6;11422:5;11416:12;11406:22;;11289:146;;;:::o;11441:216::-;11572:11;11606:6;11601:3;11594:19;11646:4;11641:3;11637:14;11622:29;;11441:216;;;;:::o;11663:164::-;11762:4;11785:3;11777:11;;11815:4;11810:3;11806:14;11798:22;;11663:164;;;:::o;11833:108::-;11910:24;11928:5;11910:24;:::i;:::-;11905:3;11898:37;11833:108;;:::o;11947:101::-;11983:7;12023:18;12016:5;12012:30;12001:41;;11947:101;;;:::o;12054:105::-;12129:23;12146:5;12129:23;:::i;:::-;12124:3;12117:36;12054:105;;:::o;12165:99::-;12236:21;12251:5;12236:21;:::i;:::-;12231:3;12224:34;12165:99;;:::o;12342:689::-;12493:4;12488:3;12484:14;12580:4;12573:5;12569:16;12563:23;12599:63;12656:4;12651:3;12647:14;12633:12;12599:63;:::i;:::-;12508:164;12764:4;12757:5;12753:16;12747:23;12783:61;12838:4;12833:3;12829:14;12815:12;12783:61;:::i;:::-;12682:172;12938:4;12931:5;12927:16;12921:23;12957:57;13008:4;13003:3;12999:14;12985:12;12957:57;:::i;:::-;12864:160;12462:569;12342:689;;:::o;13037:307::-;13170:10;13191:110;13297:3;13289:6;13191:110;:::i;:::-;13333:4;13328:3;13324:14;13310:28;;13037:307;;;;:::o;13350:145::-;13452:4;13484;13479:3;13475:14;13467:22;;13350:145;;;:::o;13577:988::-;13760:3;13789:86;13869:5;13789:86;:::i;:::-;13891:118;14002:6;13997:3;13891:118;:::i;:::-;13884:125;;14033:88;14115:5;14033:88;:::i;:::-;14144:7;14175:1;14160:380;14185:6;14182:1;14179:13;14160:380;;;14261:6;14255:13;14288:127;14411:3;14396:13;14288:127;:::i;:::-;14281:134;;14438:92;14523:6;14438:92;:::i;:::-;14428:102;;14220:320;14207:1;14204;14200:9;14195:14;;14160:380;;;14164:14;14556:3;14549:10;;13765:800;;;13577:988;;;;:::o;14571:501::-;14778:4;14816:2;14805:9;14801:18;14793:26;;14865:9;14859:4;14855:20;14851:1;14840:9;14836:17;14829:47;14893:172;15060:4;15051:6;14893:172;:::i;:::-;14885:180;;14571:501;;;;:::o;15078:329::-;15137:6;15186:2;15174:9;15165:7;15161:23;15157:32;15154:119;;;15192:79;;:::i;:::-;15154:119;15312:1;15337:53;15382:7;15373:6;15362:9;15358:22;15337:53;:::i;:::-;15327:63;;15283:117;15078:329;;;;:::o;15413:114::-;15480:6;15514:5;15508:12;15498:22;;15413:114;;;:::o;15533:184::-;15632:11;15666:6;15661:3;15654:19;15706:4;15701:3;15697:14;15682:29;;15533:184;;;;:::o;15723:132::-;15790:4;15813:3;15805:11;;15843:4;15838:3;15834:14;15826:22;;15723:132;;;:::o;15861:108::-;15938:24;15956:5;15938:24;:::i;:::-;15933:3;15926:37;15861:108;;:::o;15975:179::-;16044:10;16065:46;16107:3;16099:6;16065:46;:::i;:::-;16143:4;16138:3;16134:14;16120:28;;15975:179;;;;:::o;16160:113::-;16230:4;16262;16257:3;16253:14;16245:22;;16160:113;;;:::o;16309:732::-;16428:3;16457:54;16505:5;16457:54;:::i;:::-;16527:86;16606:6;16601:3;16527:86;:::i;:::-;16520:93;;16637:56;16687:5;16637:56;:::i;:::-;16716:7;16747:1;16732:284;16757:6;16754:1;16751:13;16732:284;;;16833:6;16827:13;16860:63;16919:3;16904:13;16860:63;:::i;:::-;16853:70;;16946:60;16999:6;16946:60;:::i;:::-;16936:70;;16792:224;16779:1;16776;16772:9;16767:14;;16732:284;;;16736:14;17032:3;17025:10;;16433:608;;;16309:732;;;;:::o;17047:373::-;17190:4;17228:2;17217:9;17213:18;17205:26;;17277:9;17271:4;17267:20;17263:1;17252:9;17248:17;17241:47;17305:108;17408:4;17399:6;17305:108;:::i;:::-;17297:116;;17047:373;;;;:::o;17426:619::-;17503:6;17511;17519;17568:2;17556:9;17547:7;17543:23;17539:32;17536:119;;;17574:79;;:::i;:::-;17536:119;17694:1;17719:53;17764:7;17755:6;17744:9;17740:22;17719:53;:::i;:::-;17709:63;;17665:117;17821:2;17847:53;17892:7;17883:6;17872:9;17868:22;17847:53;:::i;:::-;17837:63;;17792:118;17949:2;17975:53;18020:7;18011:6;18000:9;17996:22;17975:53;:::i;:::-;17965:63;;17920:118;17426:619;;;;;:::o;18051:116::-;18121:21;18136:5;18121:21;:::i;:::-;18114:5;18111:32;18101:60;;18157:1;18154;18147:12;18101:60;18051:116;:::o;18173:133::-;18216:5;18254:6;18241:20;18232:29;;18270:30;18294:5;18270:30;:::i;:::-;18173:133;;;;:::o;18312:468::-;18377:6;18385;18434:2;18422:9;18413:7;18409:23;18405:32;18402:119;;;18440:79;;:::i;:::-;18402:119;18560:1;18585:53;18630:7;18621:6;18610:9;18606:22;18585:53;:::i;:::-;18575:63;;18531:117;18687:2;18713:50;18755:7;18746:6;18735:9;18731:22;18713:50;:::i;:::-;18703:60;;18658:115;18312:468;;;;;:::o;18786:117::-;18895:1;18892;18885:12;18909:307;18970:4;19060:18;19052:6;19049:30;19046:56;;;19082:18;;:::i;:::-;19046:56;19120:29;19142:6;19120:29;:::i;:::-;19112:37;;19204:4;19198;19194:15;19186:23;;18909:307;;;:::o;19222:154::-;19306:6;19301:3;19296;19283:30;19368:1;19359:6;19354:3;19350:16;19343:27;19222:154;;;:::o;19382:410::-;19459:5;19484:65;19500:48;19541:6;19500:48;:::i;:::-;19484:65;:::i;:::-;19475:74;;19572:6;19565:5;19558:21;19610:4;19603:5;19599:16;19648:3;19639:6;19634:3;19630:16;19627:25;19624:112;;;19655:79;;:::i;:::-;19624:112;19745:41;19779:6;19774:3;19769;19745:41;:::i;:::-;19465:327;19382:410;;;;;:::o;19811:338::-;19866:5;19915:3;19908:4;19900:6;19896:17;19892:27;19882:122;;19923:79;;:::i;:::-;19882:122;20040:6;20027:20;20065:78;20139:3;20131:6;20124:4;20116:6;20112:17;20065:78;:::i;:::-;20056:87;;19872:277;19811:338;;;;:::o;20155:943::-;20250:6;20258;20266;20274;20323:3;20311:9;20302:7;20298:23;20294:33;20291:120;;;20330:79;;:::i;:::-;20291:120;20450:1;20475:53;20520:7;20511:6;20500:9;20496:22;20475:53;:::i;:::-;20465:63;;20421:117;20577:2;20603:53;20648:7;20639:6;20628:9;20624:22;20603:53;:::i;:::-;20593:63;;20548:118;20705:2;20731:53;20776:7;20767:6;20756:9;20752:22;20731:53;:::i;:::-;20721:63;;20676:118;20861:2;20850:9;20846:18;20833:32;20892:18;20884:6;20881:30;20878:117;;;20914:79;;:::i;:::-;20878:117;21019:62;21073:7;21064:6;21053:9;21049:22;21019:62;:::i;:::-;21009:72;;20804:287;20155:943;;;;;;;:::o;21176:699::-;21337:4;21332:3;21328:14;21424:4;21417:5;21413:16;21407:23;21443:63;21500:4;21495:3;21491:14;21477:12;21443:63;:::i;:::-;21352:164;21608:4;21601:5;21597:16;21591:23;21627:61;21682:4;21677:3;21673:14;21659:12;21627:61;:::i;:::-;21526:172;21782:4;21775:5;21771:16;21765:23;21801:57;21852:4;21847:3;21843:14;21829:12;21801:57;:::i;:::-;21708:160;21306:569;21176:699;;:::o;21881:350::-;22038:4;22076:2;22065:9;22061:18;22053:26;;22089:135;22221:1;22210:9;22206:17;22197:6;22089:135;:::i;:::-;21881:350;;;;:::o;22237:474::-;22305:6;22313;22362:2;22350:9;22341:7;22337:23;22333:32;22330:119;;;22368:79;;:::i;:::-;22330:119;22488:1;22513:53;22558:7;22549:6;22538:9;22534:22;22513:53;:::i;:::-;22503:63;;22459:117;22615:2;22641:53;22686:7;22677:6;22666:9;22662:22;22641:53;:::i;:::-;22631:63;;22586:118;22237:474;;;;;:::o;22717:167::-;22857:19;22853:1;22845:6;22841:14;22834:43;22717:167;:::o;22890:366::-;23032:3;23053:67;23117:2;23112:3;23053:67;:::i;:::-;23046:74;;23129:93;23218:3;23129:93;:::i;:::-;23247:2;23242:3;23238:12;23231:19;;22890:366;;;:::o;23262:419::-;23428:4;23466:2;23455:9;23451:18;23443:26;;23515:9;23509:4;23505:20;23501:1;23490:9;23486:17;23479:47;23543:131;23669:4;23543:131;:::i;:::-;23535:139;;23262:419;;;:::o;23687:180::-;23735:77;23732:1;23725:88;23832:4;23829:1;23822:15;23856:4;23853:1;23846:15;23873:305;23913:3;23932:20;23950:1;23932:20;:::i;:::-;23927:25;;23966:20;23984:1;23966:20;:::i;:::-;23961:25;;24120:1;24052:66;24048:74;24045:1;24042:81;24039:107;;;24126:18;;:::i;:::-;24039:107;24170:1;24167;24163:9;24156:16;;23873:305;;;;:::o;24184:164::-;24324:16;24320:1;24312:6;24308:14;24301:40;24184:164;:::o;24354:366::-;24496:3;24517:67;24581:2;24576:3;24517:67;:::i;:::-;24510:74;;24593:93;24682:3;24593:93;:::i;:::-;24711:2;24706:3;24702:12;24695:19;;24354:366;;;:::o;24726:419::-;24892:4;24930:2;24919:9;24915:18;24907:26;;24979:9;24973:4;24969:20;24965:1;24954:9;24950:17;24943:47;25007:131;25133:4;25007:131;:::i;:::-;24999:139;;24726:419;;;:::o;25151:167::-;25291:19;25287:1;25279:6;25275:14;25268:43;25151:167;:::o;25324:366::-;25466:3;25487:67;25551:2;25546:3;25487:67;:::i;:::-;25480:74;;25563:93;25652:3;25563:93;:::i;:::-;25681:2;25676:3;25672:12;25665:19;;25324:366;;;:::o;25696:419::-;25862:4;25900:2;25889:9;25885:18;25877:26;;25949:9;25943:4;25939:20;25935:1;25924:9;25920:17;25913:47;25977:131;26103:4;25977:131;:::i;:::-;25969:139;;25696:419;;;:::o;26121:191::-;26161:4;26181:20;26199:1;26181:20;:::i;:::-;26176:25;;26215:20;26233:1;26215:20;:::i;:::-;26210:25;;26254:1;26251;26248:8;26245:34;;;26259:18;;:::i;:::-;26245:34;26304:1;26301;26297:9;26289:17;;26121:191;;;;:::o;26318:348::-;26358:7;26381:20;26399:1;26381:20;:::i;:::-;26376:25;;26415:20;26433:1;26415:20;:::i;:::-;26410:25;;26603:1;26535:66;26531:74;26528:1;26525:81;26520:1;26513:9;26506:17;26502:105;26499:131;;;26610:18;;:::i;:::-;26499:131;26658:1;26655;26651:9;26640:20;;26318:348;;;;:::o;26672:173::-;26812:25;26808:1;26800:6;26796:14;26789:49;26672:173;:::o;26851:366::-;26993:3;27014:67;27078:2;27073:3;27014:67;:::i;:::-;27007:74;;27090:93;27179:3;27090:93;:::i;:::-;27208:2;27203:3;27199:12;27192:19;;26851:366;;;:::o;27223:419::-;27389:4;27427:2;27416:9;27412:18;27404:26;;27476:9;27470:4;27466:20;27462:1;27451:9;27447:17;27440:47;27504:131;27630:4;27504:131;:::i;:::-;27496:139;;27223:419;;;:::o;27648:180::-;27696:77;27693:1;27686:88;27793:4;27790:1;27783:15;27817:4;27814:1;27807:15;27834:320;27878:6;27915:1;27909:4;27905:12;27895:22;;27962:1;27956:4;27952:12;27983:18;27973:81;;28039:4;28031:6;28027:17;28017:27;;27973:81;28101:2;28093:6;28090:14;28070:18;28067:38;28064:84;;28120:18;;:::i;:::-;28064:84;27885:269;27834:320;;;:::o;28160:182::-;28300:34;28296:1;28288:6;28284:14;28277:58;28160:182;:::o;28348:366::-;28490:3;28511:67;28575:2;28570:3;28511:67;:::i;:::-;28504:74;;28587:93;28676:3;28587:93;:::i;:::-;28705:2;28700:3;28696:12;28689:19;;28348:366;;;:::o;28720:419::-;28886:4;28924:2;28913:9;28909:18;28901:26;;28973:9;28967:4;28963:20;28959:1;28948:9;28944:17;28937:47;29001:131;29127:4;29001:131;:::i;:::-;28993:139;;28720:419;;;:::o;29145:168::-;29285:20;29281:1;29273:6;29269:14;29262:44;29145:168;:::o;29319:366::-;29461:3;29482:67;29546:2;29541:3;29482:67;:::i;:::-;29475:74;;29558:93;29647:3;29558:93;:::i;:::-;29676:2;29671:3;29667:12;29660:19;;29319:366;;;:::o;29691:419::-;29857:4;29895:2;29884:9;29880:18;29872:26;;29944:9;29938:4;29934:20;29930:1;29919:9;29915:17;29908:47;29972:131;30098:4;29972:131;:::i;:::-;29964:139;;29691:419;;;:::o;30116:180::-;30164:77;30161:1;30154:88;30261:4;30258:1;30251:15;30285:4;30282:1;30275:15;30302:233;30341:3;30364:24;30382:5;30364:24;:::i;:::-;30355:33;;30410:66;30403:5;30400:77;30397:103;;30480:18;;:::i;:::-;30397:103;30527:1;30520:5;30516:13;30509:20;;30302:233;;;:::o;30541:171::-;30681:23;30677:1;30669:6;30665:14;30658:47;30541:171;:::o;30718:366::-;30860:3;30881:67;30945:2;30940:3;30881:67;:::i;:::-;30874:74;;30957:93;31046:3;30957:93;:::i;:::-;31075:2;31070:3;31066:12;31059:19;;30718:366;;;:::o;31090:419::-;31256:4;31294:2;31283:9;31279:18;31271:26;;31343:9;31337:4;31333:20;31329:1;31318:9;31314:17;31307:47;31371:131;31497:4;31371:131;:::i;:::-;31363:139;;31090:419;;;:::o;31515:97::-;31574:6;31602:3;31592:13;;31515:97;;;;:::o;31618:141::-;31667:4;31690:3;31682:11;;31713:3;31710:1;31703:14;31747:4;31744:1;31734:18;31726:26;;31618:141;;;:::o;31765:93::-;31802:6;31849:2;31844;31837:5;31833:14;31829:23;31819:33;;31765:93;;;:::o;31864:107::-;31908:8;31958:5;31952:4;31948:16;31927:37;;31864:107;;;;:::o;31977:393::-;32046:6;32096:1;32084:10;32080:18;32119:97;32149:66;32138:9;32119:97;:::i;:::-;32237:39;32267:8;32256:9;32237:39;:::i;:::-;32225:51;;32309:4;32305:9;32298:5;32294:21;32285:30;;32358:4;32348:8;32344:19;32337:5;32334:30;32324:40;;32053:317;;31977:393;;;;;:::o;32376:60::-;32404:3;32425:5;32418:12;;32376:60;;;:::o;32442:142::-;32492:9;32525:53;32543:34;32552:24;32570:5;32552:24;:::i;:::-;32543:34;:::i;:::-;32525:53;:::i;:::-;32512:66;;32442:142;;;:::o;32590:75::-;32633:3;32654:5;32647:12;;32590:75;;;:::o;32671:269::-;32781:39;32812:7;32781:39;:::i;:::-;32842:91;32891:41;32915:16;32891:41;:::i;:::-;32883:6;32876:4;32870:11;32842:91;:::i;:::-;32836:4;32829:105;32747:193;32671:269;;;:::o;32946:73::-;32991:3;32946:73;:::o;33025:189::-;33102:32;;:::i;:::-;33143:65;33201:6;33193;33187:4;33143:65;:::i;:::-;33078:136;33025:189;;:::o;33220:186::-;33280:120;33297:3;33290:5;33287:14;33280:120;;;33351:39;33388:1;33381:5;33351:39;:::i;:::-;33324:1;33317:5;33313:13;33304:22;;33280:120;;;33220:186;;:::o;33412:543::-;33513:2;33508:3;33505:11;33502:446;;;33547:38;33579:5;33547:38;:::i;:::-;33631:29;33649:10;33631:29;:::i;:::-;33621:8;33617:44;33814:2;33802:10;33799:18;33796:49;;;33835:8;33820:23;;33796:49;33858:80;33914:22;33932:3;33914:22;:::i;:::-;33904:8;33900:37;33887:11;33858:80;:::i;:::-;33517:431;;33502:446;33412:543;;;:::o;33961:117::-;34015:8;34065:5;34059:4;34055:16;34034:37;;33961:117;;;;:::o;34084:169::-;34128:6;34161:51;34209:1;34205:6;34197:5;34194:1;34190:13;34161:51;:::i;:::-;34157:56;34242:4;34236;34232:15;34222:25;;34135:118;34084:169;;;;:::o;34258:295::-;34334:4;34480:29;34505:3;34499:4;34480:29;:::i;:::-;34472:37;;34542:3;34539:1;34535:11;34529:4;34526:21;34518:29;;34258:295;;;;:::o;34558:1403::-;34682:44;34722:3;34717;34682:44;:::i;:::-;34791:18;34783:6;34780:30;34777:56;;;34813:18;;:::i;:::-;34777:56;34857:38;34889:4;34883:11;34857:38;:::i;:::-;34942:67;35002:6;34994;34988:4;34942:67;:::i;:::-;35036:1;35065:2;35057:6;35054:14;35082:1;35077:632;;;;35753:1;35770:6;35767:84;;;35826:9;35821:3;35817:19;35804:33;35795:42;;35767:84;35877:67;35937:6;35930:5;35877:67;:::i;:::-;35871:4;35864:81;35726:229;35047:908;;35077:632;35129:4;35125:9;35117:6;35113:22;35163:37;35195:4;35163:37;:::i;:::-;35222:1;35236:215;35250:7;35247:1;35244:14;35236:215;;;35336:9;35331:3;35327:19;35314:33;35306:6;35299:49;35387:1;35379:6;35375:14;35365:24;;35434:2;35423:9;35419:18;35406:31;;35273:4;35270:1;35266:12;35261:17;;35236:215;;;35479:6;35470:7;35467:19;35464:186;;;35544:9;35539:3;35535:19;35522:33;35587:48;35629:4;35621:6;35617:17;35606:9;35587:48;:::i;:::-;35579:6;35572:64;35487:163;35464:186;35696:1;35692;35684:6;35680:14;35676:22;35670:4;35663:36;35084:625;;;35047:908;;34657:1304;;;34558:1403;;;:::o;35967:148::-;36069:11;36106:3;36091:18;;35967:148;;;;:::o;36121:377::-;36227:3;36255:39;36288:5;36255:39;:::i;:::-;36310:89;36392:6;36387:3;36310:89;:::i;:::-;36303:96;;36408:52;36453:6;36448:3;36441:4;36434:5;36430:16;36408:52;:::i;:::-;36485:6;36480:3;36476:16;36469:23;;36231:267;36121:377;;;;:::o;36504:435::-;36684:3;36706:95;36797:3;36788:6;36706:95;:::i;:::-;36699:102;;36818:95;36909:3;36900:6;36818:95;:::i;:::-;36811:102;;36930:3;36923:10;;36504:435;;;;;:::o;36945:125::-;37011:7;37040:24;37058:5;37040:24;:::i;:::-;37029:35;;36945:125;;;:::o;37076:180::-;37178:53;37225:5;37178:53;:::i;:::-;37171:5;37168:64;37158:92;;37246:1;37243;37236:12;37158:92;37076:180;:::o;37262:201::-;37348:5;37379:6;37373:13;37364:22;;37395:62;37451:5;37395:62;:::i;:::-;37262:201;;;;:::o;37469:409::-;37568:6;37617:2;37605:9;37596:7;37592:23;37588:32;37585:119;;;37623:79;;:::i;:::-;37585:119;37743:1;37768:93;37853:7;37844:6;37833:9;37829:22;37768:93;:::i;:::-;37758:103;;37714:157;37469:409;;;;:::o;37884:225::-;38024:34;38020:1;38012:6;38008:14;38001:58;38093:8;38088:2;38080:6;38076:15;38069:33;37884:225;:::o;38115:366::-;38257:3;38278:67;38342:2;38337:3;38278:67;:::i;:::-;38271:74;;38354:93;38443:3;38354:93;:::i;:::-;38472:2;38467:3;38463:12;38456:19;;38115:366;;;:::o;38487:419::-;38653:4;38691:2;38680:9;38676:18;38668:26;;38740:9;38734:4;38730:20;38726:1;38715:9;38711:17;38704:47;38768:131;38894:4;38768:131;:::i;:::-;38760:139;;38487:419;;;:::o;38912:98::-;38963:6;38997:5;38991:12;38981:22;;38912:98;;;:::o;39016:168::-;39099:11;39133:6;39128:3;39121:19;39173:4;39168:3;39164:14;39149:29;;39016:168;;;;:::o;39190:360::-;39276:3;39304:38;39336:5;39304:38;:::i;:::-;39358:70;39421:6;39416:3;39358:70;:::i;:::-;39351:77;;39437:52;39482:6;39477:3;39470:4;39463:5;39459:16;39437:52;:::i;:::-;39514:29;39536:6;39514:29;:::i;:::-;39509:3;39505:39;39498:46;;39280:270;39190:360;;;;:::o;39556:640::-;39751:4;39789:3;39778:9;39774:19;39766:27;;39803:71;39871:1;39860:9;39856:17;39847:6;39803:71;:::i;:::-;39884:72;39952:2;39941:9;39937:18;39928:6;39884:72;:::i;:::-;39966;40034:2;40023:9;40019:18;40010:6;39966:72;:::i;:::-;40085:9;40079:4;40075:20;40070:2;40059:9;40055:18;40048:48;40113:76;40184:4;40175:6;40113:76;:::i;:::-;40105:84;;39556:640;;;;;;;:::o;40202:141::-;40258:5;40289:6;40283:13;40274:22;;40305:32;40331:5;40305:32;:::i;:::-;40202:141;;;;:::o;40349:349::-;40418:6;40467:2;40455:9;40446:7;40442:23;40438:32;40435:119;;;40473:79;;:::i;:::-;40435:119;40593:1;40618:63;40673:7;40664:6;40653:9;40649:22;40618:63;:::i;:::-;40608:73;;40564:127;40349:349;;;;:::o

Swarm Source

ipfs://12e4f6f52ff41829cd2353bf4bcf77263b591811dbd1b13dffd613299122e125
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.