ETH Price: $3,472.60 (+0.06%)

Token

ThePhotonProject (PHTN)
 

Overview

Max Total Supply

142 PHTN

Holders

75

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 PHTN
0xea53bf838de65d565f4c45a265fb12f56fa4492e
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:
ThePhotonProject

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 11 of 12: PhotonProject.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./ERC721.sol";

contract ThePhotonProject is ERC721 {
    event Mint(address indexed from, uint256 indexed tokenId);

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }

    modifier onlyCollaborator() {
        bool isCollaborator = false;
        for (uint256 i; i < collaborators.length; i++) {
            if (collaborators[i].addr == msg.sender) {
                isCollaborator = true;

                break;
            }
        }

        require(
            owner() == _msgSender() || isCollaborator,
            "Ownable: caller is not the owner nor a collaborator"
        );

        _;
    }

    modifier claimStarted() {
        require(
            startClaimDate != 0 && startClaimDate <= block.timestamp,
            "You are too early"
        );

        _;
    }

    modifier presaleStarted() {
        require(
            startPresaleDate != 0 && startPresaleDate <= block.timestamp,
            "Presale not started yet"
        );

        _;
    }

    struct Collaborators {
        address addr;
        uint256 cut;
    }

    uint256 private startClaimDate = 1635094800;
    uint256 private startPresaleDate = 1635080400;
    uint256 private mintPrice = 60000000000000000;
    uint256 private totalTokens = 9998;
    uint256 private totalMintedTokens = 0;
    uint256 private maxPhotonPerTransaction = 20;
    uint128 private basisPoints = 10000;
    string private baseURI =
        "https://photonproject.s3.us-west-1.amazonaws.com/";
    uint256 public giveawayCount = 600;
    uint256 public giveawayAlreadyReserved = 0;
    uint256 public presaleLimit = 5000;
    uint256 public presaleMintedTokens = 0;

    mapping(address => uint256) private claimedPhotonPerWallet;

    uint16[] availablePhotons;
    Collaborators[] private collaborators;

    constructor() ERC721("ThePhotonProject", "PHTN") {}

    // ONLY OWNER

    /**
     * Sets the collaborators of the project with their cuts
     */
    function addCollaborators(Collaborators[] memory _collaborators)
        external
        onlyOwner
    {
        require(collaborators.length == 0, "Collaborators were already set");

        uint128 totalCut;
        for (uint256 i; i < _collaborators.length; i++) {
            collaborators.push(_collaborators[i]);
            totalCut += uint128(_collaborators[i].cut);
        }

        require(totalCut == basisPoints, "Total cut does not add to 100%");
    }

    // ONLY COLLABORATORS

    /**
     * @dev Allows to withdraw the Ether in the contract and split it among the collaborators
     */
    function withdraw() external onlyCollaborator {
        uint256 totalBalance = address(this).balance;

        for (uint256 i; i < collaborators.length; i++) {
            payable(collaborators[i].addr).transfer(
                mulScale(totalBalance, collaborators[i].cut, basisPoints)
            );
        }
    }

    /**
     * @dev Sets the base URI for the API that provides the NFT data.
     */
    function setBaseTokenURI(string memory _uri) external onlyCollaborator {
        baseURI = _uri;
    }

    /**
     * @dev Sets the claim price for each photon
     */
    function setMintPrice(uint256 _mintPrice) external onlyCollaborator {
        mintPrice = _mintPrice;
    }

    /**
     * @dev Populates the available photons
     */
    function addAvailablePhotons(uint16 from, uint16 to)
        external
        onlyCollaborator
    {
        for (uint16 i = from; i <= to; i++) {
            availablePhotons.push(i);
        }
    }

    /**
     * @dev Removes a chosen photon from the available list, only a utility function
     */
    function removePhotonFromAvailablePhotons(uint16 tokenId)
        external
        onlyCollaborator
    {
        for (uint16 i; i <= availablePhotons.length; i++) {
            if (availablePhotons[i] != tokenId) {
                continue;
            }

            availablePhotons[i] = availablePhotons[availablePhotons.length - 1];
            availablePhotons.pop();

            break;
        }
    }

    /**
     * @dev Sets the date that users can start claiming photons
     */
    function setStartClaimDate(uint256 _startClaimDate)
        external
        onlyCollaborator
    {
        startClaimDate = _startClaimDate;
    }

    /**
     * @dev Sets the date that users can start claiming photons for presale
     */
    function setStartPresaleDate(uint256 _startPresaleDate)
        external
        onlyCollaborator
    {
        startPresaleDate = _startPresaleDate;
    }

    /**
     * @dev Sets the presale limit for presale
     */
    function setPresaleLimit(uint256 _presaleLimit)
        external
        onlyCollaborator
    {
        presaleLimit = _presaleLimit;
    }

    /**
     * @dev Checks if a photon is in the available list
     */
    function isPhotonAvailable(uint16 tokenId)
        external
        view
        onlyCollaborator
        returns (bool)
    {
        for (uint16 i; i < availablePhotons.length; i++) {
            if (availablePhotons[i] == tokenId) {
                return true;
            }
        }

        return false;
    }


    /**
     * @dev Give random photons to the provided address
     */
    function reservePhotons(address _address, uint256 quantity)
        external
        onlyCollaborator
    {
        require(quantity <= (giveawayCount - giveawayAlreadyReserved), "Quantity is greater than giveaway count");
        require(availablePhotons.length >= quantity, "No photons left to be claimed");
        totalMintedTokens += quantity;
        giveawayAlreadyReserved += quantity;

        uint256[] memory tokenIds = new uint256[](quantity);

        for (uint256 i; i < quantity; i++) {
            tokenIds[i] = getPhotonToBeClaimed();
        }

        _batchMint(_address, tokenIds);
    }

    // END ONLY COLLABORATORS

    /**
     * @dev Claim a single Photon
     */
    function claimPhoton() external payable callerIsUser claimStarted returns (uint256) {
        require(msg.value >= mintPrice, "Not enough Ether to claim a photon");

        require(availablePhotons.length > 0, "Not enough photons left");

        require(availablePhotons.length - (giveawayCount - giveawayAlreadyReserved) > 0, "No photons left to be claimed");

        claimedPhotonPerWallet[msg.sender]++;
        totalMintedTokens++;

        uint256 tokenId = getPhotonToBeClaimed();

        _mint(msg.sender, tokenId);
        return tokenId;
    }

    /**
     * @dev Claim up to 20 photons at once
     */
    function claimPhotons(uint256 quantity)
        external
        payable
        callerIsUser
        claimStarted
        returns (uint256[] memory)
    {
        require(
            msg.value >= mintPrice * quantity,
            "Not enough Ether to claim the Photons"
        );
        
        require(quantity <= maxPhotonPerTransaction, "You can only claim 20 Photons per transaction");
        
        require(availablePhotons.length >= quantity, "Not enough photons left");

        require(availablePhotons.length - (giveawayCount - giveawayAlreadyReserved) >= quantity, "No Photons left to be claimed");

        uint256[] memory tokenIds = new uint256[](quantity);

        claimedPhotonPerWallet[msg.sender] += quantity;
        totalMintedTokens += quantity;

        for (uint256 i; i < quantity; i++) {
            tokenIds[i] = getPhotonToBeClaimed();
        }

        _batchMint(msg.sender, tokenIds);
        return tokenIds;
    }

    /**
     * @dev Claim up to 20 photons at once in presale
     */
    function presaleMintPhotons(uint256 quantity)
        external
        payable
        callerIsUser
        presaleStarted
        returns (uint256[] memory)
    {
        require(
            msg.value >= mintPrice * quantity,
            "Not enough Ether to claim the Photons"
        );
        
        require(quantity <= maxPhotonPerTransaction, "You can only claim 20 Photons per transactions");

        require(availablePhotons.length >= quantity, "Not enough photons left");

        require(availablePhotons.length - (giveawayCount - giveawayAlreadyReserved) >= quantity, "No Photons left to be claimed");

        require(quantity + presaleMintedTokens <= presaleLimit, "No more photons left for presale");

        uint256[] memory tokenIds = new uint256[](quantity);

        claimedPhotonPerWallet[msg.sender] += quantity;
        totalMintedTokens += quantity;
        presaleMintedTokens += quantity;

        for (uint256 i; i < quantity; i++) {
            tokenIds[i] = getPhotonToBeClaimed();
        }

        _batchMint(msg.sender, tokenIds);
        return tokenIds;
    }


    /**
     * @dev Returns the tokenId by index
     */
    function tokenByIndex(uint256 tokenId) external view returns (uint256) {
        require(
            _exists(tokenId),
            "ERC721: operator query for nonexistent token"
        );

        return tokenId;
    }

    /**
     * @dev Returns the base URI for the tokens API.
     */
    function baseTokenURI() external view returns (string memory) {
        return baseURI;
    }

    /**
     * @dev Returns how many Photons are still available to be claimed
     */
    function getAvailablePhotons() external view returns (uint256) {
        return availablePhotons.length;
    }

    /**
     * @dev Returns the claim price
     */
    function getmintPrice() external view returns (uint256) {
        return mintPrice;
    }

    /**
     * @dev Returns the total supply
     */
    function totalSupply() external view virtual returns (uint256) {
        return totalMintedTokens;
    }

    /**
     * @dev Returns the total minted tokens in presale
     */
    function totalPresaleMintCount() external view virtual returns (uint256) {
        return presaleMintedTokens;
    }

    // Private and Internal functions

    /**
     * @dev Returns a random available Photon to be claimed
     */
    function getPhotonToBeClaimed() private returns (uint256) {
        uint256 random = _getRandomNumber(availablePhotons.length);
        uint256 tokenId = uint256(availablePhotons[random]);

        availablePhotons[random] = availablePhotons[availablePhotons.length - 1];
        availablePhotons.pop();

        return tokenId;
    }

    /**
     * @dev Generates a pseudo-random number.
     */
    function _getRandomNumber(uint256 _upper) private view returns (uint256) {
        uint256 random = uint256(
            keccak256(
                abi.encodePacked(
                    availablePhotons.length,
                    blockhash(block.number - 1),
                    block.coinbase,
                    block.difficulty,
                    msg.sender
                )
            )
        );

        return random % _upper;
    }

    /**
     * @dev See {ERC721}.
     */
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    function mulScale(
        uint256 x,
        uint256 y,
        uint128 scale
    ) internal pure returns (uint256) {
        uint256 a = x / scale;
        uint256 b = x % scale;
        uint256 c = y / scale;
        uint256 d = y % scale;

        return a * c * scale + a * d + b * c + (b * d) / scale;
    }
}

File 1 of 12: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 2 of 12: Context.sol
// SPDX-License-Identifier: MIT

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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 3 of 12: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 4 of 12: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./IERC721Enumerable.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";
import "./Ownable.sol";
import "./Ownable.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, Ownable {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) internal _owners;

    // Mapping owner address to token count
    mapping(address => uint256) internal _balances;

    // 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;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC165, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            owner != address(0),
            "ERC721: balance query for the zero address"
        );
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        address owner = _owners[tokenId];
        require(
            owner != address(0),
            "ERC721: owner query for nonexistent token"
        );
        return owner;
    }

    /**
     * @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)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @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`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId)
        internal
        view
        virtual
        returns (bool)
    {
        require(
            _exists(tokenId),
            "ERC721: operator query for nonexistent token"
        );
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner ||
            getApproved(tokenId) == spender ||
            ERC721.isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    function _batchMint(address to, uint256[] memory tokenIds)
        internal
        virtual
    {
        require(to != address(0), "ERC721: mint to the zero address");
        _balances[to] += tokenIds.length;

        for (uint256 i; i < tokenIds.length; i++) {
            require(!_exists(tokenIds[i]), "ERC721: token already minted");

            _beforeTokenTransfer(address(0), to, tokenIds[i]);

            _owners[tokenIds[i]] = to;

            emit Transfer(address(0), to, tokenIds[i]);
        }
    }

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

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(
            ERC721.ownerOf(tokenId) == from,
            "ERC721: transfer of token that is not own"
        );
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a 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 _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
                IERC721Receiver(to).onERC721Received(
                    _msgSender(),
                    from,
                    tokenId,
                    _data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "ERC721: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     * 
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

File 5 of 12: IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 6 of 12: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 7 of 12: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 8 of 12: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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

File 9 of 12: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 10 of 12: Ownable.sol
// SPDX-License-Identifier: MIT

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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 12 of 12: Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Mint","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":"uint16","name":"from","type":"uint16"},{"internalType":"uint16","name":"to","type":"uint16"}],"name":"addAvailablePhotons","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"cut","type":"uint256"}],"internalType":"struct ThePhotonProject.Collaborators[]","name":"_collaborators","type":"tuple[]"}],"name":"addCollaborators","outputs":[],"stateMutability":"nonpayable","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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimPhoton","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"claimPhotons","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAvailablePhotons","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getmintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giveawayAlreadyReserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giveawayCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"isPhotonAvailable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"presaleMintPhotons","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleMintedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"removePhotonFromAvailablePhotons","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"reservePhotons","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presaleLimit","type":"uint256"}],"name":"setPresaleLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startClaimDate","type":"uint256"}],"name":"setStartClaimDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startPresaleDate","type":"uint256"}],"name":"setStartPresaleDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPresaleMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

636175911060075563617558d060085566d529ae9e86000060095561270e600a556000600b556014600c55600d80546001600160801b03191661271017905560e0604052603160808181529062003b2860a03980516200006891600e9160209091019062000167565b50610258600f55600060105561138860115560006012553480156200008c57600080fd5b506040518060400160405280601081526020016f151a19541a1bdd1bdb941c9bda9958dd60821b8152506040518060400160405280600481526020016328242a2760e11b8152506000620000e56200016360201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35081516200014490600190602085019062000167565b5080516200015a90600290602084019062000167565b5050506200024a565b3390565b82805462000175906200020d565b90600052602060002090601f016020900481019282620001995760008555620001e4565b82601f10620001b457805160ff1916838001178555620001e4565b82800160010185558215620001e4579182015b82811115620001e4578251825591602001919060010190620001c7565b50620001f2929150620001f6565b5090565b5b80821115620001f25760008155600101620001f7565b6002810460018216806200022257607f821691505b602082108114156200024457634e487b7160e01b600052602260045260246000fd5b50919050565b6138ce806200025a6000396000f3fe60806040526004361061023b5760003560e01c806370a082311161012e578063b7ce7299116100ab578063d5a29c871161006f578063d5a29c8714610643578063e985e9c51461064b578063e9be0f3f1461066b578063f2fde38b14610680578063f4a0a528146106a05761023b565b8063b7ce7299146105b9578063b88d4fde146105d9578063c87b56dd146105f9578063d293543e14610619578063d547cfb71461062e5761023b565b80638e28720c116100f25780638e28720c1461053157806395d89b4114610544578063a22cb46514610559578063a2b6ac3a14610579578063ad687e6a146105995761023b565b806370a08231146104b2578063715018a6146104d25780637fd255f1146104e75780638d482354146105075780638da5cb5b1461051c5761023b565b806330176e13116101bc5780634f6ccce7116101805780634f6ccce714610428578063525b3fe3146104485780636352211e1461045d5780636c40e34a1461047d5780636d44aef5146104925761023b565b806330176e131461039e57806332f145d5146103be5780633ccfd60b146103de578063403e03ab146103f357806342842e0e146104085761023b565b80630aad3a71116102035780630aad3a711461030757806318160ddd146103295780631fd28f141461033e57806323ab18f11461035e57806323b872dd1461037e5761023b565b806301ffc9a71461024057806306fdde0314610276578063081812fc146102985780630955f63c146102c5578063095ea7b3146102e7575b600080fd5b34801561024c57600080fd5b5061026061025b366004612cae565b6106c0565b60405161026d9190612eb3565b60405180910390f35b34801561028257600080fd5b5061028b610708565b60405161026d9190612ebe565b3480156102a457600080fd5b506102b86102b3366004612d6f565b61079a565b60405161026d9190612e1e565b3480156102d157600080fd5b506102e56102e0366004612bc8565b6107e6565b005b3480156102f357600080fd5b506102e5610302366004612b9f565b61093c565b34801561031357600080fd5b5061031c6109d4565b60405161026d91906136d4565b34801561033557600080fd5b5061031c6109da565b34801561034a57600080fd5b506102e5610359366004612d46565b6109e0565b34801561036a57600080fd5b506102e5610379366004612d6f565b610b1d565b34801561038a57600080fd5b506102e5610399366004612ab1565b610bdf565b3480156103aa57600080fd5b506102e56103b9366004612ce6565b610c17565b6103d16103cc366004612d6f565b610ce6565b60405161026d9190612e6f565b3480156103ea57600080fd5b506102e5610ed4565b3480156103ff57600080fd5b5061031c611075565b34801561041457600080fd5b506102e5610423366004612ab1565b61107b565b34801561043457600080fd5b5061031c610443366004612d6f565b611096565b34801561045457600080fd5b5061031c6110c1565b34801561046957600080fd5b506102b8610478366004612d6f565b6110c7565b34801561048957600080fd5b5061031c6110fc565b34801561049e57600080fd5b506102e56104ad366004612d6f565b611102565b3480156104be57600080fd5b5061031c6104cd366004612a65565b6111c4565b3480156104de57600080fd5b506102e5611208565b3480156104f357600080fd5b506102e5610502366004612d6f565b611291565b34801561051357600080fd5b5061031c611353565b34801561052857600080fd5b506102b8611359565b6103d161053f366004612d6f565b611368565b34801561055057600080fd5b5061028b611592565b34801561056557600080fd5b506102e5610574366004612b65565b6115a1565b34801561058557600080fd5b506102e5610594366004612d2c565b61166f565b3480156105a557600080fd5b506102606105b4366004612d2c565b611899565b3480156105c557600080fd5b506102e56105d4366004612b9f565b6119e1565b3480156105e557600080fd5b506102e56105f4366004612aec565b611bcf565b34801561060557600080fd5b5061028b610614366004612d6f565b611c08565b34801561062557600080fd5b5061031c611c8b565b34801561063a57600080fd5b5061028b611c91565b61031c611ca0565b34801561065757600080fd5b50610260610666366004612a7f565b611dbd565b34801561067757600080fd5b5061031c611deb565b34801561068c57600080fd5b506102e561069b366004612a65565b611df1565b3480156106ac57600080fd5b506102e56106bb366004612d6f565b611eb1565b60006001600160e01b031982166380ac58cd60e01b14806106f157506001600160e01b03198216635b5e139f60e01b145b80610700575061070082611f73565b90505b919050565b606060018054610717906137b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610743906137b7565b80156107905780601f1061076557610100808354040283529160200191610790565b820191906000526020600020905b81548152906001019060200180831161077357829003601f168201915b5050505050905090565b60006107a582611f8c565b6107ca5760405162461bcd60e51b81526004016107c190613394565b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6107ee611fa9565b6001600160a01b03166107ff611359565b6001600160a01b0316146108255760405162461bcd60e51b81526004016107c1906133e0565b601554156108455760405162461bcd60e51b81526004016107c190612fa0565b6000805b825181101561090a57601583828151811061087457634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825460018082018555600094855293839020825160029092020180546001600160a01b0319166001600160a01b0390921691909117815591015191015582518390829081106108df57634e487b7160e01b600052603260045260246000fd5b602002602001015160200151826108f69190613707565b9150806109028161380e565b915050610849565b50600d546001600160801b038281169116146109385760405162461bcd60e51b81526004016107c1906130d5565b5050565b6000610947826110c7565b9050806001600160a01b0316836001600160a01b0316141561097b5760405162461bcd60e51b81526004016107c190613537565b806001600160a01b031661098d611fa9565b6001600160a01b031614806109a957506109a981610666611fa9565b6109c55760405162461bcd60e51b81526004016107c19061318f565b6109cf8383611fad565b505050565b60125481565b600b5490565b6000805b601554811015610a5457336001600160a01b031660158281548110610a1957634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b03161415610a425760019150610a54565b80610a4c8161380e565b9150506109e4565b50610a5d611fa9565b6001600160a01b0316610a6e611359565b6001600160a01b03161480610a805750805b610a9c5760405162461bcd60e51b81526004016107c1906134e4565b825b8261ffff168161ffff1611610b1757601480546001810182556000919091527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec60108204018054600f9092166002026101000a61ffff818102199093169284160291909117905580610b0f816137ec565b915050610a9e565b50505050565b6000805b601554811015610b9157336001600160a01b031660158281548110610b5657634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b03161415610b7f5760019150610b91565b80610b898161380e565b915050610b21565b50610b9a611fa9565b6001600160a01b0316610bab611359565b6001600160a01b03161480610bbd5750805b610bd95760405162461bcd60e51b81526004016107c1906134e4565b50600755565b610bf0610bea611fa9565b8261201b565b610c0c5760405162461bcd60e51b81526004016107c190613578565b6109cf8383836120a0565b6000805b601554811015610c8b57336001600160a01b031660158281548110610c5057634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b03161415610c795760019150610c8b565b80610c838161380e565b915050610c1b565b50610c94611fa9565b6001600160a01b0316610ca5611359565b6001600160a01b03161480610cb75750805b610cd35760405162461bcd60e51b81526004016107c1906134e4565b81516109cf90600e906020850190612954565b6060323314610d075760405162461bcd60e51b81526004016107c190613158565b60075415801590610d1a57504260075411155b610d365760405162461bcd60e51b81526004016107c190613223565b81600954610d449190613755565b341015610d635760405162461bcd60e51b81526004016107c190613642565b600c54821115610d855760405162461bcd60e51b81526004016107c190613687565b601454821115610da75760405162461bcd60e51b81526004016107c1906131ec565b81601054600f54610db89190613774565b601454610dc59190613774565b1015610de35760405162461bcd60e51b81526004016107c19061360b565b60008267ffffffffffffffff811115610e0c57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610e35578160200160208202803683370190505b5033600090815260136020526040812080549293508592909190610e5a908490613729565b9250508190555082600b6000828254610e739190613729565b90915550600090505b83811015610ec957610e8c6121cd565b828281518110610eac57634e487b7160e01b600052603260045260246000fd5b602090810291909101015280610ec18161380e565b915050610e7c565b506107003382612324565b6000805b601554811015610f4857336001600160a01b031660158281548110610f0d57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b03161415610f365760019150610f48565b80610f408161380e565b915050610ed8565b50610f51611fa9565b6001600160a01b0316610f62611359565b6001600160a01b03161480610f745750805b610f905760405162461bcd60e51b81526004016107c1906134e4565b4760005b6015548110156109cf5760158181548110610fbf57634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160000160009054906101000a90046001600160a01b03166001600160a01b03166108fc61103a846015858154811061101557634e487b7160e01b600052603260045260246000fd5b6000918252602090912060016002909202010154600d546001600160801b03166124e0565b6040518115909202916000818181858888f19350505050158015611062573d6000803e3d6000fd5b508061106d8161380e565b915050610f94565b60125490565b6109cf83838360405180602001604052806000815250611bcf565b60006110a182611f8c565b6110bd5760405162461bcd60e51b81526004016107c19061310c565b5090565b60115481565b6000818152600360205260408120546001600160a01b0316806107005760405162461bcd60e51b81526004016107c190613298565b60105481565b6000805b60155481101561117657336001600160a01b03166015828154811061113b57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b031614156111645760019150611176565b8061116e8161380e565b915050611106565b5061117f611fa9565b6001600160a01b0316611190611359565b6001600160a01b031614806111a25750805b6111be5760405162461bcd60e51b81526004016107c1906134e4565b50600855565b60006001600160a01b0382166111ec5760405162461bcd60e51b81526004016107c19061324e565b506001600160a01b031660009081526004602052604090205490565b611210611fa9565b6001600160a01b0316611221611359565b6001600160a01b0316146112475760405162461bcd60e51b81526004016107c1906133e0565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000805b60155481101561130557336001600160a01b0316601582815481106112ca57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b031614156112f35760019150611305565b806112fd8161380e565b915050611295565b5061130e611fa9565b6001600160a01b031661131f611359565b6001600160a01b031614806113315750805b61134d5760405162461bcd60e51b81526004016107c1906134e4565b50601155565b60095490565b6000546001600160a01b031690565b60603233146113895760405162461bcd60e51b81526004016107c190613158565b6008541580159061139c57504260085411155b6113b85760405162461bcd60e51b81526004016107c1906134ad565b816009546113c69190613755565b3410156113e55760405162461bcd60e51b81526004016107c190613642565b600c548211156114075760405162461bcd60e51b81526004016107c190613087565b6014548211156114295760405162461bcd60e51b81526004016107c1906131ec565b81601054600f5461143a9190613774565b6014546114479190613774565b10156114655760405162461bcd60e51b81526004016107c19061360b565b6011546012546114759084613729565b11156114935760405162461bcd60e51b81526004016107c190613052565b60008267ffffffffffffffff8111156114bc57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156114e5578160200160208202803683370190505b503360009081526013602052604081208054929350859290919061150a908490613729565b9250508190555082600b60008282546115239190613729565b92505081905550826012600082825461153c9190613729565b90915550600090505b83811015610ec9576115556121cd565b82828151811061157557634e487b7160e01b600052603260045260246000fd5b60209081029190910101528061158a8161380e565b915050611545565b606060028054610717906137b7565b6115a9611fa9565b6001600160a01b0316826001600160a01b031614156115da5760405162461bcd60e51b81526004016107c19061301b565b80600660006115e7611fa9565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561162b611fa9565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116639190612eb3565b60405180910390a35050565b6000805b6015548110156116e357336001600160a01b0316601582815481106116a857634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b031614156116d157600191506116e3565b806116db8161380e565b915050611673565b506116ec611fa9565b6001600160a01b03166116fd611359565b6001600160a01b0316148061170f5750805b61172b5760405162461bcd60e51b81526004016107c1906134e4565b60005b60145461ffff8216116109cf578261ffff1660148261ffff168154811061176557634e487b7160e01b600052603260045260246000fd5b60009182526020909120601082040154600f9091166002026101000a900461ffff161461179157611887565b601480546117a190600190613774565b815481106117bf57634e487b7160e01b600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1660148261ffff168154811061180857634e487b7160e01b600052603260045260246000fd5b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff160217905550601480548061185657634e487b7160e01b600052603160045260246000fd5b600082815260209020601060001990920191820401805461ffff6002600f8516026101000a021916905590556109cf565b80611891816137ec565b91505061172e565b600080805b60155481101561190e57336001600160a01b0316601582815481106118d357634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b031614156118fc576001915061190e565b806119068161380e565b91505061189e565b50611917611fa9565b6001600160a01b0316611928611359565b6001600160a01b0316148061193a5750805b6119565760405162461bcd60e51b81526004016107c1906134e4565b60005b60145461ffff821610156119d5578361ffff1660148261ffff168154811061199157634e487b7160e01b600052603260045260246000fd5b60009182526020909120601082040154600f9091166002026101000a900461ffff1614156119c35760019250506119db565b806119cd816137ec565b915050611959565b50600091505b50919050565b6000805b601554811015611a5557336001600160a01b031660158281548110611a1a57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b03161415611a435760019150611a55565b80611a4d8161380e565b9150506119e5565b50611a5e611fa9565b6001600160a01b0316611a6f611359565b6001600160a01b03161480611a815750805b611a9d5760405162461bcd60e51b81526004016107c1906134e4565b601054600f54611aad9190613774565b821115611acc5760405162461bcd60e51b81526004016107c19061334d565b601454821115611aee5760405162461bcd60e51b81526004016107c1906132e1565b81600b6000828254611b009190613729565b925050819055508160106000828254611b199190613729565b90915550600090508267ffffffffffffffff811115611b4857634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611b71578160200160208202803683370190505b50905060005b83811015611bc457611b876121cd565b828281518110611ba757634e487b7160e01b600052603260045260246000fd5b602090810291909101015280611bbc8161380e565b915050611b77565b50610b178482612324565b611be0611bda611fa9565b8361201b565b611bfc5760405162461bcd60e51b81526004016107c190613578565b610b17848484846125b7565b6060611c1382611f8c565b611c2f5760405162461bcd60e51b81526004016107c19061345e565b6000611c39611c91565b90506000815111611c595760405180602001604052806000815250611c84565b80611c63846125ea565b604051602001611c74929190612db3565b6040516020818303038152906040525b9392505050565b60145490565b6060600e8054610717906137b7565b6000323314611cc15760405162461bcd60e51b81526004016107c190613158565b60075415801590611cd457504260075411155b611cf05760405162461bcd60e51b81526004016107c190613223565b600954341015611d125760405162461bcd60e51b81526004016107c1906135c9565b601454611d315760405162461bcd60e51b81526004016107c1906131ec565b6000601054600f54611d439190613774565b601454611d509190613774565b11611d6d5760405162461bcd60e51b81526004016107c1906132e1565b336000908152601360205260408120805491611d888361380e565b9091555050600b8054906000611d9d8361380e565b91905055506000611dac6121cd565b9050611db83382612705565b905090565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b600f5481565b611df9611fa9565b6001600160a01b0316611e0a611359565b6001600160a01b031614611e305760405162461bcd60e51b81526004016107c1906133e0565b6001600160a01b038116611e565760405162461bcd60e51b81526004016107c190612f23565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000805b601554811015611f2557336001600160a01b031660158281548110611eea57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b03161415611f135760019150611f25565b80611f1d8161380e565b915050611eb5565b50611f2e611fa9565b6001600160a01b0316611f3f611359565b6001600160a01b03161480611f515750805b611f6d5760405162461bcd60e51b81526004016107c1906134e4565b50600955565b6001600160e01b031981166301ffc9a760e01b14919050565b6000908152600360205260409020546001600160a01b0316151590565b3390565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611fe2826110c7565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061202682611f8c565b6120425760405162461bcd60e51b81526004016107c19061310c565b600061204d836110c7565b9050806001600160a01b0316846001600160a01b031614806120885750836001600160a01b031661207d8461079a565b6001600160a01b0316145b8061209857506120988185611dbd565b949350505050565b826001600160a01b03166120b3826110c7565b6001600160a01b0316146120d95760405162461bcd60e51b81526004016107c190613415565b6001600160a01b0382166120ff5760405162461bcd60e51b81526004016107c190612fd7565b61210a8383836109cf565b612115600082611fad565b6001600160a01b038316600090815260046020526040812080546001929061213e908490613774565b90915550506001600160a01b038216600090815260046020526040812080546001929061216c908490613729565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000806121de6014805490506127e4565b905060006014828154811061220357634e487b7160e01b600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff169050601460016014805490506122419190613774565b8154811061225f57634e487b7160e01b600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff16601483815481106122a457634e487b7160e01b600052603260045260246000fd5b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff16021790555060148054806122f257634e487b7160e01b600052603160045260246000fd5b600082815260209020601060001990920191820401805461ffff6002600f8516026101000a0219169055905591505090565b6001600160a01b03821661234a5760405162461bcd60e51b81526004016107c190613318565b80516001600160a01b03831660009081526004602052604081208054909190612374908490613729565b90915550600090505b81518110156109cf576123b68282815181106123a957634e487b7160e01b600052603260045260246000fd5b6020026020010151611f8c565b156123d35760405162461bcd60e51b81526004016107c190612f69565b6124066000848484815181106123f957634e487b7160e01b600052603260045260246000fd5b60200260200101516109cf565b826003600084848151811061242b57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081818151811061248557634e487b7160e01b600052603260045260246000fd5b6020026020010151836001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4806124d88161380e565b91505061237d565b6000806124f66001600160801b03841686613741565b9050600061250d6001600160801b03851687613829565b905060006125246001600160801b03861687613741565b9050600061253b6001600160801b03871688613829565b90506001600160801b0386166125518285613755565b61255b9190613741565b6125658385613755565b61256f8387613755565b6001600160801b0389166125838689613755565b61258d9190613755565b6125979190613729565b6125a19190613729565b6125ab9190613729565b98975050505050505050565b6125c28484846120a0565b6125ce84848484612833565b610b175760405162461bcd60e51b81526004016107c190612ed1565b60608161260f57506040805180820190915260018152600360fc1b6020820152610703565b8160005b811561263957806126238161380e565b91506126329050600a83613741565b9150612613565b60008167ffffffffffffffff81111561266257634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561268c576020820181803683370190505b5090505b8415612098576126a1600183613774565b91506126ae600a86613829565b6126b9906030613729565b60f81b8183815181106126dc57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506126fe600a86613741565b9450612690565b6001600160a01b03821661272b5760405162461bcd60e51b81526004016107c190613318565b61273481611f8c565b156127515760405162461bcd60e51b81526004016107c190612f69565b61275d600083836109cf565b6001600160a01b0382166000908152600460205260408120805460019290612786908490613729565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60145460009081906127f7600143613774565b4041443360405160200161280f959493929190612de2565b60408051601f1981840301815291905280516020909101209050611c848382613829565b6000612847846001600160a01b031661294e565b1561294357836001600160a01b031663150b7a02612863611fa9565b8786866040518563ffffffff1660e01b81526004016128859493929190612e32565b602060405180830381600087803b15801561289f57600080fd5b505af19250505080156128cf575060408051601f3d908101601f191682019092526128cc91810190612cca565b60015b612929573d8080156128fd576040519150601f19603f3d011682016040523d82523d6000602084013e612902565b606091505b5080516129215760405162461bcd60e51b81526004016107c190612ed1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612098565b506001949350505050565b3b151590565b828054612960906137b7565b90600052602060002090601f01602090048101928261298257600085556129c8565b82601f1061299b57805160ff19168380011785556129c8565b828001600101855582156129c8579182015b828111156129c85782518255916020019190600101906129ad565b506110bd9291505b808211156110bd57600081556001016129d0565b600067ffffffffffffffff8311156129fe576129fe613869565b612a11601f8401601f19166020016136dd565b9050828152838383011115612a2557600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461070357600080fd5b803561ffff8116811461070357600080fd5b600060208284031215612a76578081fd5b611c8482612a3c565b60008060408385031215612a91578081fd5b612a9a83612a3c565b9150612aa860208401612a3c565b90509250929050565b600080600060608486031215612ac5578081fd5b612ace84612a3c565b9250612adc60208501612a3c565b9150604084013590509250925092565b60008060008060808587031215612b01578081fd5b612b0a85612a3c565b9350612b1860208601612a3c565b925060408501359150606085013567ffffffffffffffff811115612b3a578182fd5b8501601f81018713612b4a578182fd5b612b59878235602084016129e4565b91505092959194509250565b60008060408385031215612b77578182fd5b612b8083612a3c565b915060208301358015158114612b94578182fd5b809150509250929050565b60008060408385031215612bb1578182fd5b612bba83612a3c565b946020939093013593505050565b60006020808385031215612bda578182fd5b823567ffffffffffffffff80821115612bf1578384fd5b818501915085601f830112612c04578384fd5b813581811115612c1657612c16613869565b612c2384858302016136dd565b818152848101908486016040808502870188018b1015612c41578889fd5b8896505b84871015612c9f5780828c031215612c5b578889fd5b80518181018181108882111715612c7457612c74613869565b8252612c7f83612a3c565b815282890135898201528452600196909601959287019290810190612c45565b50909998505050505050505050565b600060208284031215612cbf578081fd5b8135611c848161387f565b600060208284031215612cdb578081fd5b8151611c848161387f565b600060208284031215612cf7578081fd5b813567ffffffffffffffff811115612d0d578182fd5b8201601f81018413612d1d578182fd5b612098848235602084016129e4565b600060208284031215612d3d578081fd5b611c8482612a53565b60008060408385031215612d58578182fd5b612d6183612a53565b9150612aa860208401612a53565b600060208284031215612d80578081fd5b5035919050565b60008151808452612d9f81602086016020860161378b565b601f01601f19169290920160200192915050565b60008351612dc581846020880161378b565b835190830190612dd981836020880161378b565b01949350505050565b94855260208501939093526bffffffffffffffffffffffff19606092831b81166040860152605485019190915291901b16607482015260880190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612e6590830184612d87565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612ea757835183529284019291840191600101612e8b565b50909695505050505050565b901515815260200190565b600060208252611c846020830184612d87565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601e908201527f436f6c6c61626f7261746f7273207765726520616c7265616479207365740000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252818101527f4e6f206d6f72652070686f746f6e73206c65667420666f722070726573616c65604082015260600190565b6020808252602e908201527f596f752063616e206f6e6c7920636c61696d2032302050686f746f6e7320706560408201526d72207472616e73616374696f6e7360901b606082015260800190565b6020808252601e908201527f546f74616c2063757420646f6573206e6f742061646420746f20313030250000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252601e908201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b60208082526017908201527f4e6f7420656e6f7567682070686f746f6e73206c656674000000000000000000604082015260600190565b602080825260119082015270596f752061726520746f6f206561726c7960781b604082015260600190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252601d908201527f4e6f2070686f746f6e73206c65667420746f20626520636c61696d6564000000604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526027908201527f5175616e746974792069732067726561746572207468616e20676976656177616040820152661e4818dbdd5b9d60ca1b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526017908201527f50726573616c65206e6f74207374617274656420796574000000000000000000604082015260600190565b60208082526033908201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015272103737b910309031b7b63630b137b930ba37b960691b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526022908201527f4e6f7420656e6f75676820457468657220746f20636c61696d20612070686f7460408201526137b760f11b606082015260800190565b6020808252601d908201527f4e6f2050686f746f6e73206c65667420746f20626520636c61696d6564000000604082015260600190565b60208082526025908201527f4e6f7420656e6f75676820457468657220746f20636c61696d207468652050686040820152646f746f6e7360d81b606082015260800190565b6020808252602d908201527f596f752063616e206f6e6c7920636c61696d2032302050686f746f6e7320706560408201526c39103a3930b739b0b1ba34b7b760991b606082015260800190565b90815260200190565b60405181810167ffffffffffffffff811182821017156136ff576136ff613869565b604052919050565b60006001600160801b03808316818516808303821115612dd957612dd961383d565b6000821982111561373c5761373c61383d565b500190565b60008261375057613750613853565b500490565b600081600019048311821515161561376f5761376f61383d565b500290565b6000828210156137865761378661383d565b500390565b60005b838110156137a657818101518382015260200161378e565b83811115610b175750506000910152565b6002810460018216806137cb57607f821691505b602082108114156119db57634e487b7160e01b600052602260045260246000fd5b600061ffff808316818114156138045761380461383d565b6001019392505050565b60006000198214156138225761382261383d565b5060010190565b60008261383857613838613853565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461389557600080fd5b5056fea2646970667358221220fe90782feb61402bc7b02bb2ee96e08b8ce83e139f473f2a5c014be18a800e2c64736f6c6343000800003368747470733a2f2f70686f746f6e70726f6a6563742e73332e75732d776573742d312e616d617a6f6e6177732e636f6d2f

Deployed Bytecode

0x60806040526004361061023b5760003560e01c806370a082311161012e578063b7ce7299116100ab578063d5a29c871161006f578063d5a29c8714610643578063e985e9c51461064b578063e9be0f3f1461066b578063f2fde38b14610680578063f4a0a528146106a05761023b565b8063b7ce7299146105b9578063b88d4fde146105d9578063c87b56dd146105f9578063d293543e14610619578063d547cfb71461062e5761023b565b80638e28720c116100f25780638e28720c1461053157806395d89b4114610544578063a22cb46514610559578063a2b6ac3a14610579578063ad687e6a146105995761023b565b806370a08231146104b2578063715018a6146104d25780637fd255f1146104e75780638d482354146105075780638da5cb5b1461051c5761023b565b806330176e13116101bc5780634f6ccce7116101805780634f6ccce714610428578063525b3fe3146104485780636352211e1461045d5780636c40e34a1461047d5780636d44aef5146104925761023b565b806330176e131461039e57806332f145d5146103be5780633ccfd60b146103de578063403e03ab146103f357806342842e0e146104085761023b565b80630aad3a71116102035780630aad3a711461030757806318160ddd146103295780631fd28f141461033e57806323ab18f11461035e57806323b872dd1461037e5761023b565b806301ffc9a71461024057806306fdde0314610276578063081812fc146102985780630955f63c146102c5578063095ea7b3146102e7575b600080fd5b34801561024c57600080fd5b5061026061025b366004612cae565b6106c0565b60405161026d9190612eb3565b60405180910390f35b34801561028257600080fd5b5061028b610708565b60405161026d9190612ebe565b3480156102a457600080fd5b506102b86102b3366004612d6f565b61079a565b60405161026d9190612e1e565b3480156102d157600080fd5b506102e56102e0366004612bc8565b6107e6565b005b3480156102f357600080fd5b506102e5610302366004612b9f565b61093c565b34801561031357600080fd5b5061031c6109d4565b60405161026d91906136d4565b34801561033557600080fd5b5061031c6109da565b34801561034a57600080fd5b506102e5610359366004612d46565b6109e0565b34801561036a57600080fd5b506102e5610379366004612d6f565b610b1d565b34801561038a57600080fd5b506102e5610399366004612ab1565b610bdf565b3480156103aa57600080fd5b506102e56103b9366004612ce6565b610c17565b6103d16103cc366004612d6f565b610ce6565b60405161026d9190612e6f565b3480156103ea57600080fd5b506102e5610ed4565b3480156103ff57600080fd5b5061031c611075565b34801561041457600080fd5b506102e5610423366004612ab1565b61107b565b34801561043457600080fd5b5061031c610443366004612d6f565b611096565b34801561045457600080fd5b5061031c6110c1565b34801561046957600080fd5b506102b8610478366004612d6f565b6110c7565b34801561048957600080fd5b5061031c6110fc565b34801561049e57600080fd5b506102e56104ad366004612d6f565b611102565b3480156104be57600080fd5b5061031c6104cd366004612a65565b6111c4565b3480156104de57600080fd5b506102e5611208565b3480156104f357600080fd5b506102e5610502366004612d6f565b611291565b34801561051357600080fd5b5061031c611353565b34801561052857600080fd5b506102b8611359565b6103d161053f366004612d6f565b611368565b34801561055057600080fd5b5061028b611592565b34801561056557600080fd5b506102e5610574366004612b65565b6115a1565b34801561058557600080fd5b506102e5610594366004612d2c565b61166f565b3480156105a557600080fd5b506102606105b4366004612d2c565b611899565b3480156105c557600080fd5b506102e56105d4366004612b9f565b6119e1565b3480156105e557600080fd5b506102e56105f4366004612aec565b611bcf565b34801561060557600080fd5b5061028b610614366004612d6f565b611c08565b34801561062557600080fd5b5061031c611c8b565b34801561063a57600080fd5b5061028b611c91565b61031c611ca0565b34801561065757600080fd5b50610260610666366004612a7f565b611dbd565b34801561067757600080fd5b5061031c611deb565b34801561068c57600080fd5b506102e561069b366004612a65565b611df1565b3480156106ac57600080fd5b506102e56106bb366004612d6f565b611eb1565b60006001600160e01b031982166380ac58cd60e01b14806106f157506001600160e01b03198216635b5e139f60e01b145b80610700575061070082611f73565b90505b919050565b606060018054610717906137b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610743906137b7565b80156107905780601f1061076557610100808354040283529160200191610790565b820191906000526020600020905b81548152906001019060200180831161077357829003601f168201915b5050505050905090565b60006107a582611f8c565b6107ca5760405162461bcd60e51b81526004016107c190613394565b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6107ee611fa9565b6001600160a01b03166107ff611359565b6001600160a01b0316146108255760405162461bcd60e51b81526004016107c1906133e0565b601554156108455760405162461bcd60e51b81526004016107c190612fa0565b6000805b825181101561090a57601583828151811061087457634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825460018082018555600094855293839020825160029092020180546001600160a01b0319166001600160a01b0390921691909117815591015191015582518390829081106108df57634e487b7160e01b600052603260045260246000fd5b602002602001015160200151826108f69190613707565b9150806109028161380e565b915050610849565b50600d546001600160801b038281169116146109385760405162461bcd60e51b81526004016107c1906130d5565b5050565b6000610947826110c7565b9050806001600160a01b0316836001600160a01b0316141561097b5760405162461bcd60e51b81526004016107c190613537565b806001600160a01b031661098d611fa9565b6001600160a01b031614806109a957506109a981610666611fa9565b6109c55760405162461bcd60e51b81526004016107c19061318f565b6109cf8383611fad565b505050565b60125481565b600b5490565b6000805b601554811015610a5457336001600160a01b031660158281548110610a1957634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b03161415610a425760019150610a54565b80610a4c8161380e565b9150506109e4565b50610a5d611fa9565b6001600160a01b0316610a6e611359565b6001600160a01b03161480610a805750805b610a9c5760405162461bcd60e51b81526004016107c1906134e4565b825b8261ffff168161ffff1611610b1757601480546001810182556000919091527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec60108204018054600f9092166002026101000a61ffff818102199093169284160291909117905580610b0f816137ec565b915050610a9e565b50505050565b6000805b601554811015610b9157336001600160a01b031660158281548110610b5657634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b03161415610b7f5760019150610b91565b80610b898161380e565b915050610b21565b50610b9a611fa9565b6001600160a01b0316610bab611359565b6001600160a01b03161480610bbd5750805b610bd95760405162461bcd60e51b81526004016107c1906134e4565b50600755565b610bf0610bea611fa9565b8261201b565b610c0c5760405162461bcd60e51b81526004016107c190613578565b6109cf8383836120a0565b6000805b601554811015610c8b57336001600160a01b031660158281548110610c5057634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b03161415610c795760019150610c8b565b80610c838161380e565b915050610c1b565b50610c94611fa9565b6001600160a01b0316610ca5611359565b6001600160a01b03161480610cb75750805b610cd35760405162461bcd60e51b81526004016107c1906134e4565b81516109cf90600e906020850190612954565b6060323314610d075760405162461bcd60e51b81526004016107c190613158565b60075415801590610d1a57504260075411155b610d365760405162461bcd60e51b81526004016107c190613223565b81600954610d449190613755565b341015610d635760405162461bcd60e51b81526004016107c190613642565b600c54821115610d855760405162461bcd60e51b81526004016107c190613687565b601454821115610da75760405162461bcd60e51b81526004016107c1906131ec565b81601054600f54610db89190613774565b601454610dc59190613774565b1015610de35760405162461bcd60e51b81526004016107c19061360b565b60008267ffffffffffffffff811115610e0c57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610e35578160200160208202803683370190505b5033600090815260136020526040812080549293508592909190610e5a908490613729565b9250508190555082600b6000828254610e739190613729565b90915550600090505b83811015610ec957610e8c6121cd565b828281518110610eac57634e487b7160e01b600052603260045260246000fd5b602090810291909101015280610ec18161380e565b915050610e7c565b506107003382612324565b6000805b601554811015610f4857336001600160a01b031660158281548110610f0d57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b03161415610f365760019150610f48565b80610f408161380e565b915050610ed8565b50610f51611fa9565b6001600160a01b0316610f62611359565b6001600160a01b03161480610f745750805b610f905760405162461bcd60e51b81526004016107c1906134e4565b4760005b6015548110156109cf5760158181548110610fbf57634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160000160009054906101000a90046001600160a01b03166001600160a01b03166108fc61103a846015858154811061101557634e487b7160e01b600052603260045260246000fd5b6000918252602090912060016002909202010154600d546001600160801b03166124e0565b6040518115909202916000818181858888f19350505050158015611062573d6000803e3d6000fd5b508061106d8161380e565b915050610f94565b60125490565b6109cf83838360405180602001604052806000815250611bcf565b60006110a182611f8c565b6110bd5760405162461bcd60e51b81526004016107c19061310c565b5090565b60115481565b6000818152600360205260408120546001600160a01b0316806107005760405162461bcd60e51b81526004016107c190613298565b60105481565b6000805b60155481101561117657336001600160a01b03166015828154811061113b57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b031614156111645760019150611176565b8061116e8161380e565b915050611106565b5061117f611fa9565b6001600160a01b0316611190611359565b6001600160a01b031614806111a25750805b6111be5760405162461bcd60e51b81526004016107c1906134e4565b50600855565b60006001600160a01b0382166111ec5760405162461bcd60e51b81526004016107c19061324e565b506001600160a01b031660009081526004602052604090205490565b611210611fa9565b6001600160a01b0316611221611359565b6001600160a01b0316146112475760405162461bcd60e51b81526004016107c1906133e0565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000805b60155481101561130557336001600160a01b0316601582815481106112ca57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b031614156112f35760019150611305565b806112fd8161380e565b915050611295565b5061130e611fa9565b6001600160a01b031661131f611359565b6001600160a01b031614806113315750805b61134d5760405162461bcd60e51b81526004016107c1906134e4565b50601155565b60095490565b6000546001600160a01b031690565b60603233146113895760405162461bcd60e51b81526004016107c190613158565b6008541580159061139c57504260085411155b6113b85760405162461bcd60e51b81526004016107c1906134ad565b816009546113c69190613755565b3410156113e55760405162461bcd60e51b81526004016107c190613642565b600c548211156114075760405162461bcd60e51b81526004016107c190613087565b6014548211156114295760405162461bcd60e51b81526004016107c1906131ec565b81601054600f5461143a9190613774565b6014546114479190613774565b10156114655760405162461bcd60e51b81526004016107c19061360b565b6011546012546114759084613729565b11156114935760405162461bcd60e51b81526004016107c190613052565b60008267ffffffffffffffff8111156114bc57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156114e5578160200160208202803683370190505b503360009081526013602052604081208054929350859290919061150a908490613729565b9250508190555082600b60008282546115239190613729565b92505081905550826012600082825461153c9190613729565b90915550600090505b83811015610ec9576115556121cd565b82828151811061157557634e487b7160e01b600052603260045260246000fd5b60209081029190910101528061158a8161380e565b915050611545565b606060028054610717906137b7565b6115a9611fa9565b6001600160a01b0316826001600160a01b031614156115da5760405162461bcd60e51b81526004016107c19061301b565b80600660006115e7611fa9565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561162b611fa9565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116639190612eb3565b60405180910390a35050565b6000805b6015548110156116e357336001600160a01b0316601582815481106116a857634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b031614156116d157600191506116e3565b806116db8161380e565b915050611673565b506116ec611fa9565b6001600160a01b03166116fd611359565b6001600160a01b0316148061170f5750805b61172b5760405162461bcd60e51b81526004016107c1906134e4565b60005b60145461ffff8216116109cf578261ffff1660148261ffff168154811061176557634e487b7160e01b600052603260045260246000fd5b60009182526020909120601082040154600f9091166002026101000a900461ffff161461179157611887565b601480546117a190600190613774565b815481106117bf57634e487b7160e01b600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1660148261ffff168154811061180857634e487b7160e01b600052603260045260246000fd5b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff160217905550601480548061185657634e487b7160e01b600052603160045260246000fd5b600082815260209020601060001990920191820401805461ffff6002600f8516026101000a021916905590556109cf565b80611891816137ec565b91505061172e565b600080805b60155481101561190e57336001600160a01b0316601582815481106118d357634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b031614156118fc576001915061190e565b806119068161380e565b91505061189e565b50611917611fa9565b6001600160a01b0316611928611359565b6001600160a01b0316148061193a5750805b6119565760405162461bcd60e51b81526004016107c1906134e4565b60005b60145461ffff821610156119d5578361ffff1660148261ffff168154811061199157634e487b7160e01b600052603260045260246000fd5b60009182526020909120601082040154600f9091166002026101000a900461ffff1614156119c35760019250506119db565b806119cd816137ec565b915050611959565b50600091505b50919050565b6000805b601554811015611a5557336001600160a01b031660158281548110611a1a57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b03161415611a435760019150611a55565b80611a4d8161380e565b9150506119e5565b50611a5e611fa9565b6001600160a01b0316611a6f611359565b6001600160a01b03161480611a815750805b611a9d5760405162461bcd60e51b81526004016107c1906134e4565b601054600f54611aad9190613774565b821115611acc5760405162461bcd60e51b81526004016107c19061334d565b601454821115611aee5760405162461bcd60e51b81526004016107c1906132e1565b81600b6000828254611b009190613729565b925050819055508160106000828254611b199190613729565b90915550600090508267ffffffffffffffff811115611b4857634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611b71578160200160208202803683370190505b50905060005b83811015611bc457611b876121cd565b828281518110611ba757634e487b7160e01b600052603260045260246000fd5b602090810291909101015280611bbc8161380e565b915050611b77565b50610b178482612324565b611be0611bda611fa9565b8361201b565b611bfc5760405162461bcd60e51b81526004016107c190613578565b610b17848484846125b7565b6060611c1382611f8c565b611c2f5760405162461bcd60e51b81526004016107c19061345e565b6000611c39611c91565b90506000815111611c595760405180602001604052806000815250611c84565b80611c63846125ea565b604051602001611c74929190612db3565b6040516020818303038152906040525b9392505050565b60145490565b6060600e8054610717906137b7565b6000323314611cc15760405162461bcd60e51b81526004016107c190613158565b60075415801590611cd457504260075411155b611cf05760405162461bcd60e51b81526004016107c190613223565b600954341015611d125760405162461bcd60e51b81526004016107c1906135c9565b601454611d315760405162461bcd60e51b81526004016107c1906131ec565b6000601054600f54611d439190613774565b601454611d509190613774565b11611d6d5760405162461bcd60e51b81526004016107c1906132e1565b336000908152601360205260408120805491611d888361380e565b9091555050600b8054906000611d9d8361380e565b91905055506000611dac6121cd565b9050611db83382612705565b905090565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b600f5481565b611df9611fa9565b6001600160a01b0316611e0a611359565b6001600160a01b031614611e305760405162461bcd60e51b81526004016107c1906133e0565b6001600160a01b038116611e565760405162461bcd60e51b81526004016107c190612f23565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000805b601554811015611f2557336001600160a01b031660158281548110611eea57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b03161415611f135760019150611f25565b80611f1d8161380e565b915050611eb5565b50611f2e611fa9565b6001600160a01b0316611f3f611359565b6001600160a01b03161480611f515750805b611f6d5760405162461bcd60e51b81526004016107c1906134e4565b50600955565b6001600160e01b031981166301ffc9a760e01b14919050565b6000908152600360205260409020546001600160a01b0316151590565b3390565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611fe2826110c7565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061202682611f8c565b6120425760405162461bcd60e51b81526004016107c19061310c565b600061204d836110c7565b9050806001600160a01b0316846001600160a01b031614806120885750836001600160a01b031661207d8461079a565b6001600160a01b0316145b8061209857506120988185611dbd565b949350505050565b826001600160a01b03166120b3826110c7565b6001600160a01b0316146120d95760405162461bcd60e51b81526004016107c190613415565b6001600160a01b0382166120ff5760405162461bcd60e51b81526004016107c190612fd7565b61210a8383836109cf565b612115600082611fad565b6001600160a01b038316600090815260046020526040812080546001929061213e908490613774565b90915550506001600160a01b038216600090815260046020526040812080546001929061216c908490613729565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000806121de6014805490506127e4565b905060006014828154811061220357634e487b7160e01b600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff169050601460016014805490506122419190613774565b8154811061225f57634e487b7160e01b600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff16601483815481106122a457634e487b7160e01b600052603260045260246000fd5b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff16021790555060148054806122f257634e487b7160e01b600052603160045260246000fd5b600082815260209020601060001990920191820401805461ffff6002600f8516026101000a0219169055905591505090565b6001600160a01b03821661234a5760405162461bcd60e51b81526004016107c190613318565b80516001600160a01b03831660009081526004602052604081208054909190612374908490613729565b90915550600090505b81518110156109cf576123b68282815181106123a957634e487b7160e01b600052603260045260246000fd5b6020026020010151611f8c565b156123d35760405162461bcd60e51b81526004016107c190612f69565b6124066000848484815181106123f957634e487b7160e01b600052603260045260246000fd5b60200260200101516109cf565b826003600084848151811061242b57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081818151811061248557634e487b7160e01b600052603260045260246000fd5b6020026020010151836001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4806124d88161380e565b91505061237d565b6000806124f66001600160801b03841686613741565b9050600061250d6001600160801b03851687613829565b905060006125246001600160801b03861687613741565b9050600061253b6001600160801b03871688613829565b90506001600160801b0386166125518285613755565b61255b9190613741565b6125658385613755565b61256f8387613755565b6001600160801b0389166125838689613755565b61258d9190613755565b6125979190613729565b6125a19190613729565b6125ab9190613729565b98975050505050505050565b6125c28484846120a0565b6125ce84848484612833565b610b175760405162461bcd60e51b81526004016107c190612ed1565b60608161260f57506040805180820190915260018152600360fc1b6020820152610703565b8160005b811561263957806126238161380e565b91506126329050600a83613741565b9150612613565b60008167ffffffffffffffff81111561266257634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561268c576020820181803683370190505b5090505b8415612098576126a1600183613774565b91506126ae600a86613829565b6126b9906030613729565b60f81b8183815181106126dc57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506126fe600a86613741565b9450612690565b6001600160a01b03821661272b5760405162461bcd60e51b81526004016107c190613318565b61273481611f8c565b156127515760405162461bcd60e51b81526004016107c190612f69565b61275d600083836109cf565b6001600160a01b0382166000908152600460205260408120805460019290612786908490613729565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60145460009081906127f7600143613774565b4041443360405160200161280f959493929190612de2565b60408051601f1981840301815291905280516020909101209050611c848382613829565b6000612847846001600160a01b031661294e565b1561294357836001600160a01b031663150b7a02612863611fa9565b8786866040518563ffffffff1660e01b81526004016128859493929190612e32565b602060405180830381600087803b15801561289f57600080fd5b505af19250505080156128cf575060408051601f3d908101601f191682019092526128cc91810190612cca565b60015b612929573d8080156128fd576040519150601f19603f3d011682016040523d82523d6000602084013e612902565b606091505b5080516129215760405162461bcd60e51b81526004016107c190612ed1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612098565b506001949350505050565b3b151590565b828054612960906137b7565b90600052602060002090601f01602090048101928261298257600085556129c8565b82601f1061299b57805160ff19168380011785556129c8565b828001600101855582156129c8579182015b828111156129c85782518255916020019190600101906129ad565b506110bd9291505b808211156110bd57600081556001016129d0565b600067ffffffffffffffff8311156129fe576129fe613869565b612a11601f8401601f19166020016136dd565b9050828152838383011115612a2557600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461070357600080fd5b803561ffff8116811461070357600080fd5b600060208284031215612a76578081fd5b611c8482612a3c565b60008060408385031215612a91578081fd5b612a9a83612a3c565b9150612aa860208401612a3c565b90509250929050565b600080600060608486031215612ac5578081fd5b612ace84612a3c565b9250612adc60208501612a3c565b9150604084013590509250925092565b60008060008060808587031215612b01578081fd5b612b0a85612a3c565b9350612b1860208601612a3c565b925060408501359150606085013567ffffffffffffffff811115612b3a578182fd5b8501601f81018713612b4a578182fd5b612b59878235602084016129e4565b91505092959194509250565b60008060408385031215612b77578182fd5b612b8083612a3c565b915060208301358015158114612b94578182fd5b809150509250929050565b60008060408385031215612bb1578182fd5b612bba83612a3c565b946020939093013593505050565b60006020808385031215612bda578182fd5b823567ffffffffffffffff80821115612bf1578384fd5b818501915085601f830112612c04578384fd5b813581811115612c1657612c16613869565b612c2384858302016136dd565b818152848101908486016040808502870188018b1015612c41578889fd5b8896505b84871015612c9f5780828c031215612c5b578889fd5b80518181018181108882111715612c7457612c74613869565b8252612c7f83612a3c565b815282890135898201528452600196909601959287019290810190612c45565b50909998505050505050505050565b600060208284031215612cbf578081fd5b8135611c848161387f565b600060208284031215612cdb578081fd5b8151611c848161387f565b600060208284031215612cf7578081fd5b813567ffffffffffffffff811115612d0d578182fd5b8201601f81018413612d1d578182fd5b612098848235602084016129e4565b600060208284031215612d3d578081fd5b611c8482612a53565b60008060408385031215612d58578182fd5b612d6183612a53565b9150612aa860208401612a53565b600060208284031215612d80578081fd5b5035919050565b60008151808452612d9f81602086016020860161378b565b601f01601f19169290920160200192915050565b60008351612dc581846020880161378b565b835190830190612dd981836020880161378b565b01949350505050565b94855260208501939093526bffffffffffffffffffffffff19606092831b81166040860152605485019190915291901b16607482015260880190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612e6590830184612d87565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612ea757835183529284019291840191600101612e8b565b50909695505050505050565b901515815260200190565b600060208252611c846020830184612d87565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601e908201527f436f6c6c61626f7261746f7273207765726520616c7265616479207365740000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252818101527f4e6f206d6f72652070686f746f6e73206c65667420666f722070726573616c65604082015260600190565b6020808252602e908201527f596f752063616e206f6e6c7920636c61696d2032302050686f746f6e7320706560408201526d72207472616e73616374696f6e7360901b606082015260800190565b6020808252601e908201527f546f74616c2063757420646f6573206e6f742061646420746f20313030250000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252601e908201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b60208082526017908201527f4e6f7420656e6f7567682070686f746f6e73206c656674000000000000000000604082015260600190565b602080825260119082015270596f752061726520746f6f206561726c7960781b604082015260600190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252601d908201527f4e6f2070686f746f6e73206c65667420746f20626520636c61696d6564000000604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526027908201527f5175616e746974792069732067726561746572207468616e20676976656177616040820152661e4818dbdd5b9d60ca1b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526017908201527f50726573616c65206e6f74207374617274656420796574000000000000000000604082015260600190565b60208082526033908201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015272103737b910309031b7b63630b137b930ba37b960691b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526022908201527f4e6f7420656e6f75676820457468657220746f20636c61696d20612070686f7460408201526137b760f11b606082015260800190565b6020808252601d908201527f4e6f2050686f746f6e73206c65667420746f20626520636c61696d6564000000604082015260600190565b60208082526025908201527f4e6f7420656e6f75676820457468657220746f20636c61696d207468652050686040820152646f746f6e7360d81b606082015260800190565b6020808252602d908201527f596f752063616e206f6e6c7920636c61696d2032302050686f746f6e7320706560408201526c39103a3930b739b0b1ba34b7b760991b606082015260800190565b90815260200190565b60405181810167ffffffffffffffff811182821017156136ff576136ff613869565b604052919050565b60006001600160801b03808316818516808303821115612dd957612dd961383d565b6000821982111561373c5761373c61383d565b500190565b60008261375057613750613853565b500490565b600081600019048311821515161561376f5761376f61383d565b500290565b6000828210156137865761378661383d565b500390565b60005b838110156137a657818101518382015260200161378e565b83811115610b175750506000910152565b6002810460018216806137cb57607f821691505b602082108114156119db57634e487b7160e01b600052602260045260246000fd5b600061ffff808316818114156138045761380461383d565b6001019392505050565b60006000198214156138225761382261383d565b5060010190565b60008261383857613838613853565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461389557600080fd5b5056fea2646970667358221220fe90782feb61402bc7b02bb2ee96e08b8ce83e139f473f2a5c014be18a800e2c64736f6c63430008000033

Deployed Bytecode Sourcemap

81:11293:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1524:344:3;;;;;;;;;;-1:-1:-1;1524:344:3;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2642:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4188:295::-;;;;;;;;;;-1:-1:-1;4188:295:3;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2078:468:10:-;;;;;;;;;;-1:-1:-1;2078:468:10;;;;;:::i;:::-;;:::i;:::-;;3703:424:3;;;;;;;;;;-1:-1:-1;3703:424:3;;;;;:::i;:::-;;:::i;1740:38:10:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;9633:104::-;;;;;;;;;;;;;:::i;3444:200::-;;;;;;;;;;-1:-1:-1;3444:200:10;;;;;:::i;:::-;;:::i;4246:147::-;;;;;;;;;;-1:-1:-1;4246:147:10;;;;;:::i;:::-;;:::i;5202:364:3:-;;;;;;;;;;-1:-1:-1;5202:364:3;;;;;:::i;:::-;;:::i;3098:102:10:-;;;;;;;;;;-1:-1:-1;3098:102:10;;;;;:::i;:::-;;:::i;6644:954::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2689:317::-;;;;;;;;;;;;;:::i;9814:116::-;;;;;;;;;;;;;:::i;5632:179:3:-;;;;;;;;;;-1:-1:-1;5632:179:3;;;;;:::i;:::-;;:::i;8836:220:10:-;;;;;;;;;;-1:-1:-1;8836:220:10;;;;;:::i;:::-;;:::i;1700:34::-;;;;;;;;;;;;;:::i;2267:313:3:-;;;;;;;;;;-1:-1:-1;2267:313:3;;;;;:::i;:::-;;:::i;1652:42:10:-;;;;;;;;;;;;;:::i;4491:155::-;;;;;;;;;;-1:-1:-1;4491:155:10;;;;;:::i;:::-;;:::i;1927:283:3:-;;;;;;;;;;-1:-1:-1;1927:283:3;;;;;:::i;:::-;;:::i;1693:145:9:-;;;;;;;;;;;;;:::i;4715:139:10:-;;;;;;;;;;-1:-1:-1;4715:139:10;;;;;:::i;:::-;;:::i;9485:89::-;;;;;;;;;;;;;:::i;1061:85:9:-;;;;;;;;;;;;;:::i;7674:1098:10:-;;;;;;:::i;:::-;;:::i;2804:102:3:-;;;;;;;;;;;;;:::i;4550:318::-;;;;;;;;;;-1:-1:-1;4550:318:3;;;;;:::i;:::-;;:::i;3751:409:10:-;;;;;;;;;;-1:-1:-1;3751:409:10;;;;;:::i;:::-;;:::i;4932:317::-;;;;;;;;;;-1:-1:-1;4932:317:10;;;;;:::i;:::-;;:::i;5328:608::-;;;;;;;;;;-1:-1:-1;5328:608:10;;;;;:::i;:::-;;:::i;5877:354:3:-;;;;;;;;;;-1:-1:-1;5877:354:3;;;;;:::i;:::-;;:::i;2972:451::-;;;;;;;;;;-1:-1:-1;2972:451:3;;;;;:::i;:::-;;:::i;9317:110:10:-;;;;;;;;;;;;;:::i;9131:93::-;;;;;;;;;;;;;:::i;6023:556::-;;;:::i;4934:206:3:-;;;;;;;;;;-1:-1:-1;4934:206:3;;;;;:::i;:::-;;:::i;1612:34:10:-;;;;;;;;;;;;;:::i;1987:240:9:-;;;;;;;;;;-1:-1:-1;1987:240:9;;;;;:::i;:::-;;:::i;3271:107:10:-;;;;;;;;;;-1:-1:-1;3271:107:10;;;;;:::i;:::-;;:::i;1524:344:3:-;1666:4;-1:-1:-1;;;;;;1705:40:3;;-1:-1:-1;;;1705:40:3;;:104;;-1:-1:-1;;;;;;;1761:48:3;;-1:-1:-1;;;1761:48:3;1705:104;:156;;;;1825:36;1849:11;1825:23;:36::i;:::-;1686:175;;1524:344;;;;:::o;2642:98::-;2696:13;2728:5;2721:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2642:98;:::o;4188:295::-;4304:7;4348:16;4356:7;4348;:16::i;:::-;4327:107;;;;-1:-1:-1;;;4327:107:3;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;4452:24:3;;;;:15;:24;;;;;;-1:-1:-1;;;;;4452:24:3;;4188:295::o;2078:468:10:-;1284:12:9;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:9;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:9;;1265:68;;;;-1:-1:-1;;;1265:68:9;;;;;;;:::i;:::-;2200:13:10::1;:20:::0;:25;2192:68:::1;;;;-1:-1:-1::0;;;2192:68:10::1;;;;;;;:::i;:::-;2271:16;2302:9:::0;2297:166:::1;2317:14;:21;2313:1;:25;2297:166;;;2359:13;2378:14;2393:1;2378:17;;;;;;-1:-1:-1::0;;;2378:17:10::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;2359:37;;::::1;::::0;;::::1;::::0;;-1:-1:-1;2359:37:10;;;;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;;2359:37:10::1;-1:-1:-1::0;;;;;2359:37:10;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;2430:17;;;;2445:1;;2430:17;::::1;;;-1:-1:-1::0;;;2430:17:10::1;;;;;;;;;;;;;;;:21;;;2410:42;;;;;:::i;:::-;::::0;-1:-1:-1;2340:3:10;::::1;::::0;::::1;:::i;:::-;;;;2297:166;;;-1:-1:-1::0;2493:11:10::1;::::0;-1:-1:-1;;;;;2481:23:10;;::::1;2493:11:::0;::::1;2481:23;2473:66;;;;-1:-1:-1::0;;;2473:66:10::1;;;;;;;:::i;:::-;1343:1:9;2078:468:10::0;:::o;3703:424:3:-;3783:13;3799:23;3814:7;3799:14;:23::i;:::-;3783:39;;3846:5;-1:-1:-1;;;;;3840:11:3;:2;-1:-1:-1;;;;;3840:11:3;;;3832:57;;;;-1:-1:-1;;;3832:57:3;;;;;;;:::i;:::-;3937:5;-1:-1:-1;;;;;3921:21:3;:12;:10;:12::i;:::-;-1:-1:-1;;;;;3921:21:3;;:85;;;;3962:44;3986:5;3993:12;:10;:12::i;3962:44::-;3900:188;;;;-1:-1:-1;;;3900:188:3;;;;;;;:::i;:::-;4099:21;4108:2;4112:7;4099:8;:21::i;:::-;3703:424;;;:::o;1740:38:10:-;;;;:::o;9633:104::-;9713:17;;9633:104;:::o;3444:200::-;349:19;391:9;386:190;406:13;:20;402:24;;386:190;;;476:10;-1:-1:-1;;;;;451:35:10;:13;465:1;451:16;;;;;;-1:-1:-1;;;451:16:10;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;451:21:10;:35;447:119;;;523:4;506:21;;546:5;;447:119;428:3;;;;:::i;:::-;;;;386:190;;;;618:12;:10;:12::i;:::-;-1:-1:-1;;;;;607:23:10;:7;:5;:7::i;:::-;-1:-1:-1;;;;;607:23:10;;:41;;;;634:14;607:41;586:139;;;;-1:-1:-1;;;586:139:10;;;;;;;:::i;:::-;3569:4;3553:85:::1;3580:2;3575:7;;:1;:7;;;3553:85;;3603:16;:24:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;3603:24:10;;;;;::::1;::::0;::::1;;::::0;;;;;;::::1;;;;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;;3584:3:::1;3603:24:::0;3584:3:::1;:::i;:::-;;;;3553:85;;;;3444:200:::0;;;:::o;4246:147::-;349:19;391:9;386:190;406:13;:20;402:24;;386:190;;;476:10;-1:-1:-1;;;;;451:35:10;:13;465:1;451:16;;;;;;-1:-1:-1;;;451:16:10;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;451:21:10;:35;447:119;;;523:4;506:21;;546:5;;447:119;428:3;;;;:::i;:::-;;;;386:190;;;;618:12;:10;:12::i;:::-;-1:-1:-1;;;;;607:23:10;:7;:5;:7::i;:::-;-1:-1:-1;;;;;607:23:10;;:41;;;;634:14;607:41;586:139;;;;-1:-1:-1;;;586:139:10;;;;;;;:::i;:::-;-1:-1:-1;4354:14:10::1;:32:::0;4246:147::o;5202:364:3:-;5404:41;5423:12;:10;:12::i;:::-;5437:7;5404:18;:41::i;:::-;5383:137;;;;-1:-1:-1;;;5383:137:3;;;;;;;:::i;:::-;5531:28;5541:4;5547:2;5551:7;5531:9;:28::i;3098:102:10:-;349:19;391:9;386:190;406:13;:20;402:24;;386:190;;;476:10;-1:-1:-1;;;;;451:35:10;:13;465:1;451:16;;;;;;-1:-1:-1;;;451:16:10;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;451:21:10;:35;447:119;;;523:4;506:21;;546:5;;447:119;428:3;;;;:::i;:::-;;;;386:190;;;;618:12;:10;:12::i;:::-;-1:-1:-1;;;;;607:23:10;:7;:5;:7::i;:::-;-1:-1:-1;;;;;607:23:10;;:41;;;;634:14;607:41;586:139;;;;-1:-1:-1;;;586:139:10;;;;;;;:::i;:::-;3179:14;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;6644:954::-:0;6776:16;229:9;242:10;229:23;221:66;;;;-1:-1:-1;;;221:66:10;;;;;;;:::i;:::-;805:14:::1;::::0;:19;;::::1;::::0;:56:::1;;;846:15;828:14;;:33;;805:56;784:120;;;;-1:-1:-1::0;;;784:120:10::1;;;;;;;:::i;:::-;6854:8:::2;6842:9;;:20;;;;:::i;:::-;6829:9;:33;;6808:117;;;;-1:-1:-1::0;;;6808:117:10::2;;;;;;;:::i;:::-;6964:23;;6952:8;:35;;6944:93;;;;-1:-1:-1::0;;;6944:93:10::2;;;;;;;:::i;:::-;7064:16;:23:::0;:35;-1:-1:-1;7064:35:10::2;7056:71;;;;-1:-1:-1::0;;;7056:71:10::2;;;;;;;:::i;:::-;7217:8;7189:23;;7173:13;;:39;;;;:::i;:::-;7146:16;:23:::0;:67:::2;::::0;;::::2;:::i;:::-;:79;;7138:121;;;;-1:-1:-1::0;;;7138:121:10::2;;;;;;;:::i;:::-;7270:25;7312:8;7298:23;;;;;;-1:-1:-1::0;;;7298:23:10::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;7298:23:10::2;-1:-1:-1::0;7355:10:10::2;7332:34;::::0;;;:22:::2;:34;::::0;;;;:46;;7270:51;;-1:-1:-1;7370:8:10;;7332:34;;;:46:::2;::::0;7370:8;;7332:46:::2;:::i;:::-;;;;;;;;7409:8;7388:17;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;7433:9:10::2;::::0;-1:-1:-1;7428:96:10::2;7448:8;7444:1;:12;7428:96;;;7491:22;:20;:22::i;:::-;7477:8;7486:1;7477:11;;;;;;-1:-1:-1::0;;;7477:11:10::2;;;;;;;;;;::::0;;::::2;::::0;;;;;:36;7458:3;::::2;::::0;::::2;:::i;:::-;;;;7428:96;;;;7534:32;7545:10;7557:8;7534:10;:32::i;2689:317::-:0;349:19;391:9;386:190;406:13;:20;402:24;;386:190;;;476:10;-1:-1:-1;;;;;451:35:10;:13;465:1;451:16;;;;;;-1:-1:-1;;;451:16:10;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;451:21:10;:35;447:119;;;523:4;506:21;;546:5;;447:119;428:3;;;;:::i;:::-;;;;386:190;;;;618:12;:10;:12::i;:::-;-1:-1:-1;;;;;607:23:10;:7;:5;:7::i;:::-;-1:-1:-1;;;;;607:23:10;;:41;;;;634:14;607:41;586:139;;;;-1:-1:-1;;;586:139:10;;;;;;;:::i;:::-;2768:21:::1;2745:20;2800:200;2820:13;:20:::0;2816:24;::::1;2800:200;;;2869:13;2883:1;2869:16;;;;;;-1:-1:-1::0;;;2869:16:10::1;;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;-1:-1:-1::0;;;;;2869:21:10::1;-1:-1:-1::0;;;;;2861:39:10::1;:128;2918:57;2927:12;2941:13;2955:1;2941:16;;;;;;-1:-1:-1::0;;;2941:16:10::1;;;;;;;;;;::::0;;;::::1;::::0;;;:20:::1;:16;::::0;;::::1;;:20;::::0;2963:11:::1;::::0;-1:-1:-1;;;;;2963:11:10::1;2918:8;:57::i;:::-;2861:128;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;2842:3:10;::::1;::::0;::::1;:::i;:::-;;;;2800:200;;9814:116:::0;9904:19;;9814:116;:::o;5632:179:3:-;5765:39;5782:4;5788:2;5792:7;5765:39;;;;;;;;;;;;:16;:39::i;8836:220:10:-;8898:7;8938:16;8946:7;8938;:16::i;:::-;8917:107;;;;-1:-1:-1;;;8917:107:10;;;;;;;:::i;:::-;-1:-1:-1;9042:7:10;8836:220::o;1700:34::-;;;;:::o;2267:313:3:-;2379:7;2418:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2418:16:3;2465:19;2444:107;;;;-1:-1:-1;;;2444:107:3;;;;;;;:::i;1652:42:10:-;;;;:::o;4491:155::-;349:19;391:9;386:190;406:13;:20;402:24;;386:190;;;476:10;-1:-1:-1;;;;;451:35:10;:13;465:1;451:16;;;;;;-1:-1:-1;;;451:16:10;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;451:21:10;:35;447:119;;;523:4;506:21;;546:5;;447:119;428:3;;;;:::i;:::-;;;;386:190;;;;618:12;:10;:12::i;:::-;-1:-1:-1;;;;;607:23:10;:7;:5;:7::i;:::-;-1:-1:-1;;;;;607:23:10;;:41;;;;634:14;607:41;586:139;;;;-1:-1:-1;;;586:139:10;;;;;;;:::i;:::-;-1:-1:-1;4603:16:10::1;:36:::0;4491:155::o;1927:283:3:-;2039:7;-1:-1:-1;;;;;2083:19:3;;2062:108;;;;-1:-1:-1;;;2062:108:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;;2187:16:3;;;;;:9;:16;;;;;;;1927:283::o;1693:145:9:-;1284:12;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:9;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:9;;1265:68;;;;-1:-1:-1;;;1265:68:9;;;;;;;:::i;:::-;1799:1:::1;1783:6:::0;;1762:40:::1;::::0;-1:-1:-1;;;;;1783:6:9;;::::1;::::0;1762:40:::1;::::0;1799:1;;1762:40:::1;1829:1;1812:19:::0;;-1:-1:-1;;;;;;1812:19:9::1;::::0;;1693:145::o;4715:139:10:-;349:19;391:9;386:190;406:13;:20;402:24;;386:190;;;476:10;-1:-1:-1;;;;;451:35:10;:13;465:1;451:16;;;;;;-1:-1:-1;;;451:16:10;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;451:21:10;:35;447:119;;;523:4;506:21;;546:5;;447:119;428:3;;;;:::i;:::-;;;;386:190;;;;618:12;:10;:12::i;:::-;-1:-1:-1;;;;;607:23:10;:7;:5;:7::i;:::-;-1:-1:-1;;;;;607:23:10;;:41;;;;634:14;607:41;586:139;;;;-1:-1:-1;;;586:139:10;;;;;;;:::i;:::-;-1:-1:-1;4819:12:10::1;:28:::0;4715:139::o;9485:89::-;9558:9;;9485:89;:::o;1061:85:9:-;1107:7;1133:6;-1:-1:-1;;;;;1133:6:9;1061:85;:::o;7674:1098:10:-;7814:16;229:9;242:10;229:23;221:66;;;;-1:-1:-1;;;221:66:10;;;;;;;:::i;:::-;986:16:::1;::::0;:21;;::::1;::::0;:60:::1;;;1031:15;1011:16;;:35;;986:60;965:130;;;;-1:-1:-1::0;;;965:130:10::1;;;;;;;:::i;:::-;7892:8:::2;7880:9;;:20;;;;:::i;:::-;7867:9;:33;;7846:117;;;;-1:-1:-1::0;;;7846:117:10::2;;;;;;;:::i;:::-;8002:23;;7990:8;:35;;7982:94;;;;-1:-1:-1::0;;;7982:94:10::2;;;;;;;:::i;:::-;8095:16;:23:::0;:35;-1:-1:-1;8095:35:10::2;8087:71;;;;-1:-1:-1::0;;;8087:71:10::2;;;;;;;:::i;:::-;8248:8;8220:23;;8204:13;;:39;;;;:::i;:::-;8177:16;:23:::0;:67:::2;::::0;;::::2;:::i;:::-;:79;;8169:121;;;;-1:-1:-1::0;;;8169:121:10::2;;;;;;;:::i;:::-;8343:12;::::0;8320:19:::2;::::0;8309:30:::2;::::0;:8;:30:::2;:::i;:::-;:46;;8301:91;;;;-1:-1:-1::0;;;8301:91:10::2;;;;;;;:::i;:::-;8403:25;8445:8;8431:23;;;;;;-1:-1:-1::0;;;8431:23:10::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;8431:23:10::2;-1:-1:-1::0;8488:10:10::2;8465:34;::::0;;;:22:::2;:34;::::0;;;;:46;;8403:51;;-1:-1:-1;8503:8:10;;8465:34;;;:46:::2;::::0;8503:8;;8465:46:::2;:::i;:::-;;;;;;;;8542:8;8521:17;;:29;;;;;;;:::i;:::-;;;;;;;;8583:8;8560:19;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;8607:9:10::2;::::0;-1:-1:-1;8602:96:10::2;8622:8;8618:1;:12;8602:96;;;8665:22;:20;:22::i;:::-;8651:8;8660:1;8651:11;;;;;;-1:-1:-1::0;;;8651:11:10::2;;;;;;;;;;::::0;;::::2;::::0;;;;;:36;8632:3;::::2;::::0;::::2;:::i;:::-;;;;8602:96;;2804:102:3::0;2860:13;2892:7;2885:14;;;;;:::i;4550:318::-;4692:12;:10;:12::i;:::-;-1:-1:-1;;;;;4680:24:3;:8;-1:-1:-1;;;;;4680:24:3;;;4672:62;;;;-1:-1:-1;;;4672:62:3;;;;;;;:::i;:::-;4790:8;4745:18;:32;4764:12;:10;:12::i;:::-;-1:-1:-1;;;;;4745:32:3;;;;;;;;;;;;;;;;;-1:-1:-1;4745:32:3;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;4745:53:3;;;;;;;;;;;4828:12;:10;:12::i;:::-;-1:-1:-1;;;;;4813:48:3;;4852:8;4813:48;;;;;;:::i;:::-;;;;;;;;4550:318;;:::o;3751:409:10:-;349:19;391:9;386:190;406:13;:20;402:24;;386:190;;;476:10;-1:-1:-1;;;;;451:35:10;:13;465:1;451:16;;;;;;-1:-1:-1;;;451:16:10;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;451:21:10;:35;447:119;;;523:4;506:21;;546:5;;447:119;428:3;;;;:::i;:::-;;;;386:190;;;;618:12;:10;:12::i;:::-;-1:-1:-1;;;;;607:23:10;:7;:5;:7::i;:::-;-1:-1:-1;;;;;607:23:10;;:41;;;;634:14;607:41;586:139;;;;-1:-1:-1;;;586:139:10;;;;;;;:::i;:::-;3870:8:::1;3865:289;3885:16;:23:::0;3880:28:::1;::::0;::::1;;3865:289;;3956:7;3933:30;;:16;3950:1;3933:19;;;;;;;;-1:-1:-1::0;;;3933:19:10::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;::::0;;;;;::::1;;;;::::0;::::1;;;:30;3929:77;;3983:8;;3929:77;4042:16;4059:23:::0;;:27:::1;::::0;4085:1:::1;::::0;4059:27:::1;:::i;:::-;4042:45;;;;;;-1:-1:-1::0;;;4042:45:10::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4020:16;4037:1;4020:19;;;;;;;;-1:-1:-1::0;;;4020:19:10::1;;;;;;;;;;;;;;;;;;;;;;;;;;;:67;;;;;;;;;;;;;;;;;;4101:16;:22;;;;;-1:-1:-1::0;;;4101:22:10::1;;;;;;;;;;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;4101:22:10;;;;;::::1;;::::0;;::::1;;::::0;;;::::1;;;;;;::::0;;;;4138:5:::1;;3865:289;3910:3:::0;::::1;::::0;::::1;:::i;:::-;;;;3865:289;;4932:317:::0;5047:4;;;386:190;406:13;:20;402:24;;386:190;;;476:10;-1:-1:-1;;;;;451:35:10;:13;465:1;451:16;;;;;;-1:-1:-1;;;451:16:10;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;451:21:10;:35;447:119;;;523:4;506:21;;546:5;;447:119;428:3;;;;:::i;:::-;;;;386:190;;;;618:12;:10;:12::i;:::-;-1:-1:-1;;;;;607:23:10;:7;:5;:7::i;:::-;-1:-1:-1;;;;;607:23:10;;:41;;;;634:14;607:41;586:139;;;;-1:-1:-1;;;586:139:10;;;;;;;:::i;:::-;5072:8:::1;5067:153;5086:16;:23:::0;5082:27:::1;::::0;::::1;;5067:153;;;5157:7;5134:30;;:16;5151:1;5134:19;;;;;;;;-1:-1:-1::0;;;5134:19:10::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;::::0;;;;;::::1;;;;::::0;::::1;;;:30;5130:80;;;5191:4;5184:11;;;;;5130:80;5111:3:::0;::::1;::::0;::::1;:::i;:::-;;;;5067:153;;;;5237:5;5230:12;;736:1;4932:317:::0;;;;:::o;5328:608::-;349:19;391:9;386:190;406:13;:20;402:24;;386:190;;;476:10;-1:-1:-1;;;;;451:35:10;:13;465:1;451:16;;;;;;-1:-1:-1;;;451:16:10;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;451:21:10;:35;447:119;;;523:4;506:21;;546:5;;447:119;428:3;;;;:::i;:::-;;;;386:190;;;;618:12;:10;:12::i;:::-;-1:-1:-1;;;;;607:23:10;:7;:5;:7::i;:::-;-1:-1:-1;;;;;607:23:10;;:41;;;;634:14;607:41;586:139;;;;-1:-1:-1;;;586:139:10;;;;;;;:::i;:::-;5481:23:::1;;5465:13;;:39;;;;:::i;:::-;5452:8;:53;;5444:105;;;;-1:-1:-1::0;;;5444:105:10::1;;;;;;;:::i;:::-;5567:16;:23:::0;:35;-1:-1:-1;5567:35:10::1;5559:77;;;;-1:-1:-1::0;;;5559:77:10::1;;;;;;;:::i;:::-;5667:8;5646:17;;:29;;;;;;;:::i;:::-;;;;;;;;5712:8;5685:23;;:35;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;5731:25:10::1;::::0;-1:-1:-1;5773:8:10;5759:23:::1;::::0;::::1;;;;-1:-1:-1::0;;;5759:23:10::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;5759:23:10::1;;5731:51;;5798:9;5793:96;5813:8;5809:1;:12;5793:96;;;5856:22;:20;:22::i;:::-;5842:8;5851:1;5842:11;;;;;;-1:-1:-1::0;;;5842:11:10::1;;;;;;;;;;::::0;;::::1;::::0;;;;;:36;5823:3;::::1;::::0;::::1;:::i;:::-;;;;5793:96;;;;5899:30;5910:8;5920;5899:10;:30::i;5877:354:3:-:0;6059:41;6078:12;:10;:12::i;:::-;6092:7;6059:18;:41::i;:::-;6038:137;;;;-1:-1:-1;;;6038:137:3;;;;;;;:::i;:::-;6185:39;6199:4;6205:2;6209:7;6218:5;6185:13;:39::i;2972:451::-;3085:13;3135:16;3143:7;3135;:16::i;:::-;3114:110;;;;-1:-1:-1;;;3114:110:3;;;;;;;:::i;:::-;3235:21;3259:10;:8;:10::i;:::-;3235:34;;3322:1;3304:7;3298:21;:25;:118;;;;;;;;;;;;;;;;;3366:7;3375:18;:7;:16;:18::i;:::-;3349:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3298:118;3279:137;2972:451;-1:-1:-1;;;2972:451:3:o;9317:110:10:-;9397:16;:23;9317:110;:::o;9131:93::-;9178:13;9210:7;9203:14;;;;;:::i;6023:556::-;6098:7;229:9;242:10;229:23;221:66;;;;-1:-1:-1;;;221:66:10;;;;;;;:::i;:::-;805:14:::1;::::0;:19;;::::1;::::0;:56:::1;;;846:15;828:14;;:33;;805:56;784:120;;;;-1:-1:-1::0;;;784:120:10::1;;;;;;;:::i;:::-;6138:9:::2;;6125;:22;;6117:69;;;;-1:-1:-1::0;;;6117:69:10::2;;;;;;;:::i;:::-;6205:16;:23:::0;6197:63:::2;;;;-1:-1:-1::0;;;6197:63:10::2;;;;;;;:::i;:::-;6349:1;6322:23;;6306:13;;:39;;;;:::i;:::-;6279:16;:23:::0;:67:::2;::::0;;::::2;:::i;:::-;:71;6271:113;;;;-1:-1:-1::0;;;6271:113:10::2;;;;;;;:::i;:::-;6418:10;6395:34;::::0;;;:22:::2;:34;::::0;;;;:36;;;::::2;::::0;::::2;:::i;:::-;::::0;;;-1:-1:-1;;6441:17:10::2;:19:::0;;;:17:::2;:19;::::0;::::2;:::i;:::-;;;;;;6471:15;6489:22;:20;:22::i;:::-;6471:40;;6522:26;6528:10;6540:7;6522:5;:26::i;:::-;6565:7:::0;-1:-1:-1;6023:556:10;:::o;4934:206:3:-;-1:-1:-1;;;;;5098:25:3;;;5071:4;5098:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4934:206::o;1612:34:10:-;;;;:::o;1987:240:9:-;1284:12;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:9;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:9;;1265:68;;;;-1:-1:-1;;;1265:68:9;;;;;;;:::i;:::-;-1:-1:-1;;;;;2075:22:9;::::1;2067:73;;;;-1:-1:-1::0;;;2067:73:9::1;;;;;;;:::i;:::-;2176:6;::::0;;2155:38:::1;::::0;-1:-1:-1;;;;;2155:38:9;;::::1;::::0;2176:6;::::1;::::0;2155:38:::1;::::0;::::1;2203:6;:17:::0;;-1:-1:-1;;;;;;2203:17:9::1;-1:-1:-1::0;;;;;2203:17:9;;;::::1;::::0;;;::::1;::::0;;1987:240::o;3271:107:10:-;349:19;391:9;386:190;406:13;:20;402:24;;386:190;;;476:10;-1:-1:-1;;;;;451:35:10;:13;465:1;451:16;;;;;;-1:-1:-1;;;451:16:10;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;451:21:10;:35;447:119;;;523:4;506:21;;546:5;;447:119;428:3;;;;:::i;:::-;;;;386:190;;;;618:12;:10;:12::i;:::-;-1:-1:-1;;;;;607:23:10;:7;:5;:7::i;:::-;-1:-1:-1;;;;;607:23:10;;:41;;;;634:14;607:41;586:139;;;;-1:-1:-1;;;586:139:10;;;;;;;:::i;:::-;-1:-1:-1;3349:9:10::1;:22:::0;3271:107::o;763:155:2:-;-1:-1:-1;;;;;;871:40:2;;-1:-1:-1;;;871:40:2;763:155;;;:::o;7737:125:3:-;7802:4;7825:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7825:16:3;:30;;;7737:125::o;586:96:1:-;665:10;586:96;:::o;12245:171:3:-;12319:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;12319:29:3;-1:-1:-1;;;;;12319:29:3;;;;;;;;:24;;12372:23;12319:24;12372:14;:23::i;:::-;-1:-1:-1;;;;;12363:46:3;;;;;;;;;;;12245:171;;:::o;8020:445::-;8145:4;8186:16;8194:7;8186;:16::i;:::-;8165:107;;;;-1:-1:-1;;;8165:107:3;;;;;;;:::i;:::-;8282:13;8298:23;8313:7;8298:14;:23::i;:::-;8282:39;;8350:5;-1:-1:-1;;;;;8339:16:3;:7;-1:-1:-1;;;;;8339:16:3;;:63;;;;8395:7;-1:-1:-1;;;;;8371:31:3;:20;8383:7;8371:11;:20::i;:::-;-1:-1:-1;;;;;8371:31:3;;8339:63;:118;;;;8418:39;8442:5;8449:7;8418:23;:39::i;:::-;8331:127;8020:445;-1:-1:-1;;;;8020:445:3:o;11540:594::-;11707:4;-1:-1:-1;;;;;11680:31:3;:23;11695:7;11680:14;:23::i;:::-;-1:-1:-1;;;;;11680:31:3;;11659:119;;;;-1:-1:-1;;;11659:119:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;11796:16:3;;11788:65;;;;-1:-1:-1;;;11788:65:3;;;;;;;:::i;:::-;11864:39;11885:4;11891:2;11895:7;11864:20;:39::i;:::-;11965:29;11982:1;11986:7;11965:8;:29::i;:::-;-1:-1:-1;;;;;12005:15:3;;;;;;:9;:15;;;;;:20;;12024:1;;12005:15;:20;;12024:1;;12005:20;:::i;:::-;;;;-1:-1:-1;;;;;;;12035:13:3;;;;;;:9;:13;;;;;:18;;12052:1;;12035:13;:18;;12052:1;;12035:18;:::i;:::-;;;;-1:-1:-1;;12063:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;12063:21:3;-1:-1:-1;;;;;12063:21:3;;;;;;;;;12100:27;;12063:16;;12100:27;;;;;;;11540:594;;;:::o;10051:334:10:-;10100:7;10119:14;10136:41;10153:16;:23;;;;10136:16;:41::i;:::-;10119:58;;10187:15;10213:16;10230:6;10213:24;;;;;;-1:-1:-1;;;10213:24:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10205:33;;10187:51;;10276:16;10319:1;10293:16;:23;;;;:27;;;;:::i;:::-;10276:45;;;;;;-1:-1:-1;;;10276:45:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10249:16;10266:6;10249:24;;;;;;-1:-1:-1;;;10249:24:10;;;;;;;;;;;;;;;;;;;;;;;;;;;:72;;;;;;;;;;;;;;;;;;10331:16;:22;;;;;-1:-1:-1;;;10331:22:10;;;;;;;;;;;;;;;;;-1:-1:-1;;10331:22:10;;;;;;;;;;;;;;;;;;;;;;;;10371:7;-1:-1:-1;;10051:334:10;:::o;10135:516:3:-;-1:-1:-1;;;;;10249:16:3;;10241:61;;;;-1:-1:-1;;;10241:61:3;;;;;;;:::i;:::-;10329:15;;-1:-1:-1;;;;;10312:13:3;;;;;;:9;:13;;;;;:32;;:13;;;:32;;10329:15;;10312:32;:::i;:::-;;;;-1:-1:-1;10360:9:3;;-1:-1:-1;10355:290:3;10375:8;:15;10371:1;:19;10355:290;;;10420:20;10428:8;10437:1;10428:11;;;;;;-1:-1:-1;;;10428:11:3;;;;;;;;;;;;;;;10420:7;:20::i;:::-;10419:21;10411:62;;;;-1:-1:-1;;;10411:62:3;;;;;;;:::i;:::-;10488:49;10517:1;10521:2;10525:8;10534:1;10525:11;;;;;;-1:-1:-1;;;10525:11:3;;;;;;;;;;;;;;;10488:20;:49::i;:::-;10575:2;10552:7;:20;10560:8;10569:1;10560:11;;;;;;-1:-1:-1;;;10560:11:3;;;;;;;;;;;;;;;10552:20;;;;;;;;;;;;:25;;;;;-1:-1:-1;;;;;10552:25:3;;;;;-1:-1:-1;;;;;10552:25:3;;;;;;10622:8;10631:1;10622:11;;;;;;-1:-1:-1;;;10622:11:3;;;;;;;;;;;;;;;10618:2;-1:-1:-1;;;;;10597:37:3;10614:1;-1:-1:-1;;;;;10597:37:3;;;;;;;;;;;10392:3;;;;:::i;:::-;;;;10355:290;;11059:313:10;11167:7;;11198:9;-1:-1:-1;;;;;11198:9:10;;:1;:9;:::i;:::-;11186:21;-1:-1:-1;11217:9:10;11229;-1:-1:-1;;;;;11229:9:10;;:1;:9;:::i;:::-;11217:21;-1:-1:-1;11248:9:10;11260;-1:-1:-1;;;;;11260:9:10;;:1;:9;:::i;:::-;11248:21;-1:-1:-1;11279:9:10;11291;-1:-1:-1;;;;;11291:9:10;;:1;:9;:::i;:::-;11279:21;-1:-1:-1;;;;;;11350:15:10;;11351:5;11279:21;11351:1;:5;:::i;:::-;11350:15;;;;:::i;:::-;11342:5;11346:1;11342;:5;:::i;:::-;11334;11338:1;11334;:5;:::i;:::-;-1:-1:-1;;;;;11318:13:10;;:5;11322:1;11318;:5;:::i;:::-;:13;;;;:::i;:::-;:21;;;;:::i;:::-;:29;;;;:::i;:::-;:47;;;;:::i;:::-;11311:54;11059:313;-1:-1:-1;;;;;;;;11059:313:10:o;7093:341:3:-;7244:28;7254:4;7260:2;7264:7;7244:9;:28::i;:::-;7303:48;7326:4;7332:2;7336:7;7345:5;7303:22;:48::i;:::-;7282:145;;;;-1:-1:-1;;;7282:145:3;;;;;;;:::i;271:703:11:-;327:13;544:10;540:51;;-1:-1:-1;570:10:11;;;;;;;;;;;;-1:-1:-1;;;570:10:11;;;;;;540:51;615:5;600:12;654:75;661:9;;654:75;;686:8;;;;:::i;:::-;;-1:-1:-1;708:10:11;;-1:-1:-1;716:2:11;708:10;;:::i;:::-;;;654:75;;;738:19;770:6;760:17;;;;;;-1:-1:-1;;;760:17:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;760:17:11;;738:39;;787:150;794:10;;787:150;;820:11;830:1;820:11;;:::i;:::-;;-1:-1:-1;888:10:11;896:2;888:5;:10;:::i;:::-;875:24;;:2;:24;:::i;:::-;862:39;;845:6;852;845:14;;;;;;-1:-1:-1;;;845:14:11;;;;;;;;;;;;:56;-1:-1:-1;;;;;845:56:11;;;;;;;;-1:-1:-1;915:11:11;924:2;915:11;;:::i;:::-;;;787:150;;9757:372:3;-1:-1:-1;;;;;9836:16:3;;9828:61;;;;-1:-1:-1;;;9828:61:3;;;;;;;:::i;:::-;9908:16;9916:7;9908;:16::i;:::-;9907:17;9899:58;;;;-1:-1:-1;;;9899:58:3;;;;;;;:::i;:::-;9968:45;9997:1;10001:2;10005:7;9968:20;:45::i;:::-;-1:-1:-1;;;;;10024:13:3;;;;;;:9;:13;;;;;:18;;10041:1;;10024:13;:18;;10041:1;;10024:18;:::i;:::-;;;;-1:-1:-1;;10052:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10052:21:3;-1:-1:-1;;;;;10052:21:3;;;;;;;;10089:33;;10052:16;;;10089:33;;10052:16;;10089:33;9757:372;;:::o;10453:446:10:-;10639:16;:23;10517:7;;;;10694:16;10709:1;10694:12;:16;:::i;:::-;10684:27;10733:14;10769:16;10807:10;10601:234;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;10601:234:10;;;;;;;;;10574:275;;10601:234;10574:275;;;;;-1:-1:-1;10877:15:10;10886:6;10574:275;10877:15;:::i;12969:1022:3:-;13119:4;13139:15;:2;-1:-1:-1;;;;;13139:13:3;;:15::i;:::-;13135:850;;;13206:2;-1:-1:-1;;;;;13190:36:3;;13248:12;:10;:12::i;:::-;13282:4;13308:7;13337:5;13190:170;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13190:170:3;;;;;;;;-1:-1:-1;;13190:170:3;;;;;;;;;;;;:::i;:::-;;;13170:763;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13543:13:3;;13539:380;;13585:106;;-1:-1:-1;;;13585:106:3;;;;;;;:::i;13539:380::-;13871:6;13865:13;13856:6;13852:2;13848:15;13841:38;13170:763;-1:-1:-1;;;;;;13422:55:3;-1:-1:-1;;;13422:55:3;;-1:-1:-1;13415:62:3;;13135:850;-1:-1:-1;13970:4:3;12969:1022;;;;;;:::o;718:413:0:-;1078:20;1116:8;;;718:413::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:409:12;;114:18;106:6;103:30;100:2;;;136:18;;:::i;:::-;174:58;220:2;197:17;;-1:-1:-1;;193:31:12;226:4;189:42;174:58;:::i;:::-;165:67;;255:6;248:5;241:21;295:3;286:6;281:3;277:16;274:25;271:2;;;312:1;309;302:12;271:2;361:6;356:3;349:4;342:5;338:16;325:43;415:1;408:4;399:6;392:5;388:18;384:29;377:40;90:333;;;;;:::o;428:175::-;498:20;;-1:-1:-1;;;;;547:31:12;;537:42;;527:2;;593:1;590;583:12;608:161;677:20;;737:6;726:18;;716:29;;706:2;;759:1;756;749:12;774:198;;886:2;874:9;865:7;861:23;857:32;854:2;;;907:6;899;892:22;854:2;935:31;956:9;935:31;:::i;977:274::-;;;1106:2;1094:9;1085:7;1081:23;1077:32;1074:2;;;1127:6;1119;1112:22;1074:2;1155:31;1176:9;1155:31;:::i;:::-;1145:41;;1205:40;1241:2;1230:9;1226:18;1205:40;:::i;:::-;1195:50;;1064:187;;;;;:::o;1256:342::-;;;;1402:2;1390:9;1381:7;1377:23;1373:32;1370:2;;;1423:6;1415;1408:22;1370:2;1451:31;1472:9;1451:31;:::i;:::-;1441:41;;1501:40;1537:2;1526:9;1522:18;1501:40;:::i;:::-;1491:50;;1588:2;1577:9;1573:18;1560:32;1550:42;;1360:238;;;;;:::o;1603:702::-;;;;;1775:3;1763:9;1754:7;1750:23;1746:33;1743:2;;;1797:6;1789;1782:22;1743:2;1825:31;1846:9;1825:31;:::i;:::-;1815:41;;1875:40;1911:2;1900:9;1896:18;1875:40;:::i;:::-;1865:50;;1962:2;1951:9;1947:18;1934:32;1924:42;;2017:2;2006:9;2002:18;1989:32;2044:18;2036:6;2033:30;2030:2;;;2081:6;2073;2066:22;2030:2;2109:22;;2162:4;2154:13;;2150:27;-1:-1:-1;2140:2:12;;2196:6;2188;2181:22;2140:2;2224:75;2291:7;2286:2;2273:16;2268:2;2264;2260:11;2224:75;:::i;:::-;2214:85;;;1733:572;;;;;;;:::o;2310:369::-;;;2436:2;2424:9;2415:7;2411:23;2407:32;2404:2;;;2457:6;2449;2442:22;2404:2;2485:31;2506:9;2485:31;:::i;:::-;2475:41;;2566:2;2555:9;2551:18;2538:32;2613:5;2606:13;2599:21;2592:5;2589:32;2579:2;;2640:6;2632;2625:22;2579:2;2668:5;2658:15;;;2394:285;;;;;:::o;2684:266::-;;;2813:2;2801:9;2792:7;2788:23;2784:32;2781:2;;;2834:6;2826;2819:22;2781:2;2862:31;2883:9;2862:31;:::i;:::-;2852:41;2940:2;2925:18;;;;2912:32;;-1:-1:-1;;;2771:179:12:o;2955:1422::-;;3101:2;3144;3132:9;3123:7;3119:23;3115:32;3112:2;;;3165:6;3157;3150:22;3112:2;3210:9;3197:23;3239:18;3280:2;3272:6;3269:14;3266:2;;;3301:6;3293;3286:22;3266:2;3344:6;3333:9;3329:22;3319:32;;3389:7;3382:4;3378:2;3374:13;3370:27;3360:2;;3416:6;3408;3401:22;3360:2;3457;3444:16;3479:2;3475;3472:10;3469:2;;;3485:18;;:::i;:::-;3525:36;3557:2;3552;3548;3544:11;3540:20;3525:36;:::i;:::-;3595:15;;;3626:12;;;;3658:11;;;3688:4;3719:11;;;3711:20;;3707:29;;3704:42;-1:-1:-1;3701:2:12;;;3764:6;3756;3749:22;3701:2;3791:6;3782:15;;3806:541;3820:2;3817:1;3814:9;3806:541;;;3891:2;3885:3;3876:7;3872:17;3868:26;3865:2;;;3912:6;3904;3897:22;3865:2;3954;3948:9;4000:2;3992:6;3988:15;4057:6;4045:10;4042:22;4037:2;4025:10;4022:18;4019:46;4016:2;;;4068:18;;:::i;:::-;4101:22;;4151:25;4172:3;4151:25;:::i;:::-;4136:41;;4227:12;;;4214:26;4197:15;;;4190:51;4254:19;;3838:1;3831:9;;;;;4293:12;;;;4325;;;;3806:541;;;-1:-1:-1;4366:5:12;;3081:1296;-1:-1:-1;;;;;;;;;3081:1296:12:o;4382:257::-;;4493:2;4481:9;4472:7;4468:23;4464:32;4461:2;;;4514:6;4506;4499:22;4461:2;4558:9;4545:23;4577:32;4603:5;4577:32;:::i;4644:261::-;;4766:2;4754:9;4745:7;4741:23;4737:32;4734:2;;;4787:6;4779;4772:22;4734:2;4824:9;4818:16;4843:32;4869:5;4843:32;:::i;4910:482::-;;5032:2;5020:9;5011:7;5007:23;5003:32;5000:2;;;5053:6;5045;5038:22;5000:2;5098:9;5085:23;5131:18;5123:6;5120:30;5117:2;;;5168:6;5160;5153:22;5117:2;5196:22;;5249:4;5241:13;;5237:27;-1:-1:-1;5227:2:12;;5283:6;5275;5268:22;5227:2;5311:75;5378:7;5373:2;5360:16;5355:2;5351;5347:11;5311:75;:::i;5397:196::-;;5508:2;5496:9;5487:7;5483:23;5479:32;5476:2;;;5529:6;5521;5514:22;5476:2;5557:30;5577:9;5557:30;:::i;5598:270::-;;;5725:2;5713:9;5704:7;5700:23;5696:32;5693:2;;;5746:6;5738;5731:22;5693:2;5774:30;5794:9;5774:30;:::i;:::-;5764:40;;5823:39;5858:2;5847:9;5843:18;5823:39;:::i;5873:190::-;;5985:2;5973:9;5964:7;5960:23;5956:32;5953:2;;;6006:6;5998;5991:22;5953:2;-1:-1:-1;6034:23:12;;5943:120;-1:-1:-1;5943:120:12:o;6068:259::-;;6149:5;6143:12;6176:6;6171:3;6164:19;6192:63;6248:6;6241:4;6236:3;6232:14;6225:4;6218:5;6214:16;6192:63;:::i;:::-;6309:2;6288:15;-1:-1:-1;;6284:29:12;6275:39;;;;6316:4;6271:50;;6119:208;-1:-1:-1;;6119:208:12:o;6332:470::-;;6549:6;6543:13;6565:53;6611:6;6606:3;6599:4;6591:6;6587:17;6565:53;:::i;:::-;6681:13;;6640:16;;;;6703:57;6681:13;6640:16;6737:4;6725:17;;6703:57;:::i;:::-;6776:20;;6519:283;-1:-1:-1;;;;6519:283:12:o;6807:546::-;7064:19;;;7108:2;7099:12;;7092:28;;;;-1:-1:-1;;7208:2:12;7204:15;;;7200:24;;7195:2;7186:12;;7179:46;7250:2;7241:12;;7234:28;;;;7297:15;;;7293:24;7287:3;7278:13;;7271:47;7343:3;7334:13;;7054:299::o;7358:203::-;-1:-1:-1;;;;;7522:32:12;;;;7504:51;;7492:2;7477:18;;7459:102::o;7566:490::-;-1:-1:-1;;;;;7835:15:12;;;7817:34;;7887:15;;7882:2;7867:18;;7860:43;7934:2;7919:18;;7912:34;;;7982:3;7977:2;7962:18;;7955:31;;;7566:490;;8003:47;;8030:19;;8022:6;8003:47;:::i;:::-;7995:55;7769:287;-1:-1:-1;;;;;;7769:287:12:o;8061:635::-;8232:2;8284:21;;;8354:13;;8257:18;;;8376:22;;;8061:635;;8232:2;8455:15;;;;8429:2;8414:18;;;8061:635;8501:169;8515:6;8512:1;8509:13;8501:169;;;8576:13;;8564:26;;8645:15;;;;8610:12;;;;8537:1;8530:9;8501:169;;;-1:-1:-1;8687:3:12;;8212:484;-1:-1:-1;;;;;;8212:484:12:o;8701:187::-;8866:14;;8859:22;8841:41;;8829:2;8814:18;;8796:92::o;8893:221::-;;9042:2;9031:9;9024:21;9062:46;9104:2;9093:9;9089:18;9081:6;9062:46;:::i;9119:414::-;9321:2;9303:21;;;9360:2;9340:18;;;9333:30;9399:34;9394:2;9379:18;;9372:62;-1:-1:-1;;;9465:2:12;9450:18;;9443:48;9523:3;9508:19;;9293:240::o;9538:402::-;9740:2;9722:21;;;9779:2;9759:18;;;9752:30;9818:34;9813:2;9798:18;;9791:62;-1:-1:-1;;;9884:2:12;9869:18;;9862:36;9930:3;9915:19;;9712:228::o;9945:352::-;10147:2;10129:21;;;10186:2;10166:18;;;10159:30;10225;10220:2;10205:18;;10198:58;10288:2;10273:18;;10119:178::o;10302:354::-;10504:2;10486:21;;;10543:2;10523:18;;;10516:30;10582:32;10577:2;10562:18;;10555:60;10647:2;10632:18;;10476:180::o;10661:400::-;10863:2;10845:21;;;10902:2;10882:18;;;10875:30;10941:34;10936:2;10921:18;;10914:62;-1:-1:-1;;;11007:2:12;10992:18;;10985:34;11051:3;11036:19;;10835:226::o;11066:349::-;11268:2;11250:21;;;11307:2;11287:18;;;11280:30;11346:27;11341:2;11326:18;;11319:55;11406:2;11391:18;;11240:175::o;11420:356::-;11622:2;11604:21;;;11641:18;;;11634:30;11700:34;11695:2;11680:18;;11673:62;11767:2;11752:18;;11594:182::o;11781:410::-;11983:2;11965:21;;;12022:2;12002:18;;;11995:30;12061:34;12056:2;12041:18;;12034:62;-1:-1:-1;;;12127:2:12;12112:18;;12105:44;12181:3;12166:19;;11955:236::o;12196:354::-;12398:2;12380:21;;;12437:2;12417:18;;;12410:30;12476:32;12471:2;12456:18;;12449:60;12541:2;12526:18;;12370:180::o;12555:408::-;12757:2;12739:21;;;12796:2;12776:18;;;12769:30;12835:34;12830:2;12815:18;;12808:62;-1:-1:-1;;;12901:2:12;12886:18;;12879:42;12953:3;12938:19;;12729:234::o;12968:354::-;13170:2;13152:21;;;13209:2;13189:18;;;13182:30;13248:32;13243:2;13228:18;;13221:60;13313:2;13298:18;;13142:180::o;13327:420::-;13529:2;13511:21;;;13568:2;13548:18;;;13541:30;13607:34;13602:2;13587:18;;13580:62;13678:26;13673:2;13658:18;;13651:54;13737:3;13722:19;;13501:246::o;13752:347::-;13954:2;13936:21;;;13993:2;13973:18;;;13966:30;14032:25;14027:2;14012:18;;14005:53;14090:2;14075:18;;13926:173::o;14104:341::-;14306:2;14288:21;;;14345:2;14325:18;;;14318:30;-1:-1:-1;;;14379:2:12;14364:18;;14357:47;14436:2;14421:18;;14278:167::o;14450:406::-;14652:2;14634:21;;;14691:2;14671:18;;;14664:30;14730:34;14725:2;14710:18;;14703:62;-1:-1:-1;;;14796:2:12;14781:18;;14774:40;14846:3;14831:19;;14624:232::o;14861:405::-;15063:2;15045:21;;;15102:2;15082:18;;;15075:30;15141:34;15136:2;15121:18;;15114:62;-1:-1:-1;;;15207:2:12;15192:18;;15185:39;15256:3;15241:19;;15035:231::o;15271:353::-;15473:2;15455:21;;;15512:2;15492:18;;;15485:30;15551:31;15546:2;15531:18;;15524:59;15615:2;15600:18;;15445:179::o;15629:356::-;15831:2;15813:21;;;15850:18;;;15843:30;15909:34;15904:2;15889:18;;15882:62;15976:2;15961:18;;15803:182::o;15990:403::-;16192:2;16174:21;;;16231:2;16211:18;;;16204:30;16270:34;16265:2;16250:18;;16243:62;-1:-1:-1;;;16336:2:12;16321:18;;16314:37;16383:3;16368:19;;16164:229::o;16398:408::-;16600:2;16582:21;;;16639:2;16619:18;;;16612:30;16678:34;16673:2;16658:18;;16651:62;-1:-1:-1;;;16744:2:12;16729:18;;16722:42;16796:3;16781:19;;16572:234::o;16811:356::-;17013:2;16995:21;;;17032:18;;;17025:30;17091:34;17086:2;17071:18;;17064:62;17158:2;17143:18;;16985:182::o;17172:405::-;17374:2;17356:21;;;17413:2;17393:18;;;17386:30;17452:34;17447:2;17432:18;;17425:62;-1:-1:-1;;;17518:2:12;17503:18;;17496:39;17567:3;17552:19;;17346:231::o;17582:411::-;17784:2;17766:21;;;17823:2;17803:18;;;17796:30;17862:34;17857:2;17842:18;;17835:62;-1:-1:-1;;;17928:2:12;17913:18;;17906:45;17983:3;17968:19;;17756:237::o;17998:347::-;18200:2;18182:21;;;18239:2;18219:18;;;18212:30;18278:25;18273:2;18258:18;;18251:53;18336:2;18321:18;;18172:173::o;18350:415::-;18552:2;18534:21;;;18591:2;18571:18;;;18564:30;18630:34;18625:2;18610:18;;18603:62;-1:-1:-1;;;18696:2:12;18681:18;;18674:49;18755:3;18740:19;;18524:241::o;18770:397::-;18972:2;18954:21;;;19011:2;18991:18;;;18984:30;19050:34;19045:2;19030:18;;19023:62;-1:-1:-1;;;19116:2:12;19101:18;;19094:31;19157:3;19142:19;;18944:223::o;19172:413::-;19374:2;19356:21;;;19413:2;19393:18;;;19386:30;19452:34;19447:2;19432:18;;19425:62;-1:-1:-1;;;19518:2:12;19503:18;;19496:47;19575:3;19560:19;;19346:239::o;19590:398::-;19792:2;19774:21;;;19831:2;19811:18;;;19804:30;19870:34;19865:2;19850:18;;19843:62;-1:-1:-1;;;19936:2:12;19921:18;;19914:32;19978:3;19963:19;;19764:224::o;19993:353::-;20195:2;20177:21;;;20234:2;20214:18;;;20207:30;20273:31;20268:2;20253:18;;20246:59;20337:2;20322:18;;20167:179::o;20351:401::-;20553:2;20535:21;;;20592:2;20572:18;;;20565:30;20631:34;20626:2;20611:18;;20604:62;-1:-1:-1;;;20697:2:12;20682:18;;20675:35;20742:3;20727:19;;20525:227::o;20757:409::-;20959:2;20941:21;;;20998:2;20978:18;;;20971:30;21037:34;21032:2;21017:18;;21010:62;-1:-1:-1;;;21103:2:12;21088:18;;21081:43;21156:3;21141:19;;20931:235::o;21171:177::-;21317:25;;;21305:2;21290:18;;21272:76::o;21353:251::-;21423:2;21417:9;21453:17;;;21500:18;21485:34;;21521:22;;;21482:62;21479:2;;;21547:18;;:::i;:::-;21583:2;21576:22;21397:207;;-1:-1:-1;21397:207:12:o;21609:253::-;;-1:-1:-1;;;;;21738:2:12;21735:1;21731:10;21768:2;21765:1;21761:10;21799:3;21795:2;21791:12;21786:3;21783:21;21780:2;;;21807:18;;:::i;21867:128::-;;21938:1;21934:6;21931:1;21928:13;21925:2;;;21944:18;;:::i;:::-;-1:-1:-1;21980:9:12;;21915:80::o;22000:120::-;;22066:1;22056:2;;22071:18;;:::i;:::-;-1:-1:-1;22105:9:12;;22046:74::o;22125:168::-;;22231:1;22227;22223:6;22219:14;22216:1;22213:21;22208:1;22201:9;22194:17;22190:45;22187:2;;;22238:18;;:::i;:::-;-1:-1:-1;22278:9:12;;22177:116::o;22298:125::-;;22366:1;22363;22360:8;22357:2;;;22371:18;;:::i;:::-;-1:-1:-1;22408:9:12;;22347:76::o;22428:258::-;22500:1;22510:113;22524:6;22521:1;22518:13;22510:113;;;22600:11;;;22594:18;22581:11;;;22574:39;22546:2;22539:10;22510:113;;;22641:6;22638:1;22635:13;22632:2;;;-1:-1:-1;;22676:1:12;22658:16;;22651:27;22481:205::o;22691:380::-;22776:1;22766:12;;22823:1;22813:12;;;22834:2;;22888:4;22880:6;22876:17;22866:27;;22834:2;22941;22933:6;22930:14;22910:18;22907:38;22904:2;;;22987:10;22982:3;22978:20;22975:1;22968:31;23022:4;23019:1;23012:15;23050:4;23047:1;23040:15;23076:197;;23142:6;23183:2;23176:5;23172:14;23210:2;23201:7;23198:15;23195:2;;;23216:18;;:::i;:::-;23265:1;23252:15;;23122:151;-1:-1:-1;;;23122:151:12:o;23278:135::-;;-1:-1:-1;;23338:17:12;;23335:2;;;23358:18;;:::i;:::-;-1:-1:-1;23405:1:12;23394:13;;23325:88::o;23418:112::-;;23476:1;23466:2;;23481:18;;:::i;:::-;-1:-1:-1;23515:9:12;;23456:74::o;23535:127::-;23596:10;23591:3;23587:20;23584:1;23577:31;23627:4;23624:1;23617:15;23651:4;23648:1;23641:15;23667:127;23728:10;23723:3;23719:20;23716:1;23709:31;23759:4;23756:1;23749:15;23783:4;23780:1;23773:15;23799:127;23860:10;23855:3;23851:20;23848:1;23841:31;23891:4;23888:1;23881:15;23915:4;23912:1;23905:15;23931:133;-1:-1:-1;;;;;;24007:32:12;;23997:43;;23987:2;;24054:1;24051;24044:12;23987:2;23977:87;:::o

Swarm Source

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