ETH Price: $3,486.03 (+4.57%)

Token

BastardBugz.Wtf (BZZZ)
 

Overview

Max Total Supply

3,333 BZZZ

Holders

507

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 BZZZ
0x5df3855d94419569c2941861e4b2b328fdfceec3
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:
BastardBugz

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity Multiple files format)

File 2 of 11: BastardBugz.sol
// SPDX-License-Identifier: Unlicensed

import './ReentrancyGuard.sol';
import './Ownable.sol';
import './Arrays.sol';
import './Strings.sol';
import './ERC721AQueryable.sol';
import './ERC721A.sol';


pragma solidity >=0.8.13 <0.9.0;

contract BastardBugz is ERC721A, Ownable, ReentrancyGuard {

  using Strings for uint256;

  string public uri;
  string public uriSuffix = ".json";
  uint256 public cost1 = 0 ether;
  uint256 public cost2 = 0.01 ether;
  uint256 public supplyLimit = 3333;
  uint256 public maxMintAmountPerTx = 3;
  uint256 public maxLimitPerWallet = 3;
  uint256 public maxMintAmountPerTxPaid = 20;
  bool public sale = false;
 

  constructor(
  ) ERC721A("BastardBugz.Wtf", "BZZZ")  {
  }

  
  function Mint(uint256 _mintAmount) public payable {
    //Dynamic Price
    uint256 supply = totalSupply();
    require(sale, 'The Sale is paused!');
    require(supply + _mintAmount <= supplyLimit - 2333, 'Max free supply exceeded!');
    require(balanceOf(msg.sender) + _mintAmount <= maxLimitPerWallet, 'Max mint per wallet exceeded!');
    require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, 'Invalid mint amount!');
    require(msg.value >= cost1 * _mintAmount, 'Insufficient funds!');
      
    // Mint
      _safeMint(_msgSender(), _mintAmount);
    

  }  

  function MintPaid(uint256 _mintAmount) public payable {
    //Dynamic Price
    uint256 supply = totalSupply();
    require(sale, 'The Sale is paused!');
    require(supply + _mintAmount <= supplyLimit, 'Sold out!');
    require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTxPaid, 'Invalid mint amount!');
    require(msg.value >= cost2 * _mintAmount, 'Insufficient funds!');
      
    // Mint
     _safeMint(_msgSender(), _mintAmount);
  }  



  function Airdrop(uint256 _mintAmount, address _receiver) public onlyOwner {
    require(totalSupply() + _mintAmount <= supplyLimit, 'Max supply exceeded!');
    _safeMint(_receiver, _mintAmount);
  }

// ================== Mint Functions End =======================  

// ================== Set Functions Start =======================


// uri
  function seturi(string memory _uri) public onlyOwner {
    uri = _uri;
  }

// sales toggle
  function setSaleStatus(bool _sale) public onlyOwner {
    sale = _sale;
  }



// set new price
  function setNewPrice(uint256 _cost2) public onlyOwner {
    cost2 = _cost2;
  }  

// ================== Set Functions End =======================

// ================== Withdraw Function Start =======================
  
  function withdraw() public onlyOwner nonReentrant {
    //owner withdraw
    (bool os, ) = payable(owner()).call{value: address(this).balance}('');
    require(os);
  }

// ================== Withdraw Function End=======================  

// ================== Read Functions Start =======================
 
function tokensOfOwner(address owner) external view returns (uint256[] memory) {
    unchecked {
        uint256[] memory a = new uint256[](balanceOf(owner)); 
        uint256 end = _nextTokenId();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;
        for (uint256 i; i < end; i++) {
            TokenOwnership memory ownership = _ownershipAt(i);
            if (ownership.burned) {
                continue;
            }
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                a[tokenIdsIdx++] = i;
            }
        }
        return a;    
    }
}

  function _startTokenId() internal view virtual override returns (uint256) {
    return 1;
  }

  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
    require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token');

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
        : '';
  }

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

// ================== Read Functions End =======================  

}

File 1 of 11: Arrays.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Arrays.sol)

pragma solidity ^0.8.0;

import "./Math.sol";

/**
 * @dev Collection of functions related to array types.
 */
library Arrays {
    /**
     * @dev Searches a sorted `array` and returns the first index that contains
     * a value greater or equal to `element`. If no such index exists (i.e. all
     * values in the array are strictly less than `element`), the array length is
     * returned. Time complexity O(log n).
     *
     * `array` is expected to be sorted in ascending order, and to contain no
     * repeated elements.
     */
    function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) {
        if (array.length == 0) {
            return 0;
        }

        uint256 low = 0;
        uint256 high = array.length;

        while (low < high) {
            uint256 mid = Math.average(low, high);

            // Note that mid will always be strictly less than high (i.e. it will be a valid array index)
            // because Math.average rounds down (it does integer division with truncation).
            if (array[mid] > element) {
                high = mid;
            } else {
                low = mid + 1;
            }
        }

        // At this point `low` is the exclusive upper bound. We will return the inclusive upper bound.
        if (low > 0 && array[low - 1] == element) {
            return low - 1;
        } else {
            return low;
        }
    }
}

File 3 of 11: 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 4 of 11: ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.1.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 bit position of `extraData` in packed ownership.
    uint256 private constant BITPOS_EXTRA_DATA = 232;

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 5 of 11: ERC721AQueryable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.1.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`
     *   - `extraData` = `0`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *   - `extraData` = `<Extra data when token was burned>`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     *   - `extraData` = `<Extra data at start of ownership>`
     */
    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 6 of 11: IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.1.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();

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

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

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

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

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

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

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

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

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

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

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

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`.
        uint24 extraData;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 7 of 11: IERC721AQueryable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.1.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 8 of 11: Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a / b + (a % b == 0 ? 0 : 1);
    }
}

File 9 of 11: 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);
    }
}

File 10 of 11: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

File 11 of 11: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"Airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"MintPaid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost2","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":"maxLimitPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTxPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"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":[],"name":"sale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost2","type":"uint256"}],"name":"setNewPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_sale","type":"bool"}],"name":"setSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"seturi","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supplyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"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":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600b90816200004a9190620004c0565b506000600c55662386f26fc10000600d55610d05600e556003600f55600360105560146011556000601260006101000a81548160ff0219169083151502179055503480156200009857600080fd5b506040518060400160405280600f81526020017f426173746172644275677a2e57746600000000000000000000000000000000008152506040518060400160405280600481526020017f425a5a5a000000000000000000000000000000000000000000000000000000008152508160029081620001169190620004c0565b508060039081620001289190620004c0565b50620001396200016f60201b60201c565b600081905550505062000161620001556200017860201b60201c565b6200018060201b60201c565b6001600981905550620005a7565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002c857607f821691505b602082108103620002de57620002dd62000280565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003487fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000309565b62000354868362000309565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003a16200039b62000395846200036c565b62000376565b6200036c565b9050919050565b6000819050919050565b620003bd8362000380565b620003d5620003cc82620003a8565b84845462000316565b825550505050565b600090565b620003ec620003dd565b620003f9818484620003b2565b505050565b5b81811015620004215762000415600082620003e2565b600181019050620003ff565b5050565b601f82111562000470576200043a81620002e4565b6200044584620002f9565b8101602085101562000455578190505b6200046d6200046485620002f9565b830182620003fe565b50505b505050565b600082821c905092915050565b6000620004956000198460080262000475565b1980831691505092915050565b6000620004b0838362000482565b9150826002028217905092915050565b620004cb8262000246565b67ffffffffffffffff811115620004e757620004e662000251565b5b620004f38254620002af565b6200050082828562000425565b600060209050601f83116001811462000538576000841562000523578287015190505b6200052f8582620004a2565b8655506200059f565b601f1984166200054886620002e4565b60005b8281101562000572578489015182556001820191506020850194506020810190506200054b565b868310156200059257848901516200058e601f89168262000482565b8355505b6001600288020188555050505b505050505050565b613bff80620005b76000396000f3fe6080604052600436106101f95760003560e01c80637871e1541161010d578063b88d4fde116100a0578063e985e9c51161006f578063e985e9c5146106f5578063eac989f814610732578063ee8cdd4e1461075d578063f2fde38b14610786578063f6484980146107af576101f9565b8063b88d4fde1461063b578063ba8b297414610664578063c87b56dd1461068f578063d897833e146106cc576101f9565b806394354fd0116100dc57806394354fd01461059157806395d89b41146105bc5780639a1b2885146105e7578063a22cb46514610612576101f9565b80637871e154146104e45780637d48b5681461050d5780638462151c146105295780638da5cb5b14610566576101f9565b806333573dc2116101905780635a0b8b231161015f5780635a0b8b23146103fd5780636352211e146104285780636ad1fe021461046557806370a0823114610490578063715018a6146104cd576101f9565b806333573dc2146103675780633ccfd60b1461039257806342842e0e146103a95780635503a0e8146103d2576101f9565b8063095ea7b3116101cc578063095ea7b3146102bf57806318160ddd146102e857806319d1997a1461031357806323b872dd1461033e576101f9565b806301ffc9a7146101fe57806306fdde031461023b5780630788370314610266578063081812fc14610282575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190612839565b6107d8565b6040516102329190612881565b60405180910390f35b34801561024757600080fd5b5061025061086a565b60405161025d9190612935565b60405180910390f35b610280600480360381019061027b919061298d565b6108fc565b005b34801561028e57600080fd5b506102a960048036038101906102a4919061298d565b610ac2565b6040516102b691906129fb565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190612a42565b610b3e565b005b3480156102f457600080fd5b506102fd610c7f565b60405161030a9190612a91565b60405180910390f35b34801561031f57600080fd5b50610328610c96565b6040516103359190612a91565b60405180910390f35b34801561034a57600080fd5b5061036560048036038101906103609190612aac565b610c9c565b005b34801561037357600080fd5b5061037c610fbe565b6040516103899190612a91565b60405180910390f35b34801561039e57600080fd5b506103a7610fc4565b005b3480156103b557600080fd5b506103d060048036038101906103cb9190612aac565b611115565b005b3480156103de57600080fd5b506103e7611135565b6040516103f49190612935565b60405180910390f35b34801561040957600080fd5b506104126111c3565b60405161041f9190612a91565b60405180910390f35b34801561043457600080fd5b5061044f600480360381019061044a919061298d565b6111c9565b60405161045c91906129fb565b60405180910390f35b34801561047157600080fd5b5061047a6111db565b6040516104879190612881565b60405180910390f35b34801561049c57600080fd5b506104b760048036038101906104b29190612aff565b6111ee565b6040516104c49190612a91565b60405180910390f35b3480156104d957600080fd5b506104e26112a6565b005b3480156104f057600080fd5b5061050b60048036038101906105069190612b2c565b61132e565b005b6105276004803603810190610522919061298d565b61140f565b005b34801561053557600080fd5b50610550600480360381019061054b9190612aff565b611570565b60405161055d9190612c2a565b60405180910390f35b34801561057257600080fd5b5061057b6116b4565b60405161058891906129fb565b60405180910390f35b34801561059d57600080fd5b506105a66116de565b6040516105b39190612a91565b60405180910390f35b3480156105c857600080fd5b506105d16116e4565b6040516105de9190612935565b60405180910390f35b3480156105f357600080fd5b506105fc611776565b6040516106099190612a91565b60405180910390f35b34801561061e57600080fd5b5061063960048036038101906106349190612c78565b61177c565b005b34801561064757600080fd5b50610662600480360381019061065d9190612ded565b6118f3565b005b34801561067057600080fd5b50610679611966565b6040516106869190612a91565b60405180910390f35b34801561069b57600080fd5b506106b660048036038101906106b1919061298d565b61196c565b6040516106c39190612935565b60405180910390f35b3480156106d857600080fd5b506106f360048036038101906106ee9190612e70565b611a16565b005b34801561070157600080fd5b5061071c60048036038101906107179190612e9d565b611aaf565b6040516107299190612881565b60405180910390f35b34801561073e57600080fd5b50610747611b43565b6040516107549190612935565b60405180910390f35b34801561076957600080fd5b50610784600480360381019061077f919061298d565b611bd1565b005b34801561079257600080fd5b506107ad60048036038101906107a89190612aff565b611c57565b005b3480156107bb57600080fd5b506107d660048036038101906107d19190612f7e565b611d4e565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061083357506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108635750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461087990612ff6565b80601f01602080910402602001604051908101604052809291908181526020018280546108a590612ff6565b80156108f25780601f106108c7576101008083540402835291602001916108f2565b820191906000526020600020905b8154815290600101906020018083116108d557829003601f168201915b5050505050905090565b6000610906610c7f565b9050601260009054906101000a900460ff16610957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094e90613073565b60405180910390fd5b61091d600e5461096791906130c2565b828261097391906130f6565b11156109b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ab90613198565b60405180910390fd5b601054826109c1336111ee565b6109cb91906130f6565b1115610a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0390613204565b60405180910390fd5b600082118015610a1e5750600f548211155b610a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5490613270565b60405180910390fd5b81600c54610a6b9190613290565b341015610aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa490613336565b60405180910390fd5b610abe610ab8611ddd565b83611de5565b5050565b6000610acd82611e03565b610b03576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b49826111c9565b90508073ffffffffffffffffffffffffffffffffffffffff16610b6a611e62565b73ffffffffffffffffffffffffffffffffffffffff1614610bcd57610b9681610b91611e62565b611aaf565b610bcc576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610c89611e6a565b6001546000540303905090565b600e5481565b6000610ca782611e73565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d0e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d1a84611f3f565b91509150610d308187610d2b611e62565b611f61565b610d7c57610d4586610d40611e62565b611aaf565b610d7b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610de2576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610def8686866001611fa5565b8015610dfa57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610ec885610ea4888887611fab565b7c020000000000000000000000000000000000000000000000000000000017611fd3565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610f4e5760006001850190506000600460008381526020019081526020016000205403610f4c576000548114610f4b578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610fb68686866001611ffe565b505050505050565b600c5481565b610fcc611ddd565b73ffffffffffffffffffffffffffffffffffffffff16610fea6116b4565b73ffffffffffffffffffffffffffffffffffffffff1614611040576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611037906133a2565b60405180910390fd5b600260095403611085576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107c9061340e565b60405180910390fd5b600260098190555060006110976116b4565b73ffffffffffffffffffffffffffffffffffffffff16476040516110ba9061345f565b60006040518083038185875af1925050503d80600081146110f7576040519150601f19603f3d011682016040523d82523d6000602084013e6110fc565b606091505b505090508061110a57600080fd5b506001600981905550565b611130838383604051806020016040528060008152506118f3565b505050565b600b805461114290612ff6565b80601f016020809104026020016040519081016040528092919081815260200182805461116e90612ff6565b80156111bb5780601f10611190576101008083540402835291602001916111bb565b820191906000526020600020905b81548152906001019060200180831161119e57829003601f168201915b505050505081565b60105481565b60006111d482611e73565b9050919050565b601260009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611255576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6112ae611ddd565b73ffffffffffffffffffffffffffffffffffffffff166112cc6116b4565b73ffffffffffffffffffffffffffffffffffffffff1614611322576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611319906133a2565b60405180910390fd5b61132c6000612004565b565b611336611ddd565b73ffffffffffffffffffffffffffffffffffffffff166113546116b4565b73ffffffffffffffffffffffffffffffffffffffff16146113aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a1906133a2565b60405180910390fd5b600e54826113b6610c7f565b6113c091906130f6565b1115611401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f8906134c0565b60405180910390fd5b61140b8183611de5565b5050565b6000611419610c7f565b9050601260009054906101000a900460ff1661146a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146190613073565b60405180910390fd5b600e54828261147991906130f6565b11156114ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b19061352c565b60405180910390fd5b6000821180156114cc57506011548211155b61150b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150290613270565b60405180910390fd5b81600d546115199190613290565b34101561155b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155290613336565b60405180910390fd5b61156c611566611ddd565b83611de5565b5050565b6060600061157d836111ee565b67ffffffffffffffff81111561159657611595612cc2565b5b6040519080825280602002602001820160405280156115c45781602001602082028036833780820191505090505b50905060006115d16120ca565b905060008060005b838110156116a75760006115ec826120d3565b90508060400151156115fe575061169a565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461163e57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611698578186858060010196508151811061168b5761168a61354c565b5b6020026020010181815250505b505b80806001019150506115d9565b5083945050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f5481565b6060600380546116f390612ff6565b80601f016020809104026020016040519081016040528092919081815260200182805461171f90612ff6565b801561176c5780601f106117415761010080835404028352916020019161176c565b820191906000526020600020905b81548152906001019060200180831161174f57829003601f168201915b5050505050905090565b600d5481565b611784611e62565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117e8576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006117f5611e62565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118a2611e62565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118e79190612881565b60405180910390a35050565b6118fe848484610c9c565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461196057611929848484846120fe565b61195f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60115481565b606061197782611e03565b6119b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ad906135ed565b60405180910390fd5b60006119c061224e565b905060008151116119e05760405180602001604052806000815250611a0e565b806119ea846122e0565b600b6040516020016119fe939291906136e1565b6040516020818303038152906040525b915050919050565b611a1e611ddd565b73ffffffffffffffffffffffffffffffffffffffff16611a3c6116b4565b73ffffffffffffffffffffffffffffffffffffffff1614611a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a89906133a2565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a8054611b5090612ff6565b80601f0160208091040260200160405190810160405280929190818152602001828054611b7c90612ff6565b8015611bc95780601f10611b9e57610100808354040283529160200191611bc9565b820191906000526020600020905b815481529060010190602001808311611bac57829003601f168201915b505050505081565b611bd9611ddd565b73ffffffffffffffffffffffffffffffffffffffff16611bf76116b4565b73ffffffffffffffffffffffffffffffffffffffff1614611c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c44906133a2565b60405180910390fd5b80600d8190555050565b611c5f611ddd565b73ffffffffffffffffffffffffffffffffffffffff16611c7d6116b4565b73ffffffffffffffffffffffffffffffffffffffff1614611cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cca906133a2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3990613784565b60405180910390fd5b611d4b81612004565b50565b611d56611ddd565b73ffffffffffffffffffffffffffffffffffffffff16611d746116b4565b73ffffffffffffffffffffffffffffffffffffffff1614611dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc1906133a2565b60405180910390fd5b80600a9081611dd9919061393b565b5050565b600033905090565b611dff828260405180602001604052806000815250612440565b5050565b600081611e0e611e6a565b11158015611e1d575060005482105b8015611e5b575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080611e82611e6a565b11611f0857600054811015611f075760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611f05575b60008103611efb576004600083600190039350838152602001908152602001600020549050611ed1565b8092505050611f3a565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611fc28686846124dd565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008054905090565b6120db61277e565b6120f760046000848152602001908152602001600020546124e6565b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612124611e62565b8786866040518563ffffffff1660e01b81526004016121469493929190613a62565b6020604051808303816000875af192505050801561218257506040513d601f19601f8201168201806040525081019061217f9190613ac3565b60015b6121fb573d80600081146121b2576040519150601f19603f3d011682016040523d82523d6000602084013e6121b7565b606091505b5060008151036121f3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a805461225d90612ff6565b80601f016020809104026020016040519081016040528092919081815260200182805461228990612ff6565b80156122d65780601f106122ab576101008083540402835291602001916122d6565b820191906000526020600020905b8154815290600101906020018083116122b957829003601f168201915b5050505050905090565b606060008203612327576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061243b565b600082905060005b6000821461235957808061234290613af0565b915050600a826123529190613b67565b915061232f565b60008167ffffffffffffffff81111561237557612374612cc2565b5b6040519080825280601f01601f1916602001820160405280156123a75781602001600182028036833780820191505090505b5090505b60008514612434576001826123c091906130c2565b9150600a856123cf9190613b98565b60306123db91906130f6565b60f81b8183815181106123f1576123f061354c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561242d9190613b67565b94506123ab565b8093505050505b919050565b61244a838361259c565b60008373ffffffffffffffffffffffffffffffffffffffff163b146124d857600080549050600083820390505b61248a60008683806001019450866120fe565b6124c0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106124775781600054146124d557600080fd5b50505b505050565b60009392505050565b6124ee61277e565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612608576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203612642576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61264f6000848385611fa5565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506126c6836126b76000866000611fab565b6126c08561276e565b17611fd3565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106126ea578060008190555050506127696000848385611ffe565b505050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612816816127e1565b811461282157600080fd5b50565b6000813590506128338161280d565b92915050565b60006020828403121561284f5761284e6127d7565b5b600061285d84828501612824565b91505092915050565b60008115159050919050565b61287b81612866565b82525050565b60006020820190506128966000830184612872565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156128d65780820151818401526020810190506128bb565b838111156128e5576000848401525b50505050565b6000601f19601f8301169050919050565b60006129078261289c565b61291181856128a7565b93506129218185602086016128b8565b61292a816128eb565b840191505092915050565b6000602082019050818103600083015261294f81846128fc565b905092915050565b6000819050919050565b61296a81612957565b811461297557600080fd5b50565b60008135905061298781612961565b92915050565b6000602082840312156129a3576129a26127d7565b5b60006129b184828501612978565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129e5826129ba565b9050919050565b6129f5816129da565b82525050565b6000602082019050612a1060008301846129ec565b92915050565b612a1f816129da565b8114612a2a57600080fd5b50565b600081359050612a3c81612a16565b92915050565b60008060408385031215612a5957612a586127d7565b5b6000612a6785828601612a2d565b9250506020612a7885828601612978565b9150509250929050565b612a8b81612957565b82525050565b6000602082019050612aa66000830184612a82565b92915050565b600080600060608486031215612ac557612ac46127d7565b5b6000612ad386828701612a2d565b9350506020612ae486828701612a2d565b9250506040612af586828701612978565b9150509250925092565b600060208284031215612b1557612b146127d7565b5b6000612b2384828501612a2d565b91505092915050565b60008060408385031215612b4357612b426127d7565b5b6000612b5185828601612978565b9250506020612b6285828601612a2d565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612ba181612957565b82525050565b6000612bb38383612b98565b60208301905092915050565b6000602082019050919050565b6000612bd782612b6c565b612be18185612b77565b9350612bec83612b88565b8060005b83811015612c1d578151612c048882612ba7565b9750612c0f83612bbf565b925050600181019050612bf0565b5085935050505092915050565b60006020820190508181036000830152612c448184612bcc565b905092915050565b612c5581612866565b8114612c6057600080fd5b50565b600081359050612c7281612c4c565b92915050565b60008060408385031215612c8f57612c8e6127d7565b5b6000612c9d85828601612a2d565b9250506020612cae85828601612c63565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612cfa826128eb565b810181811067ffffffffffffffff82111715612d1957612d18612cc2565b5b80604052505050565b6000612d2c6127cd565b9050612d388282612cf1565b919050565b600067ffffffffffffffff821115612d5857612d57612cc2565b5b612d61826128eb565b9050602081019050919050565b82818337600083830152505050565b6000612d90612d8b84612d3d565b612d22565b905082815260208101848484011115612dac57612dab612cbd565b5b612db7848285612d6e565b509392505050565b600082601f830112612dd457612dd3612cb8565b5b8135612de4848260208601612d7d565b91505092915050565b60008060008060808587031215612e0757612e066127d7565b5b6000612e1587828801612a2d565b9450506020612e2687828801612a2d565b9350506040612e3787828801612978565b925050606085013567ffffffffffffffff811115612e5857612e576127dc565b5b612e6487828801612dbf565b91505092959194509250565b600060208284031215612e8657612e856127d7565b5b6000612e9484828501612c63565b91505092915050565b60008060408385031215612eb457612eb36127d7565b5b6000612ec285828601612a2d565b9250506020612ed385828601612a2d565b9150509250929050565b600067ffffffffffffffff821115612ef857612ef7612cc2565b5b612f01826128eb565b9050602081019050919050565b6000612f21612f1c84612edd565b612d22565b905082815260208101848484011115612f3d57612f3c612cbd565b5b612f48848285612d6e565b509392505050565b600082601f830112612f6557612f64612cb8565b5b8135612f75848260208601612f0e565b91505092915050565b600060208284031215612f9457612f936127d7565b5b600082013567ffffffffffffffff811115612fb257612fb16127dc565b5b612fbe84828501612f50565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061300e57607f821691505b60208210810361302157613020612fc7565b5b50919050565b7f5468652053616c65206973207061757365642100000000000000000000000000600082015250565b600061305d6013836128a7565b915061306882613027565b602082019050919050565b6000602082019050818103600083015261308c81613050565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006130cd82612957565b91506130d883612957565b9250828210156130eb576130ea613093565b5b828203905092915050565b600061310182612957565b915061310c83612957565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561314157613140613093565b5b828201905092915050565b7f4d6178206672656520737570706c792065786365656465642100000000000000600082015250565b60006131826019836128a7565b915061318d8261314c565b602082019050919050565b600060208201905081810360008301526131b181613175565b9050919050565b7f4d6178206d696e74207065722077616c6c657420657863656564656421000000600082015250565b60006131ee601d836128a7565b91506131f9826131b8565b602082019050919050565b6000602082019050818103600083015261321d816131e1565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b600061325a6014836128a7565b915061326582613224565b602082019050919050565b600060208201905081810360008301526132898161324d565b9050919050565b600061329b82612957565b91506132a683612957565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156132df576132de613093565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b60006133206013836128a7565b915061332b826132ea565b602082019050919050565b6000602082019050818103600083015261334f81613313565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061338c6020836128a7565b915061339782613356565b602082019050919050565b600060208201905081810360008301526133bb8161337f565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006133f8601f836128a7565b9150613403826133c2565b602082019050919050565b60006020820190508181036000830152613427816133eb565b9050919050565b600081905092915050565b50565b600061344960008361342e565b915061345482613439565b600082019050919050565b600061346a8261343c565b9150819050919050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b60006134aa6014836128a7565b91506134b582613474565b602082019050919050565b600060208201905081810360008301526134d98161349d565b9050919050565b7f536f6c64206f7574210000000000000000000000000000000000000000000000600082015250565b60006135166009836128a7565b9150613521826134e0565b602082019050919050565b6000602082019050818103600083015261354581613509565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006135d7602f836128a7565b91506135e28261357b565b604082019050919050565b60006020820190508181036000830152613606816135ca565b9050919050565b600081905092915050565b60006136238261289c565b61362d818561360d565b935061363d8185602086016128b8565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461366b81612ff6565b613675818661360d565b9450600182166000811461369057600181146136a5576136d8565b60ff19831686528115158202860193506136d8565b6136ae85613649565b60005b838110156136d0578154818901526001820191506020810190506136b1565b838801955050505b50505092915050565b60006136ed8286613618565b91506136f98285613618565b9150613705828461365e565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061376e6026836128a7565b915061377982613712565b604082019050919050565b6000602082019050818103600083015261379d81613761565b9050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026137f17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826137b4565b6137fb86836137b4565b95508019841693508086168417925050509392505050565b6000819050919050565b600061383861383361382e84612957565b613813565b612957565b9050919050565b6000819050919050565b6138528361381d565b61386661385e8261383f565b8484546137c1565b825550505050565b600090565b61387b61386e565b613886818484613849565b505050565b5b818110156138aa5761389f600082613873565b60018101905061388c565b5050565b601f8211156138ef576138c081613649565b6138c9846137a4565b810160208510156138d8578190505b6138ec6138e4856137a4565b83018261388b565b50505b505050565b600082821c905092915050565b6000613912600019846008026138f4565b1980831691505092915050565b600061392b8383613901565b9150826002028217905092915050565b6139448261289c565b67ffffffffffffffff81111561395d5761395c612cc2565b5b6139678254612ff6565b6139728282856138ae565b600060209050601f8311600181146139a55760008415613993578287015190505b61399d858261391f565b865550613a05565b601f1984166139b386613649565b60005b828110156139db578489015182556001820191506020850194506020810190506139b6565b868310156139f857848901516139f4601f891682613901565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b600082825260208201905092915050565b6000613a3482613a0d565b613a3e8185613a18565b9350613a4e8185602086016128b8565b613a57816128eb565b840191505092915050565b6000608082019050613a7760008301876129ec565b613a8460208301866129ec565b613a916040830185612a82565b8181036060830152613aa38184613a29565b905095945050505050565b600081519050613abd8161280d565b92915050565b600060208284031215613ad957613ad86127d7565b5b6000613ae784828501613aae565b91505092915050565b6000613afb82612957565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b2d57613b2c613093565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613b7282612957565b9150613b7d83612957565b925082613b8d57613b8c613b38565b5b828204905092915050565b6000613ba382612957565b9150613bae83612957565b925082613bbe57613bbd613b38565b5b82820690509291505056fea264697066735822122096e3db5e188232dc249b3bb6b4c3814fc6c96a4db8638245e402e88c686ee5ea64736f6c634300080f0033

Deployed Bytecode

0x6080604052600436106101f95760003560e01c80637871e1541161010d578063b88d4fde116100a0578063e985e9c51161006f578063e985e9c5146106f5578063eac989f814610732578063ee8cdd4e1461075d578063f2fde38b14610786578063f6484980146107af576101f9565b8063b88d4fde1461063b578063ba8b297414610664578063c87b56dd1461068f578063d897833e146106cc576101f9565b806394354fd0116100dc57806394354fd01461059157806395d89b41146105bc5780639a1b2885146105e7578063a22cb46514610612576101f9565b80637871e154146104e45780637d48b5681461050d5780638462151c146105295780638da5cb5b14610566576101f9565b806333573dc2116101905780635a0b8b231161015f5780635a0b8b23146103fd5780636352211e146104285780636ad1fe021461046557806370a0823114610490578063715018a6146104cd576101f9565b806333573dc2146103675780633ccfd60b1461039257806342842e0e146103a95780635503a0e8146103d2576101f9565b8063095ea7b3116101cc578063095ea7b3146102bf57806318160ddd146102e857806319d1997a1461031357806323b872dd1461033e576101f9565b806301ffc9a7146101fe57806306fdde031461023b5780630788370314610266578063081812fc14610282575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190612839565b6107d8565b6040516102329190612881565b60405180910390f35b34801561024757600080fd5b5061025061086a565b60405161025d9190612935565b60405180910390f35b610280600480360381019061027b919061298d565b6108fc565b005b34801561028e57600080fd5b506102a960048036038101906102a4919061298d565b610ac2565b6040516102b691906129fb565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190612a42565b610b3e565b005b3480156102f457600080fd5b506102fd610c7f565b60405161030a9190612a91565b60405180910390f35b34801561031f57600080fd5b50610328610c96565b6040516103359190612a91565b60405180910390f35b34801561034a57600080fd5b5061036560048036038101906103609190612aac565b610c9c565b005b34801561037357600080fd5b5061037c610fbe565b6040516103899190612a91565b60405180910390f35b34801561039e57600080fd5b506103a7610fc4565b005b3480156103b557600080fd5b506103d060048036038101906103cb9190612aac565b611115565b005b3480156103de57600080fd5b506103e7611135565b6040516103f49190612935565b60405180910390f35b34801561040957600080fd5b506104126111c3565b60405161041f9190612a91565b60405180910390f35b34801561043457600080fd5b5061044f600480360381019061044a919061298d565b6111c9565b60405161045c91906129fb565b60405180910390f35b34801561047157600080fd5b5061047a6111db565b6040516104879190612881565b60405180910390f35b34801561049c57600080fd5b506104b760048036038101906104b29190612aff565b6111ee565b6040516104c49190612a91565b60405180910390f35b3480156104d957600080fd5b506104e26112a6565b005b3480156104f057600080fd5b5061050b60048036038101906105069190612b2c565b61132e565b005b6105276004803603810190610522919061298d565b61140f565b005b34801561053557600080fd5b50610550600480360381019061054b9190612aff565b611570565b60405161055d9190612c2a565b60405180910390f35b34801561057257600080fd5b5061057b6116b4565b60405161058891906129fb565b60405180910390f35b34801561059d57600080fd5b506105a66116de565b6040516105b39190612a91565b60405180910390f35b3480156105c857600080fd5b506105d16116e4565b6040516105de9190612935565b60405180910390f35b3480156105f357600080fd5b506105fc611776565b6040516106099190612a91565b60405180910390f35b34801561061e57600080fd5b5061063960048036038101906106349190612c78565b61177c565b005b34801561064757600080fd5b50610662600480360381019061065d9190612ded565b6118f3565b005b34801561067057600080fd5b50610679611966565b6040516106869190612a91565b60405180910390f35b34801561069b57600080fd5b506106b660048036038101906106b1919061298d565b61196c565b6040516106c39190612935565b60405180910390f35b3480156106d857600080fd5b506106f360048036038101906106ee9190612e70565b611a16565b005b34801561070157600080fd5b5061071c60048036038101906107179190612e9d565b611aaf565b6040516107299190612881565b60405180910390f35b34801561073e57600080fd5b50610747611b43565b6040516107549190612935565b60405180910390f35b34801561076957600080fd5b50610784600480360381019061077f919061298d565b611bd1565b005b34801561079257600080fd5b506107ad60048036038101906107a89190612aff565b611c57565b005b3480156107bb57600080fd5b506107d660048036038101906107d19190612f7e565b611d4e565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061083357506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108635750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461087990612ff6565b80601f01602080910402602001604051908101604052809291908181526020018280546108a590612ff6565b80156108f25780601f106108c7576101008083540402835291602001916108f2565b820191906000526020600020905b8154815290600101906020018083116108d557829003601f168201915b5050505050905090565b6000610906610c7f565b9050601260009054906101000a900460ff16610957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094e90613073565b60405180910390fd5b61091d600e5461096791906130c2565b828261097391906130f6565b11156109b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ab90613198565b60405180910390fd5b601054826109c1336111ee565b6109cb91906130f6565b1115610a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0390613204565b60405180910390fd5b600082118015610a1e5750600f548211155b610a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5490613270565b60405180910390fd5b81600c54610a6b9190613290565b341015610aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa490613336565b60405180910390fd5b610abe610ab8611ddd565b83611de5565b5050565b6000610acd82611e03565b610b03576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b49826111c9565b90508073ffffffffffffffffffffffffffffffffffffffff16610b6a611e62565b73ffffffffffffffffffffffffffffffffffffffff1614610bcd57610b9681610b91611e62565b611aaf565b610bcc576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610c89611e6a565b6001546000540303905090565b600e5481565b6000610ca782611e73565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d0e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d1a84611f3f565b91509150610d308187610d2b611e62565b611f61565b610d7c57610d4586610d40611e62565b611aaf565b610d7b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610de2576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610def8686866001611fa5565b8015610dfa57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610ec885610ea4888887611fab565b7c020000000000000000000000000000000000000000000000000000000017611fd3565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610f4e5760006001850190506000600460008381526020019081526020016000205403610f4c576000548114610f4b578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610fb68686866001611ffe565b505050505050565b600c5481565b610fcc611ddd565b73ffffffffffffffffffffffffffffffffffffffff16610fea6116b4565b73ffffffffffffffffffffffffffffffffffffffff1614611040576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611037906133a2565b60405180910390fd5b600260095403611085576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107c9061340e565b60405180910390fd5b600260098190555060006110976116b4565b73ffffffffffffffffffffffffffffffffffffffff16476040516110ba9061345f565b60006040518083038185875af1925050503d80600081146110f7576040519150601f19603f3d011682016040523d82523d6000602084013e6110fc565b606091505b505090508061110a57600080fd5b506001600981905550565b611130838383604051806020016040528060008152506118f3565b505050565b600b805461114290612ff6565b80601f016020809104026020016040519081016040528092919081815260200182805461116e90612ff6565b80156111bb5780601f10611190576101008083540402835291602001916111bb565b820191906000526020600020905b81548152906001019060200180831161119e57829003601f168201915b505050505081565b60105481565b60006111d482611e73565b9050919050565b601260009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611255576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6112ae611ddd565b73ffffffffffffffffffffffffffffffffffffffff166112cc6116b4565b73ffffffffffffffffffffffffffffffffffffffff1614611322576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611319906133a2565b60405180910390fd5b61132c6000612004565b565b611336611ddd565b73ffffffffffffffffffffffffffffffffffffffff166113546116b4565b73ffffffffffffffffffffffffffffffffffffffff16146113aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a1906133a2565b60405180910390fd5b600e54826113b6610c7f565b6113c091906130f6565b1115611401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f8906134c0565b60405180910390fd5b61140b8183611de5565b5050565b6000611419610c7f565b9050601260009054906101000a900460ff1661146a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146190613073565b60405180910390fd5b600e54828261147991906130f6565b11156114ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b19061352c565b60405180910390fd5b6000821180156114cc57506011548211155b61150b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150290613270565b60405180910390fd5b81600d546115199190613290565b34101561155b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155290613336565b60405180910390fd5b61156c611566611ddd565b83611de5565b5050565b6060600061157d836111ee565b67ffffffffffffffff81111561159657611595612cc2565b5b6040519080825280602002602001820160405280156115c45781602001602082028036833780820191505090505b50905060006115d16120ca565b905060008060005b838110156116a75760006115ec826120d3565b90508060400151156115fe575061169a565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461163e57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611698578186858060010196508151811061168b5761168a61354c565b5b6020026020010181815250505b505b80806001019150506115d9565b5083945050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f5481565b6060600380546116f390612ff6565b80601f016020809104026020016040519081016040528092919081815260200182805461171f90612ff6565b801561176c5780601f106117415761010080835404028352916020019161176c565b820191906000526020600020905b81548152906001019060200180831161174f57829003601f168201915b5050505050905090565b600d5481565b611784611e62565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117e8576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006117f5611e62565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118a2611e62565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118e79190612881565b60405180910390a35050565b6118fe848484610c9c565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461196057611929848484846120fe565b61195f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60115481565b606061197782611e03565b6119b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ad906135ed565b60405180910390fd5b60006119c061224e565b905060008151116119e05760405180602001604052806000815250611a0e565b806119ea846122e0565b600b6040516020016119fe939291906136e1565b6040516020818303038152906040525b915050919050565b611a1e611ddd565b73ffffffffffffffffffffffffffffffffffffffff16611a3c6116b4565b73ffffffffffffffffffffffffffffffffffffffff1614611a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a89906133a2565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a8054611b5090612ff6565b80601f0160208091040260200160405190810160405280929190818152602001828054611b7c90612ff6565b8015611bc95780601f10611b9e57610100808354040283529160200191611bc9565b820191906000526020600020905b815481529060010190602001808311611bac57829003601f168201915b505050505081565b611bd9611ddd565b73ffffffffffffffffffffffffffffffffffffffff16611bf76116b4565b73ffffffffffffffffffffffffffffffffffffffff1614611c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c44906133a2565b60405180910390fd5b80600d8190555050565b611c5f611ddd565b73ffffffffffffffffffffffffffffffffffffffff16611c7d6116b4565b73ffffffffffffffffffffffffffffffffffffffff1614611cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cca906133a2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3990613784565b60405180910390fd5b611d4b81612004565b50565b611d56611ddd565b73ffffffffffffffffffffffffffffffffffffffff16611d746116b4565b73ffffffffffffffffffffffffffffffffffffffff1614611dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc1906133a2565b60405180910390fd5b80600a9081611dd9919061393b565b5050565b600033905090565b611dff828260405180602001604052806000815250612440565b5050565b600081611e0e611e6a565b11158015611e1d575060005482105b8015611e5b575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080611e82611e6a565b11611f0857600054811015611f075760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611f05575b60008103611efb576004600083600190039350838152602001908152602001600020549050611ed1565b8092505050611f3a565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611fc28686846124dd565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008054905090565b6120db61277e565b6120f760046000848152602001908152602001600020546124e6565b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612124611e62565b8786866040518563ffffffff1660e01b81526004016121469493929190613a62565b6020604051808303816000875af192505050801561218257506040513d601f19601f8201168201806040525081019061217f9190613ac3565b60015b6121fb573d80600081146121b2576040519150601f19603f3d011682016040523d82523d6000602084013e6121b7565b606091505b5060008151036121f3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a805461225d90612ff6565b80601f016020809104026020016040519081016040528092919081815260200182805461228990612ff6565b80156122d65780601f106122ab576101008083540402835291602001916122d6565b820191906000526020600020905b8154815290600101906020018083116122b957829003601f168201915b5050505050905090565b606060008203612327576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061243b565b600082905060005b6000821461235957808061234290613af0565b915050600a826123529190613b67565b915061232f565b60008167ffffffffffffffff81111561237557612374612cc2565b5b6040519080825280601f01601f1916602001820160405280156123a75781602001600182028036833780820191505090505b5090505b60008514612434576001826123c091906130c2565b9150600a856123cf9190613b98565b60306123db91906130f6565b60f81b8183815181106123f1576123f061354c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561242d9190613b67565b94506123ab565b8093505050505b919050565b61244a838361259c565b60008373ffffffffffffffffffffffffffffffffffffffff163b146124d857600080549050600083820390505b61248a60008683806001019450866120fe565b6124c0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106124775781600054146124d557600080fd5b50505b505050565b60009392505050565b6124ee61277e565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612608576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203612642576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61264f6000848385611fa5565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506126c6836126b76000866000611fab565b6126c08561276e565b17611fd3565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106126ea578060008190555050506127696000848385611ffe565b505050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612816816127e1565b811461282157600080fd5b50565b6000813590506128338161280d565b92915050565b60006020828403121561284f5761284e6127d7565b5b600061285d84828501612824565b91505092915050565b60008115159050919050565b61287b81612866565b82525050565b60006020820190506128966000830184612872565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156128d65780820151818401526020810190506128bb565b838111156128e5576000848401525b50505050565b6000601f19601f8301169050919050565b60006129078261289c565b61291181856128a7565b93506129218185602086016128b8565b61292a816128eb565b840191505092915050565b6000602082019050818103600083015261294f81846128fc565b905092915050565b6000819050919050565b61296a81612957565b811461297557600080fd5b50565b60008135905061298781612961565b92915050565b6000602082840312156129a3576129a26127d7565b5b60006129b184828501612978565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129e5826129ba565b9050919050565b6129f5816129da565b82525050565b6000602082019050612a1060008301846129ec565b92915050565b612a1f816129da565b8114612a2a57600080fd5b50565b600081359050612a3c81612a16565b92915050565b60008060408385031215612a5957612a586127d7565b5b6000612a6785828601612a2d565b9250506020612a7885828601612978565b9150509250929050565b612a8b81612957565b82525050565b6000602082019050612aa66000830184612a82565b92915050565b600080600060608486031215612ac557612ac46127d7565b5b6000612ad386828701612a2d565b9350506020612ae486828701612a2d565b9250506040612af586828701612978565b9150509250925092565b600060208284031215612b1557612b146127d7565b5b6000612b2384828501612a2d565b91505092915050565b60008060408385031215612b4357612b426127d7565b5b6000612b5185828601612978565b9250506020612b6285828601612a2d565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612ba181612957565b82525050565b6000612bb38383612b98565b60208301905092915050565b6000602082019050919050565b6000612bd782612b6c565b612be18185612b77565b9350612bec83612b88565b8060005b83811015612c1d578151612c048882612ba7565b9750612c0f83612bbf565b925050600181019050612bf0565b5085935050505092915050565b60006020820190508181036000830152612c448184612bcc565b905092915050565b612c5581612866565b8114612c6057600080fd5b50565b600081359050612c7281612c4c565b92915050565b60008060408385031215612c8f57612c8e6127d7565b5b6000612c9d85828601612a2d565b9250506020612cae85828601612c63565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612cfa826128eb565b810181811067ffffffffffffffff82111715612d1957612d18612cc2565b5b80604052505050565b6000612d2c6127cd565b9050612d388282612cf1565b919050565b600067ffffffffffffffff821115612d5857612d57612cc2565b5b612d61826128eb565b9050602081019050919050565b82818337600083830152505050565b6000612d90612d8b84612d3d565b612d22565b905082815260208101848484011115612dac57612dab612cbd565b5b612db7848285612d6e565b509392505050565b600082601f830112612dd457612dd3612cb8565b5b8135612de4848260208601612d7d565b91505092915050565b60008060008060808587031215612e0757612e066127d7565b5b6000612e1587828801612a2d565b9450506020612e2687828801612a2d565b9350506040612e3787828801612978565b925050606085013567ffffffffffffffff811115612e5857612e576127dc565b5b612e6487828801612dbf565b91505092959194509250565b600060208284031215612e8657612e856127d7565b5b6000612e9484828501612c63565b91505092915050565b60008060408385031215612eb457612eb36127d7565b5b6000612ec285828601612a2d565b9250506020612ed385828601612a2d565b9150509250929050565b600067ffffffffffffffff821115612ef857612ef7612cc2565b5b612f01826128eb565b9050602081019050919050565b6000612f21612f1c84612edd565b612d22565b905082815260208101848484011115612f3d57612f3c612cbd565b5b612f48848285612d6e565b509392505050565b600082601f830112612f6557612f64612cb8565b5b8135612f75848260208601612f0e565b91505092915050565b600060208284031215612f9457612f936127d7565b5b600082013567ffffffffffffffff811115612fb257612fb16127dc565b5b612fbe84828501612f50565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061300e57607f821691505b60208210810361302157613020612fc7565b5b50919050565b7f5468652053616c65206973207061757365642100000000000000000000000000600082015250565b600061305d6013836128a7565b915061306882613027565b602082019050919050565b6000602082019050818103600083015261308c81613050565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006130cd82612957565b91506130d883612957565b9250828210156130eb576130ea613093565b5b828203905092915050565b600061310182612957565b915061310c83612957565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561314157613140613093565b5b828201905092915050565b7f4d6178206672656520737570706c792065786365656465642100000000000000600082015250565b60006131826019836128a7565b915061318d8261314c565b602082019050919050565b600060208201905081810360008301526131b181613175565b9050919050565b7f4d6178206d696e74207065722077616c6c657420657863656564656421000000600082015250565b60006131ee601d836128a7565b91506131f9826131b8565b602082019050919050565b6000602082019050818103600083015261321d816131e1565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b600061325a6014836128a7565b915061326582613224565b602082019050919050565b600060208201905081810360008301526132898161324d565b9050919050565b600061329b82612957565b91506132a683612957565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156132df576132de613093565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b60006133206013836128a7565b915061332b826132ea565b602082019050919050565b6000602082019050818103600083015261334f81613313565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061338c6020836128a7565b915061339782613356565b602082019050919050565b600060208201905081810360008301526133bb8161337f565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006133f8601f836128a7565b9150613403826133c2565b602082019050919050565b60006020820190508181036000830152613427816133eb565b9050919050565b600081905092915050565b50565b600061344960008361342e565b915061345482613439565b600082019050919050565b600061346a8261343c565b9150819050919050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b60006134aa6014836128a7565b91506134b582613474565b602082019050919050565b600060208201905081810360008301526134d98161349d565b9050919050565b7f536f6c64206f7574210000000000000000000000000000000000000000000000600082015250565b60006135166009836128a7565b9150613521826134e0565b602082019050919050565b6000602082019050818103600083015261354581613509565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006135d7602f836128a7565b91506135e28261357b565b604082019050919050565b60006020820190508181036000830152613606816135ca565b9050919050565b600081905092915050565b60006136238261289c565b61362d818561360d565b935061363d8185602086016128b8565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461366b81612ff6565b613675818661360d565b9450600182166000811461369057600181146136a5576136d8565b60ff19831686528115158202860193506136d8565b6136ae85613649565b60005b838110156136d0578154818901526001820191506020810190506136b1565b838801955050505b50505092915050565b60006136ed8286613618565b91506136f98285613618565b9150613705828461365e565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061376e6026836128a7565b915061377982613712565b604082019050919050565b6000602082019050818103600083015261379d81613761565b9050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026137f17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826137b4565b6137fb86836137b4565b95508019841693508086168417925050509392505050565b6000819050919050565b600061383861383361382e84612957565b613813565b612957565b9050919050565b6000819050919050565b6138528361381d565b61386661385e8261383f565b8484546137c1565b825550505050565b600090565b61387b61386e565b613886818484613849565b505050565b5b818110156138aa5761389f600082613873565b60018101905061388c565b5050565b601f8211156138ef576138c081613649565b6138c9846137a4565b810160208510156138d8578190505b6138ec6138e4856137a4565b83018261388b565b50505b505050565b600082821c905092915050565b6000613912600019846008026138f4565b1980831691505092915050565b600061392b8383613901565b9150826002028217905092915050565b6139448261289c565b67ffffffffffffffff81111561395d5761395c612cc2565b5b6139678254612ff6565b6139728282856138ae565b600060209050601f8311600181146139a55760008415613993578287015190505b61399d858261391f565b865550613a05565b601f1984166139b386613649565b60005b828110156139db578489015182556001820191506020850194506020810190506139b6565b868310156139f857848901516139f4601f891682613901565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b600082825260208201905092915050565b6000613a3482613a0d565b613a3e8185613a18565b9350613a4e8185602086016128b8565b613a57816128eb565b840191505092915050565b6000608082019050613a7760008301876129ec565b613a8460208301866129ec565b613a916040830185612a82565b8181036060830152613aa38184613a29565b905095945050505050565b600081519050613abd8161280d565b92915050565b600060208284031215613ad957613ad86127d7565b5b6000613ae784828501613aae565b91505092915050565b6000613afb82612957565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b2d57613b2c613093565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613b7282612957565b9150613b7d83612957565b925082613b8d57613b8c613b38565b5b828204905092915050565b6000613ba382612957565b9150613bae83612957565b925082613bbe57613bbd613b38565b5b82820690509291505056fea264697066735822122096e3db5e188232dc249b3bb6b4c3814fc6c96a4db8638245e402e88c686ee5ea64736f6c634300080f0033

Deployed Bytecode Sourcemap

236:3916:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5653:607:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11161:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;718:573:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13048:200:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12611:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4736:309;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;458:33:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22055:2739:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;387:30:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2513:168;;;;;;;;;;;;;:::i;:::-;;13912:179:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;350:33:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;536:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10957:142:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;622:24:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6319:221:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:8;;;;;;;;;;;;;:::i;:::-;;1752:199:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1297:447;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2822:692;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1029:85:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;495:37:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11323:102:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;421:33:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13315:303:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14157:388;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;576:42:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3615:366;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2192:75;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13684:162:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;329:17:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2290:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1911:198:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2098:74:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5653:607:3;5738:4;6048:10;6033:25;;:11;:25;;;;:101;;;;6124:10;6109:25;;:11;:25;;;;6033:101;:177;;;;6200:10;6185:25;;:11;:25;;;;6033:177;6014:196;;5653:607;;;:::o;11161:98::-;11215:13;11247:5;11240:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11161:98;:::o;718:573:1:-;794:14;811:13;:11;:13::i;:::-;794:30;;838:4;;;;;;;;;;;830:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;918:4;904:11;;:18;;;;:::i;:::-;889:11;880:6;:20;;;;:::i;:::-;:42;;872:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;1005:17;;990:11;966:21;976:10;966:9;:21::i;:::-;:35;;;;:::i;:::-;:56;;958:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;1084:1;1070:11;:15;:52;;;;;1104:18;;1089:11;:33;;1070:52;1062:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;1182:11;1174:5;;:19;;;;:::i;:::-;1161:9;:32;;1153:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;1244:36;1254:12;:10;:12::i;:::-;1268:11;1244:9;:36::i;:::-;768:523;718:573;:::o;13048:200:3:-;13116:7;13140:16;13148:7;13140;:16::i;:::-;13135:64;;13165:34;;;;;;;;;;;;;;13135:64;13217:15;:24;13233:7;13217:24;;;;;;;;;;;;;;;;;;;;;13210:31;;13048:200;;;:::o;12611:376::-;12683:13;12699:16;12707:7;12699;:16::i;:::-;12683:32;;12753:5;12730:28;;:19;:17;:19::i;:::-;:28;;;12726:172;;12777:44;12794:5;12801:19;:17;:19::i;:::-;12777:16;:44::i;:::-;12772:126;;12848:35;;;;;;;;;;;;;;12772:126;12726:172;12935:2;12908:15;:24;12924:7;12908:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;12972:7;12968:2;12952:28;;12961:5;12952:28;;;;;;;;;;;;12673:314;12611:376;;:::o;4736:309::-;4789:7;5013:15;:13;:15::i;:::-;4998:12;;4982:13;;:28;:46;4975:53;;4736:309;:::o;458:33:1:-;;;;:::o;22055:2739:3:-;22184:27;22214;22233:7;22214:18;:27::i;:::-;22184:57;;22297:4;22256:45;;22272:19;22256:45;;;22252:86;;22310:28;;;;;;;;;;;;;;22252:86;22350:27;22379:23;22406:28;22426:7;22406:19;:28::i;:::-;22349:85;;;;22531:62;22550:15;22567:4;22573:19;:17;:19::i;:::-;22531:18;:62::i;:::-;22526:173;;22612:43;22629:4;22635:19;:17;:19::i;:::-;22612:16;:43::i;:::-;22607:92;;22664:35;;;;;;;;;;;;;;22607:92;22526:173;22728:1;22714:16;;:2;:16;;;22710:52;;22739:23;;;;;;;;;;;;;;22710:52;22773:43;22795:4;22801:2;22805:7;22814:1;22773:21;:43::i;:::-;22905:15;22902:157;;;23043:1;23022:19;23015:30;22902:157;23429:18;:24;23448:4;23429:24;;;;;;;;;;;;;;;;23427:26;;;;;;;;;;;;23497:18;:22;23516:2;23497:22;;;;;;;;;;;;;;;;23495:24;;;;;;;;;;;23812:142;23848:2;23895:45;23910:4;23916:2;23920:19;23895:14;:45::i;:::-;2046:8;23868:72;23812:18;:142::i;:::-;23783:17;:26;23801:7;23783:26;;;;;;;;;;;:171;;;;24121:1;2046:8;24071:19;:46;:51;24067:616;;24142:19;24174:1;24164:7;:11;24142:33;;24329:1;24295:17;:30;24313:11;24295:30;;;;;;;;;;;;:35;24291:378;;24431:13;;24416:11;:28;24412:239;;24609:19;24576:17;:30;24594:11;24576:30;;;;;;;;;;;:52;;;;24412:239;24291:378;24124:559;24067:616;24727:7;24723:2;24708:27;;24717:4;24708:27;;;;;;;;;;;;24745:42;24766:4;24772:2;24776:7;24785:1;24745:20;:42::i;:::-;22174:2620;;;22055:2739;;;:::o;387:30:1:-;;;;:::o;2513:168::-;1252:12:8;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1:9::1;2325:7;;:19:::0;2317:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;2591:7:1::2;2612;:5;:7::i;:::-;2604:21;;2633;2604:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2590:69;;;2673:2;2665:11;;;::::0;::::2;;2563:118;1701:1:9::1;2628:7;:22;;;;2513:168:1:o:0;13912:179:3:-;14045:39;14062:4;14068:2;14072:7;14045:39;;;;;;;;;;;;:16;:39::i;:::-;13912:179;;;:::o;350:33:1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;536:36::-;;;;:::o;10957:142:3:-;11021:7;11063:27;11082:7;11063:18;:27::i;:::-;11040:52;;10957:142;;;:::o;622:24:1:-;;;;;;;;;;;;;:::o;6319:221:3:-;6383:7;6423:1;6406:19;;:5;:19;;;6402:60;;6434:28;;;;;;;;;;;;;;6402:60;1022:13;6479:18;:25;6498:5;6479:25;;;;;;;;;;;;;;;;:54;6472:61;;6319:221;;;:::o;1661:101:8:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;1752:199:1:-;1252:12:8;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1871:11:1::1;;1856;1840:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:42;;1832:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;1913:33;1923:9;1934:11;1913:9;:33::i;:::-;1752:199:::0;;:::o;1297:447::-;1377:14;1394:13;:11;:13::i;:::-;1377:30;;1421:4;;;;;;;;;;;1413:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;1487:11;;1472;1463:6;:20;;;;:::i;:::-;:35;;1455:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;1540:1;1526:11;:15;:56;;;;;1560:22;;1545:11;:37;;1526:56;1518:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;1642:11;1634:5;;:19;;;;:::i;:::-;1621:9;:32;;1613:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;1703:36;1713:12;:10;:12::i;:::-;1727:11;1703:9;:36::i;:::-;1351:393;1297:447;:::o;2822:692::-;2883:16;2927:18;2962:16;2972:5;2962:9;:16::i;:::-;2948:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2927:52;;2990:11;3004:14;:12;:14::i;:::-;2990:28;;3028:19;3057:25;3097:9;3092:392;3112:3;3108:1;:7;3092:392;;;3136:31;3170:15;3183:1;3170:12;:15::i;:::-;3136:49;;3203:9;:16;;;3199:63;;;3239:8;;;3199:63;3305:1;3279:28;;:9;:14;;;:28;;;3275:101;;3347:9;:14;;;3327:34;;3275:101;3414:5;3393:26;;:17;:26;;;3389:85;;3458:1;3439;3441:13;;;;;;3439:16;;;;;;;;:::i;:::-;;;;;;;:20;;;;;3389:85;3122:362;3092:392;3117:3;;;;;;;3092:392;;;;3500:1;3493:8;;;;;;2822:692;;;:::o;1029:85:8:-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;495:37:1:-;;;;:::o;11323:102:3:-;11379:13;11411:7;11404:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11323:102;:::o;421:33:1:-;;;;:::o;13315:303:3:-;13425:19;:17;:19::i;:::-;13413:31;;:8;:31;;;13409:61;;13453:17;;;;;;;;;;;;;;13409:61;13533:8;13481:18;:39;13500:19;:17;:19::i;:::-;13481:39;;;;;;;;;;;;;;;:49;13521:8;13481:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;13592:8;13556:55;;13571:19;:17;:19::i;:::-;13556:55;;;13602:8;13556:55;;;;;;:::i;:::-;;;;;;;;13315:303;;:::o;14157:388::-;14318:31;14331:4;14337:2;14341:7;14318:12;:31::i;:::-;14381:1;14363:2;:14;;;:19;14359:180;;14401:56;14432:4;14438:2;14442:7;14451:5;14401:30;:56::i;:::-;14396:143;;14484:40;;;;;;;;;;;;;;14396:143;14359:180;14157:388;;;;:::o;576:42:1:-;;;;:::o;3615:366::-;3689:13;3718:17;3726:8;3718:7;:17::i;:::-;3710:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;3794:28;3825:10;:8;:10::i;:::-;3794:41;;3879:1;3854:14;3848:28;:32;:128;;;;;;;;;;;;;;;;;3915:14;3931:19;:8;:17;:19::i;:::-;3952:9;3898:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3848:128;3841:135;;;3615:366;;;:::o;2192:75::-;1252:12:8;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2257:5:1::1;2250:4;;:12;;;;;;;;;;;;;;;;;;2192:75:::0;:::o;13684:162:3:-;13781:4;13804:18;:25;13823:5;13804:25;;;;;;;;;;;;;;;:35;13830:8;13804:35;;;;;;;;;;;;;;;;;;;;;;;;;13797:42;;13684:162;;;;:::o;329:17:1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2290:79::-;1252:12:8;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2358:6:1::1;2350:5;:14;;;;2290:79:::0;:::o;1911:198:8:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;::::0;1991:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;2098:74:1:-;1252:12:8;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2163:4:1::1;2157:3;:10;;;;;;:::i;:::-;;2098:74:::0;:::o;640:96:2:-;693:7;719:10;712:17;;640:96;:::o;15138:102:3:-;15206:27;15216:2;15220:8;15206:27;;;;;;;;;;;;:9;:27::i;:::-;15138:102;;:::o;14791:268::-;14848:4;14902:7;14883:15;:13;:15::i;:::-;:26;;:65;;;;;14935:13;;14925:7;:23;14883:65;:150;;;;;15032:1;1774:8;14985:17;:26;15003:7;14985:26;;;;;;;;;;;;:43;:48;14883:150;14864:169;;14791:268;;;:::o;32874:103::-;32934:7;32960:10;32953:17;;32874:103;:::o;3518:93:1:-;3583:7;3605:1;3598:8;;3518:93;:::o;7949:1105:3:-;8016:7;8035:12;8050:7;8035:22;;8115:4;8096:15;:13;:15::i;:::-;:23;8092:898;;8148:13;;8141:4;:20;8137:853;;;8185:14;8202:17;:23;8220:4;8202:23;;;;;;;;;;;;8185:40;;8316:1;1774:8;8289:6;:23;:28;8285:687;;8800:111;8817:1;8807:6;:11;8800:111;;8859:17;:25;8877:6;;;;;;;8859:25;;;;;;;;;;;;8850:34;;8800:111;;;8943:6;8936:13;;;;;;8285:687;8163:827;8137:853;8092:898;9016:31;;;;;;;;;;;;;;7949:1105;;;;:::o;20436:637::-;20528:27;20557:23;20596:53;20652:15;20596:71;;20834:7;20828:4;20821:21;20868:22;20862:4;20855:36;20943:4;20937;20927:21;20904:44;;21037:19;21031:26;21012:45;;20774:293;20436:637;;;:::o;21181:632::-;21319:11;21478:15;21472:4;21468:26;21460:34;;21635:15;21624:9;21620:31;21607:44;;21780:15;21769:9;21766:30;21759:4;21748:9;21745:19;21742:55;21732:65;;21181:632;;;;;:::o;31742:154::-;;;;;:::o;30099:302::-;30230:7;30249:16;2166:3;30275:19;:40;;30249:67;;2166:3;30341:31;30352:4;30358:2;30362:9;30341:10;:31::i;:::-;30333:40;;:61;;30326:68;;;30099:302;;;;;:::o;10460:440::-;10540:14;10705:15;10698:5;10694:27;10685:36;;10877:5;10863:11;10839:22;10835:40;10832:51;10825:5;10822:62;10812:72;;10460:440;;;;:::o;32537:153::-;;;;;:::o;2263:187:8:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2326:124;2263:187;:::o;4440:93:3:-;4487:7;4513:13;;4506:20;;4440:93;:::o;9587:151::-;9647:21;;:::i;:::-;9687:44;9706:17;:24;9724:5;9706:24;;;;;;;;;;;;9687:18;:44::i;:::-;9680:51;;9587:151;;;:::o;28649:697::-;28807:4;28852:2;28827:45;;;28873:19;:17;:19::i;:::-;28894:4;28900:7;28909:5;28827:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;28823:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29122:1;29105:6;:13;:18;29101:229;;29150:40;;;;;;;;;;;;;;29101:229;29290:6;29284:13;29275:6;29271:2;29267:15;29260:38;28823:517;28993:54;;;28983:64;;;:6;:64;;;;28976:71;;;28649:697;;;;;;:::o;3985:96:1:-;4045:13;4073:3;4066:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3985:96;:::o;328:703:10:-;384:13;610:1;601:5;:10;597:51;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;15641:661:3:-;15759:19;15765:2;15769:8;15759:5;:19::i;:::-;15835:1;15817:2;:14;;;:19;15813:473;;15856:11;15870:13;;15856:27;;15901:13;15923:8;15917:3;:14;15901:30;;15949:229;15979:62;16018:1;16022:2;16026:7;;;;;;16035:5;15979:30;:62::i;:::-;15974:165;;16076:40;;;;;;;;;;;;;;15974:165;16173:3;16165:5;:11;15949:229;;16258:3;16241:13;;:20;16237:34;;16263:8;;;16237:34;15838:448;;15813:473;15641:661;;;:::o;30961:143::-;31094:6;30961:143;;;;;:::o;9143:358::-;9209:31;;:::i;:::-;9285:6;9252:9;:14;;:41;;;;;;;;;;;1661:3;9337:6;:32;;9303:9;:24;;:67;;;;;;;;;;;9426:1;1774:8;9399:6;:23;:28;;9380:9;:16;;:47;;;;;;;;;;;2166:3;9466:6;:27;;9437:9;:19;;:57;;;;;;;;;;;9143:358;;;:::o;16563:1492::-;16627:20;16650:13;;16627:36;;16691:1;16677:16;;:2;:16;;;16673:48;;16702:19;;;;;;;;;;;;;;16673:48;16747:1;16735:8;:13;16731:44;;16757:18;;;;;;;;;;;;;;16731:44;16786:61;16816:1;16820:2;16824:12;16838:8;16786:21;:61::i;:::-;17318:1;1156:2;17289:1;:25;;17288:31;17276:8;:44;17250:18;:22;17269:2;17250:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;17590:136;17626:2;17679:33;17702:1;17706:2;17710:1;17679:14;:33::i;:::-;17646:30;17667:8;17646:20;:30::i;:::-;:66;17590:18;:136::i;:::-;17556:17;:31;17574:12;17556:31;;;;;;;;;;;:170;;;;17741:15;17759:12;17741:30;;17785:11;17814:8;17799:12;:23;17785:37;;17836:99;17887:9;;;;;;17883:2;17862:35;;17879:1;17862:35;;;;;;;;;;;;17930:3;17920:7;:13;17836:99;;17965:3;17949:13;:19;;;;17030:949;;17988:60;18017:1;18021:2;18025:12;18039:8;17988:20;:60::i;:::-;16617:1438;16563:1492;;:::o;12238:316::-;12308:14;12535:1;12525:8;12522:15;12497:23;12493:45;12483:55;;12238:316;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:11:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::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:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:474::-;6318:6;6326;6375:2;6363:9;6354:7;6350:23;6346:32;6343:119;;;6381:79;;:::i;:::-;6343:119;6501:1;6526:53;6571:7;6562:6;6551:9;6547:22;6526:53;:::i;:::-;6516:63;;6472:117;6628:2;6654:53;6699:7;6690:6;6679:9;6675:22;6654:53;:::i;:::-;6644:63;;6599:118;6250:474;;;;;:::o;6730:114::-;6797:6;6831:5;6825:12;6815:22;;6730:114;;;:::o;6850:184::-;6949:11;6983:6;6978:3;6971:19;7023:4;7018:3;7014:14;6999:29;;6850:184;;;;:::o;7040:132::-;7107:4;7130:3;7122:11;;7160:4;7155:3;7151:14;7143:22;;7040:132;;;:::o;7178:108::-;7255:24;7273:5;7255:24;:::i;:::-;7250:3;7243:37;7178:108;;:::o;7292:179::-;7361:10;7382:46;7424:3;7416:6;7382:46;:::i;:::-;7460:4;7455:3;7451:14;7437:28;;7292:179;;;;:::o;7477:113::-;7547:4;7579;7574:3;7570:14;7562:22;;7477:113;;;:::o;7626:732::-;7745:3;7774:54;7822:5;7774:54;:::i;:::-;7844:86;7923:6;7918:3;7844:86;:::i;:::-;7837:93;;7954:56;8004:5;7954:56;:::i;:::-;8033:7;8064:1;8049:284;8074:6;8071:1;8068:13;8049:284;;;8150:6;8144:13;8177:63;8236:3;8221:13;8177:63;:::i;:::-;8170:70;;8263:60;8316:6;8263:60;:::i;:::-;8253:70;;8109:224;8096:1;8093;8089:9;8084:14;;8049:284;;;8053:14;8349:3;8342:10;;7750:608;;;7626:732;;;;:::o;8364:373::-;8507:4;8545:2;8534:9;8530:18;8522:26;;8594:9;8588:4;8584:20;8580:1;8569:9;8565:17;8558:47;8622:108;8725:4;8716:6;8622:108;:::i;:::-;8614:116;;8364:373;;;;:::o;8743:116::-;8813:21;8828:5;8813:21;:::i;:::-;8806:5;8803:32;8793:60;;8849:1;8846;8839:12;8793:60;8743:116;:::o;8865:133::-;8908:5;8946:6;8933:20;8924:29;;8962:30;8986:5;8962:30;:::i;:::-;8865:133;;;;:::o;9004:468::-;9069:6;9077;9126:2;9114:9;9105:7;9101:23;9097:32;9094:119;;;9132:79;;:::i;:::-;9094:119;9252:1;9277:53;9322:7;9313:6;9302:9;9298:22;9277:53;:::i;:::-;9267:63;;9223:117;9379:2;9405:50;9447:7;9438:6;9427:9;9423:22;9405:50;:::i;:::-;9395:60;;9350:115;9004:468;;;;;:::o;9478:117::-;9587:1;9584;9577:12;9601:117;9710:1;9707;9700:12;9724:180;9772:77;9769:1;9762:88;9869:4;9866:1;9859:15;9893:4;9890:1;9883:15;9910:281;9993:27;10015:4;9993:27;:::i;:::-;9985:6;9981:40;10123:6;10111:10;10108:22;10087:18;10075:10;10072:34;10069:62;10066:88;;;10134:18;;:::i;:::-;10066:88;10174:10;10170:2;10163:22;9953:238;9910:281;;:::o;10197:129::-;10231:6;10258:20;;:::i;:::-;10248:30;;10287:33;10315:4;10307:6;10287:33;:::i;:::-;10197:129;;;:::o;10332:307::-;10393:4;10483:18;10475:6;10472:30;10469:56;;;10505:18;;:::i;:::-;10469:56;10543:29;10565:6;10543:29;:::i;:::-;10535:37;;10627:4;10621;10617:15;10609:23;;10332:307;;;:::o;10645:154::-;10729:6;10724:3;10719;10706:30;10791:1;10782:6;10777:3;10773:16;10766:27;10645:154;;;:::o;10805:410::-;10882:5;10907:65;10923:48;10964:6;10923:48;:::i;:::-;10907:65;:::i;:::-;10898:74;;10995:6;10988:5;10981:21;11033:4;11026:5;11022:16;11071:3;11062:6;11057:3;11053:16;11050:25;11047:112;;;11078:79;;:::i;:::-;11047:112;11168:41;11202:6;11197:3;11192;11168:41;:::i;:::-;10888:327;10805:410;;;;;:::o;11234:338::-;11289:5;11338:3;11331:4;11323:6;11319:17;11315:27;11305:122;;11346:79;;:::i;:::-;11305:122;11463:6;11450:20;11488:78;11562:3;11554:6;11547:4;11539:6;11535:17;11488:78;:::i;:::-;11479:87;;11295:277;11234:338;;;;:::o;11578:943::-;11673:6;11681;11689;11697;11746:3;11734:9;11725:7;11721:23;11717:33;11714:120;;;11753:79;;:::i;:::-;11714:120;11873:1;11898:53;11943:7;11934:6;11923:9;11919:22;11898:53;:::i;:::-;11888:63;;11844:117;12000:2;12026:53;12071:7;12062:6;12051:9;12047:22;12026:53;:::i;:::-;12016:63;;11971:118;12128:2;12154:53;12199:7;12190:6;12179:9;12175:22;12154:53;:::i;:::-;12144:63;;12099:118;12284:2;12273:9;12269:18;12256:32;12315:18;12307:6;12304:30;12301:117;;;12337:79;;:::i;:::-;12301:117;12442:62;12496:7;12487:6;12476:9;12472:22;12442:62;:::i;:::-;12432:72;;12227:287;11578:943;;;;;;;:::o;12527:323::-;12583:6;12632:2;12620:9;12611:7;12607:23;12603:32;12600:119;;;12638:79;;:::i;:::-;12600:119;12758:1;12783:50;12825:7;12816:6;12805:9;12801:22;12783:50;:::i;:::-;12773:60;;12729:114;12527:323;;;;:::o;12856:474::-;12924:6;12932;12981:2;12969:9;12960:7;12956:23;12952:32;12949:119;;;12987:79;;:::i;:::-;12949:119;13107:1;13132:53;13177:7;13168:6;13157:9;13153:22;13132:53;:::i;:::-;13122:63;;13078:117;13234:2;13260:53;13305:7;13296:6;13285:9;13281:22;13260:53;:::i;:::-;13250:63;;13205:118;12856:474;;;;;:::o;13336:308::-;13398:4;13488:18;13480:6;13477:30;13474:56;;;13510:18;;:::i;:::-;13474:56;13548:29;13570:6;13548:29;:::i;:::-;13540:37;;13632:4;13626;13622:15;13614:23;;13336:308;;;:::o;13650:412::-;13728:5;13753:66;13769:49;13811:6;13769:49;:::i;:::-;13753:66;:::i;:::-;13744:75;;13842:6;13835:5;13828:21;13880:4;13873:5;13869:16;13918:3;13909:6;13904:3;13900:16;13897:25;13894:112;;;13925:79;;:::i;:::-;13894:112;14015:41;14049:6;14044:3;14039;14015:41;:::i;:::-;13734:328;13650:412;;;;;:::o;14082:340::-;14138:5;14187:3;14180:4;14172:6;14168:17;14164:27;14154:122;;14195:79;;:::i;:::-;14154:122;14312:6;14299:20;14337:79;14412:3;14404:6;14397:4;14389:6;14385:17;14337:79;:::i;:::-;14328:88;;14144:278;14082:340;;;;:::o;14428:509::-;14497:6;14546:2;14534:9;14525:7;14521:23;14517:32;14514:119;;;14552:79;;:::i;:::-;14514:119;14700:1;14689:9;14685:17;14672:31;14730:18;14722:6;14719:30;14716:117;;;14752:79;;:::i;:::-;14716:117;14857:63;14912:7;14903:6;14892:9;14888:22;14857:63;:::i;:::-;14847:73;;14643:287;14428:509;;;;:::o;14943:180::-;14991:77;14988:1;14981:88;15088:4;15085:1;15078:15;15112:4;15109:1;15102:15;15129:320;15173:6;15210:1;15204:4;15200:12;15190:22;;15257:1;15251:4;15247:12;15278:18;15268:81;;15334:4;15326:6;15322:17;15312:27;;15268:81;15396:2;15388:6;15385:14;15365:18;15362:38;15359:84;;15415:18;;:::i;:::-;15359:84;15180:269;15129:320;;;:::o;15455:169::-;15595:21;15591:1;15583:6;15579:14;15572:45;15455:169;:::o;15630:366::-;15772:3;15793:67;15857:2;15852:3;15793:67;:::i;:::-;15786:74;;15869:93;15958:3;15869:93;:::i;:::-;15987:2;15982:3;15978:12;15971:19;;15630:366;;;:::o;16002:419::-;16168:4;16206:2;16195:9;16191:18;16183:26;;16255:9;16249:4;16245:20;16241:1;16230:9;16226:17;16219:47;16283:131;16409:4;16283:131;:::i;:::-;16275:139;;16002:419;;;:::o;16427:180::-;16475:77;16472:1;16465:88;16572:4;16569:1;16562:15;16596:4;16593:1;16586:15;16613:191;16653:4;16673:20;16691:1;16673:20;:::i;:::-;16668:25;;16707:20;16725:1;16707:20;:::i;:::-;16702:25;;16746:1;16743;16740:8;16737:34;;;16751:18;;:::i;:::-;16737:34;16796:1;16793;16789:9;16781:17;;16613:191;;;;:::o;16810:305::-;16850:3;16869:20;16887:1;16869:20;:::i;:::-;16864:25;;16903:20;16921:1;16903:20;:::i;:::-;16898:25;;17057:1;16989:66;16985:74;16982:1;16979:81;16976:107;;;17063:18;;:::i;:::-;16976:107;17107:1;17104;17100:9;17093:16;;16810:305;;;;:::o;17121:175::-;17261:27;17257:1;17249:6;17245:14;17238:51;17121:175;:::o;17302:366::-;17444:3;17465:67;17529:2;17524:3;17465:67;:::i;:::-;17458:74;;17541:93;17630:3;17541:93;:::i;:::-;17659:2;17654:3;17650:12;17643:19;;17302:366;;;:::o;17674:419::-;17840:4;17878:2;17867:9;17863:18;17855:26;;17927:9;17921:4;17917:20;17913:1;17902:9;17898:17;17891:47;17955:131;18081:4;17955:131;:::i;:::-;17947:139;;17674:419;;;:::o;18099:179::-;18239:31;18235:1;18227:6;18223:14;18216:55;18099:179;:::o;18284:366::-;18426:3;18447:67;18511:2;18506:3;18447:67;:::i;:::-;18440:74;;18523:93;18612:3;18523:93;:::i;:::-;18641:2;18636:3;18632:12;18625:19;;18284:366;;;:::o;18656:419::-;18822:4;18860:2;18849:9;18845:18;18837:26;;18909:9;18903:4;18899:20;18895:1;18884:9;18880:17;18873:47;18937:131;19063:4;18937:131;:::i;:::-;18929:139;;18656:419;;;:::o;19081:170::-;19221:22;19217:1;19209:6;19205:14;19198:46;19081:170;:::o;19257:366::-;19399:3;19420:67;19484:2;19479:3;19420:67;:::i;:::-;19413:74;;19496:93;19585:3;19496:93;:::i;:::-;19614:2;19609:3;19605:12;19598:19;;19257:366;;;:::o;19629:419::-;19795:4;19833:2;19822:9;19818:18;19810:26;;19882:9;19876:4;19872:20;19868:1;19857:9;19853:17;19846:47;19910:131;20036:4;19910:131;:::i;:::-;19902:139;;19629:419;;;:::o;20054:348::-;20094:7;20117:20;20135:1;20117:20;:::i;:::-;20112:25;;20151:20;20169:1;20151:20;:::i;:::-;20146:25;;20339:1;20271:66;20267:74;20264:1;20261:81;20256:1;20249:9;20242:17;20238:105;20235:131;;;20346:18;;:::i;:::-;20235:131;20394:1;20391;20387:9;20376:20;;20054:348;;;;:::o;20408:169::-;20548:21;20544:1;20536:6;20532:14;20525:45;20408:169;:::o;20583:366::-;20725:3;20746:67;20810:2;20805:3;20746:67;:::i;:::-;20739:74;;20822:93;20911:3;20822:93;:::i;:::-;20940:2;20935:3;20931:12;20924:19;;20583:366;;;:::o;20955:419::-;21121:4;21159:2;21148:9;21144:18;21136:26;;21208:9;21202:4;21198:20;21194:1;21183:9;21179:17;21172:47;21236:131;21362:4;21236:131;:::i;:::-;21228:139;;20955:419;;;:::o;21380:182::-;21520:34;21516:1;21508:6;21504:14;21497:58;21380:182;:::o;21568:366::-;21710:3;21731:67;21795:2;21790:3;21731:67;:::i;:::-;21724:74;;21807:93;21896:3;21807:93;:::i;:::-;21925:2;21920:3;21916:12;21909:19;;21568:366;;;:::o;21940:419::-;22106:4;22144:2;22133:9;22129:18;22121:26;;22193:9;22187:4;22183:20;22179:1;22168:9;22164:17;22157:47;22221:131;22347:4;22221:131;:::i;:::-;22213:139;;21940:419;;;:::o;22365:181::-;22505:33;22501:1;22493:6;22489:14;22482:57;22365:181;:::o;22552:366::-;22694:3;22715:67;22779:2;22774:3;22715:67;:::i;:::-;22708:74;;22791:93;22880:3;22791:93;:::i;:::-;22909:2;22904:3;22900:12;22893:19;;22552:366;;;:::o;22924:419::-;23090:4;23128:2;23117:9;23113:18;23105:26;;23177:9;23171:4;23167:20;23163:1;23152:9;23148:17;23141:47;23205:131;23331:4;23205:131;:::i;:::-;23197:139;;22924:419;;;:::o;23349:147::-;23450:11;23487:3;23472:18;;23349:147;;;;:::o;23502:114::-;;:::o;23622:398::-;23781:3;23802:83;23883:1;23878:3;23802:83;:::i;:::-;23795:90;;23894:93;23983:3;23894:93;:::i;:::-;24012:1;24007:3;24003:11;23996:18;;23622:398;;;:::o;24026:379::-;24210:3;24232:147;24375:3;24232:147;:::i;:::-;24225:154;;24396:3;24389:10;;24026:379;;;:::o;24411:170::-;24551:22;24547:1;24539:6;24535:14;24528:46;24411:170;:::o;24587:366::-;24729:3;24750:67;24814:2;24809:3;24750:67;:::i;:::-;24743:74;;24826:93;24915:3;24826:93;:::i;:::-;24944:2;24939:3;24935:12;24928:19;;24587:366;;;:::o;24959:419::-;25125:4;25163:2;25152:9;25148:18;25140:26;;25212:9;25206:4;25202:20;25198:1;25187:9;25183:17;25176:47;25240:131;25366:4;25240:131;:::i;:::-;25232:139;;24959:419;;;:::o;25384:159::-;25524:11;25520:1;25512:6;25508:14;25501:35;25384:159;:::o;25549:365::-;25691:3;25712:66;25776:1;25771:3;25712:66;:::i;:::-;25705:73;;25787:93;25876:3;25787:93;:::i;:::-;25905:2;25900:3;25896:12;25889:19;;25549:365;;;:::o;25920:419::-;26086:4;26124:2;26113:9;26109:18;26101:26;;26173:9;26167:4;26163:20;26159:1;26148:9;26144:17;26137:47;26201:131;26327:4;26201:131;:::i;:::-;26193:139;;25920:419;;;:::o;26345:180::-;26393:77;26390:1;26383:88;26490:4;26487:1;26480:15;26514:4;26511:1;26504:15;26531:234;26671:34;26667:1;26659:6;26655:14;26648:58;26740:17;26735:2;26727:6;26723:15;26716:42;26531:234;:::o;26771:366::-;26913:3;26934:67;26998:2;26993:3;26934:67;:::i;:::-;26927:74;;27010:93;27099:3;27010:93;:::i;:::-;27128:2;27123:3;27119:12;27112:19;;26771:366;;;:::o;27143:419::-;27309:4;27347:2;27336:9;27332:18;27324:26;;27396:9;27390:4;27386:20;27382:1;27371:9;27367:17;27360:47;27424:131;27550:4;27424:131;:::i;:::-;27416:139;;27143:419;;;:::o;27568:148::-;27670:11;27707:3;27692:18;;27568:148;;;;:::o;27722:377::-;27828:3;27856:39;27889:5;27856:39;:::i;:::-;27911:89;27993:6;27988:3;27911:89;:::i;:::-;27904:96;;28009:52;28054:6;28049:3;28042:4;28035:5;28031:16;28009:52;:::i;:::-;28086:6;28081:3;28077:16;28070:23;;27832:267;27722:377;;;;:::o;28105:141::-;28154:4;28177:3;28169:11;;28200:3;28197:1;28190:14;28234:4;28231:1;28221:18;28213:26;;28105:141;;;:::o;28276:874::-;28379:3;28416:5;28410:12;28445:36;28471:9;28445:36;:::i;:::-;28497:89;28579:6;28574:3;28497:89;:::i;:::-;28490:96;;28617:1;28606:9;28602:17;28633:1;28628:166;;;;28808:1;28803:341;;;;28595:549;;28628:166;28712:4;28708:9;28697;28693:25;28688:3;28681:38;28774:6;28767:14;28760:22;28752:6;28748:35;28743:3;28739:45;28732:52;;28628:166;;28803:341;28870:38;28902:5;28870:38;:::i;:::-;28930:1;28944:154;28958:6;28955:1;28952:13;28944:154;;;29032:7;29026:14;29022:1;29017:3;29013:11;29006:35;29082:1;29073:7;29069:15;29058:26;;28980:4;28977:1;28973:12;28968:17;;28944:154;;;29127:6;29122:3;29118:16;29111:23;;28810:334;;28595:549;;28383:767;;28276:874;;;;:::o;29156:589::-;29381:3;29403:95;29494:3;29485:6;29403:95;:::i;:::-;29396:102;;29515:95;29606:3;29597:6;29515:95;:::i;:::-;29508:102;;29627:92;29715:3;29706:6;29627:92;:::i;:::-;29620:99;;29736:3;29729:10;;29156:589;;;;;;:::o;29751:225::-;29891:34;29887:1;29879:6;29875:14;29868:58;29960:8;29955:2;29947:6;29943:15;29936:33;29751:225;:::o;29982:366::-;30124:3;30145:67;30209:2;30204:3;30145:67;:::i;:::-;30138:74;;30221:93;30310:3;30221:93;:::i;:::-;30339:2;30334:3;30330:12;30323:19;;29982:366;;;:::o;30354:419::-;30520:4;30558:2;30547:9;30543:18;30535:26;;30607:9;30601:4;30597:20;30593:1;30582:9;30578:17;30571:47;30635:131;30761:4;30635:131;:::i;:::-;30627:139;;30354:419;;;:::o;30779:93::-;30816:6;30863:2;30858;30851:5;30847:14;30843:23;30833:33;;30779:93;;;:::o;30878:107::-;30922:8;30972:5;30966:4;30962:16;30941:37;;30878:107;;;;:::o;30991:393::-;31060:6;31110:1;31098:10;31094:18;31133:97;31163:66;31152:9;31133:97;:::i;:::-;31251:39;31281:8;31270:9;31251:39;:::i;:::-;31239:51;;31323:4;31319:9;31312:5;31308:21;31299:30;;31372:4;31362:8;31358:19;31351:5;31348:30;31338:40;;31067:317;;30991:393;;;;;:::o;31390:60::-;31418:3;31439:5;31432:12;;31390:60;;;:::o;31456:142::-;31506:9;31539:53;31557:34;31566:24;31584:5;31566:24;:::i;:::-;31557:34;:::i;:::-;31539:53;:::i;:::-;31526:66;;31456:142;;;:::o;31604:75::-;31647:3;31668:5;31661:12;;31604:75;;;:::o;31685:269::-;31795:39;31826:7;31795:39;:::i;:::-;31856:91;31905:41;31929:16;31905:41;:::i;:::-;31897:6;31890:4;31884:11;31856:91;:::i;:::-;31850:4;31843:105;31761:193;31685:269;;;:::o;31960:73::-;32005:3;31960:73;:::o;32039:189::-;32116:32;;:::i;:::-;32157:65;32215:6;32207;32201:4;32157:65;:::i;:::-;32092:136;32039:189;;:::o;32234:186::-;32294:120;32311:3;32304:5;32301:14;32294:120;;;32365:39;32402:1;32395:5;32365:39;:::i;:::-;32338:1;32331:5;32327:13;32318:22;;32294:120;;;32234:186;;:::o;32426:543::-;32527:2;32522:3;32519:11;32516:446;;;32561:38;32593:5;32561:38;:::i;:::-;32645:29;32663:10;32645:29;:::i;:::-;32635:8;32631:44;32828:2;32816:10;32813:18;32810:49;;;32849:8;32834:23;;32810:49;32872:80;32928:22;32946:3;32928:22;:::i;:::-;32918:8;32914:37;32901:11;32872:80;:::i;:::-;32531:431;;32516:446;32426:543;;;:::o;32975:117::-;33029:8;33079:5;33073:4;33069:16;33048:37;;32975:117;;;;:::o;33098:169::-;33142:6;33175:51;33223:1;33219:6;33211:5;33208:1;33204:13;33175:51;:::i;:::-;33171:56;33256:4;33250;33246:15;33236:25;;33149:118;33098:169;;;;:::o;33272:295::-;33348:4;33494:29;33519:3;33513:4;33494:29;:::i;:::-;33486:37;;33556:3;33553:1;33549:11;33543:4;33540:21;33532:29;;33272:295;;;;:::o;33572:1395::-;33689:37;33722:3;33689:37;:::i;:::-;33791:18;33783:6;33780:30;33777:56;;;33813:18;;:::i;:::-;33777:56;33857:38;33889:4;33883:11;33857:38;:::i;:::-;33942:67;34002:6;33994;33988:4;33942:67;:::i;:::-;34036:1;34060:4;34047:17;;34092:2;34084:6;34081:14;34109:1;34104:618;;;;34766:1;34783:6;34780:77;;;34832:9;34827:3;34823:19;34817:26;34808:35;;34780:77;34883:67;34943:6;34936:5;34883:67;:::i;:::-;34877:4;34870:81;34739:222;34074:887;;34104:618;34156:4;34152:9;34144:6;34140:22;34190:37;34222:4;34190:37;:::i;:::-;34249:1;34263:208;34277:7;34274:1;34271:14;34263:208;;;34356:9;34351:3;34347:19;34341:26;34333:6;34326:42;34407:1;34399:6;34395:14;34385:24;;34454:2;34443:9;34439:18;34426:31;;34300:4;34297:1;34293:12;34288:17;;34263:208;;;34499:6;34490:7;34487:19;34484:179;;;34557:9;34552:3;34548:19;34542:26;34600:48;34642:4;34634:6;34630:17;34619:9;34600:48;:::i;:::-;34592:6;34585:64;34507:156;34484:179;34709:1;34705;34697:6;34693:14;34689:22;34683:4;34676:36;34111:611;;;34074:887;;33664:1303;;;33572:1395;;:::o;34973:98::-;35024:6;35058:5;35052:12;35042:22;;34973:98;;;:::o;35077:168::-;35160:11;35194:6;35189:3;35182:19;35234:4;35229:3;35225:14;35210:29;;35077:168;;;;:::o;35251:360::-;35337:3;35365:38;35397:5;35365:38;:::i;:::-;35419:70;35482:6;35477:3;35419:70;:::i;:::-;35412:77;;35498:52;35543:6;35538:3;35531:4;35524:5;35520:16;35498:52;:::i;:::-;35575:29;35597:6;35575:29;:::i;:::-;35570:3;35566:39;35559:46;;35341:270;35251:360;;;;:::o;35617:640::-;35812:4;35850:3;35839:9;35835:19;35827:27;;35864:71;35932:1;35921:9;35917:17;35908:6;35864:71;:::i;:::-;35945:72;36013:2;36002:9;35998:18;35989:6;35945:72;:::i;:::-;36027;36095:2;36084:9;36080:18;36071:6;36027:72;:::i;:::-;36146:9;36140:4;36136:20;36131:2;36120:9;36116:18;36109:48;36174:76;36245:4;36236:6;36174:76;:::i;:::-;36166:84;;35617:640;;;;;;;:::o;36263:141::-;36319:5;36350:6;36344:13;36335:22;;36366:32;36392:5;36366:32;:::i;:::-;36263:141;;;;:::o;36410:349::-;36479:6;36528:2;36516:9;36507:7;36503:23;36499:32;36496:119;;;36534:79;;:::i;:::-;36496:119;36654:1;36679:63;36734:7;36725:6;36714:9;36710:22;36679:63;:::i;:::-;36669:73;;36625:127;36410:349;;;;:::o;36765:233::-;36804:3;36827:24;36845:5;36827:24;:::i;:::-;36818:33;;36873:66;36866:5;36863:77;36860:103;;36943:18;;:::i;:::-;36860:103;36990:1;36983:5;36979:13;36972:20;;36765:233;;;:::o;37004:180::-;37052:77;37049:1;37042:88;37149:4;37146:1;37139:15;37173:4;37170:1;37163:15;37190:185;37230:1;37247:20;37265:1;37247:20;:::i;:::-;37242:25;;37281:20;37299:1;37281:20;:::i;:::-;37276:25;;37320:1;37310:35;;37325:18;;:::i;:::-;37310:35;37367:1;37364;37360:9;37355:14;;37190:185;;;;:::o;37381:176::-;37413:1;37430:20;37448:1;37430:20;:::i;:::-;37425:25;;37464:20;37482:1;37464:20;:::i;:::-;37459:25;;37503:1;37493:35;;37508:18;;:::i;:::-;37493:35;37549:1;37546;37542:9;37537:14;;37381:176;;;;:::o

Swarm Source

ipfs://96e3db5e188232dc249b3bb6b4c3814fc6c96a4db8638245e402e88c686ee5ea
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.