ETH Price: $3,314.03 (+1.18%)
Gas: 5 Gwei

Token

NFT Access Claim (NFTACCESS)
 

Overview

Max Total Supply

295 NFTACCESS

Holders

291

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0xc0Fb55eB408a4e12773139Ae152dA413D288f3C2
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:
NFTAccess

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 14 of 17: NFTAccess.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "./ERC1155.sol";
import "./SafeMath.sol";
import "./Counters.sol";
import "./AbstractNFTAccess.sol";

contract NFTAccess is AbstractNFTAccess  {
    using SafeMath for uint256;
    using Counters for Counters.Counter;

    uint public tier1 = 0;
    uint public tier2 = 1;
    uint public tier3 = 2;

    bool public canSingleMint = false;

    address public NFT_Access_Address = 0x95F71D6424F2B9bfc29378Ea9539372c986F2E9b;

    Counters.Counter private ticketCount; 
    mapping(uint256 => ticketStruct) public tickets;

    struct ticketStruct {
        uint256 mintPrice;
        uint supply;
        uint currentSupply;
        uint claimLimit;
        string hash;
        bool canClaim;
        mapping(address => uint256) amountClaimed;
    }

    constructor(string memory _name, string memory _symbol) ERC1155("ipfs://") {
        name_ = _name; 
        symbol_ = _symbol;
    } 


    /*
    * @notice Add item to collection
    *
    * @param _mintPrice the price per ticket
    * @param _supply the max supply of this item
    * @param _claimLimit the max amount of nfts each user can claim for this item
    * @param _hash the hash of the image
    * @param _canClaim if it can currently be claimed
    */
    function addTicketStruct (uint256 _mintPrice, uint _supply, uint _claimLimit, string memory _hash, bool _canClaim) external onlyOwner {
        ticketStruct storage ticket = tickets[ticketCount.current()];
        ticket.mintPrice = _mintPrice;
        ticket.supply = _supply;
        ticket.currentSupply = 0;
        ticket.claimLimit = _claimLimit;
        ticket.hash = _hash;
        ticket.canClaim = _canClaim;
        ticketCount.increment();
    }


    /*
    * @notice Edit item in collection
    *
    * @param _mintPrice the price per ticket
    * @param _ticket the ticket to edit
    * @param _supply the max supply of this item
    * @param _claimLimit the max amount of nfts each user can claim for this item
    * @param _hash the hash of the image
    * @param _canClaim if it can currently be claimed
    */
    function editTicketStruct (uint256 _mintPrice, uint _ticket, uint _supply, uint _claimLimit, string memory _hash, bool _canClaim) external onlyOwner {
        tickets[_ticket].mintPrice = _mintPrice;    
        tickets[_ticket].hash = _hash;    
        tickets[_ticket].supply = _supply;
        tickets[_ticket].claimLimit = _claimLimit;    
        tickets[_ticket].canClaim = _canClaim;
    }       


    /*
    * @notice mint item in collection
    *
    * @param quantity the quantity to mint
    */
    function tieredMint (uint256 quantity) external payable {
        uint tier;
        uint currentSupply;

        uint tier1CurrentSupply = tickets[tier1].currentSupply;
        uint tier2CurrentSupply = tickets[tier2].currentSupply;
        uint tier3CurrentSupply = tickets[tier3].currentSupply;

        if (tier1CurrentSupply + quantity <= tickets[tier1].supply) {
            tier = tier1;
            currentSupply = tier1CurrentSupply;
        } else if (tier2CurrentSupply + quantity <= tickets[tier2].supply) {
            tier = tier2;
            currentSupply = tier2CurrentSupply;
        } else if (tier3CurrentSupply + quantity <= tickets[tier3].supply) {
            tier = tier3;
            currentSupply = tier3CurrentSupply;
        } else {
            require(false, "No tickets left from any tier");
        }

        require(currentSupply + quantity <= tickets[tier].supply, "Not enough tickets able to be claimed" );

        if (msg.sender != NFT_Access_Address) {
            require(tickets[tier].canClaim, "Not currently allowed to be claimed" );
            require(quantity <= tickets[tier].claimLimit, "Attempting to claim too many tickets");
            require(quantity.mul(tickets[tier].mintPrice) <= msg.value, "Not enough eth sent");
            require(tickets[tier].amountClaimed[msg.sender] < tickets[tier].claimLimit , "Claimed max amount");
            tickets[tier].amountClaimed[msg.sender] += 1;
        }

        tickets[tier].currentSupply = tickets[tier].currentSupply + quantity; 

        _mint(msg.sender, tier, quantity, "");
    }
    

    /*
    * @notice mint item in collection
    *
    * @param quantity the quantity to mint
    * @param _ticket the ticket to mint
    */
    function singleMint (uint256 quantity, uint256 _ticket) external payable {
        if (msg.sender != NFT_Access_Address) {
            require(canSingleMint, "Must tier mint");
            require(tickets[_ticket].canClaim, "Not currently allowed to be claimed" );
            require(quantity <= tickets[_ticket].claimLimit, "Attempting to claim too many tickets");
            require(quantity.mul(tickets[_ticket].mintPrice) <= msg.value, "Not enough eth sent");
            require(tickets[_ticket].amountClaimed[msg.sender] < tickets[_ticket].claimLimit , "Claimed max amount");
            tickets[_ticket].amountClaimed[msg.sender] += 1;
        }

        uint currentSupply = tickets[_ticket].currentSupply;
        require(currentSupply + quantity <= tickets[_ticket].supply, "Not enough tickets able to be claimed" );
        tickets[_ticket].supply = tickets[_ticket].supply + quantity; 

        _mint(msg.sender, _ticket, quantity, "");
    }

    /*
    * @notice withdraw any money from the contract
    */
    function withdraw() external {
        require(address(this).balance > 0, "Contract currently has no ether");
        uint256 walletBalance = address(this).balance;
        (bool status,) = NFT_Access_Address.call{value: walletBalance}("");
        require(status, "Failed withdraw");
    }


    /*
    * @notice change the tiers for tierTickets
    *
    * @param _tier1 the quantity to mint
    * @param _tier2 the quantity to mint
    * @param _tier3 the quantity to mint
    */
    function changeTierTickets(uint _tier1, uint _tier2, uint _tier3) external onlyOwner {
        tier1 = _tier1;
        tier2 = _tier2;
        tier3 = _tier3;
    }

    /*
    * @notice get the total quantities of current tiers 
    */
    function totalTierQuantity() public view returns (uint) {
        uint quantity1 = tickets[tier1].supply;
        uint quantity2 = tickets[tier2].supply;
        uint quantity3 = tickets[tier3].supply;

        return (quantity1 + quantity2 + quantity3);
    }

    /*
    * @notice get the current quantities of current tiers 
    */
    function currentTierQuantity() public view returns (uint) {
        uint quantity1 = tickets[tier1].currentSupply;
        uint quantity2 = tickets[tier2].currentSupply;
        uint quantity3 = tickets[tier3].currentSupply;

        return (quantity1 + quantity2 + quantity3);
    }

    function uri(uint256 _id) public view override returns (string memory) {
        require(tickets[_id].supply > 0, "URI: nonexistent token");
        return string(abi.encodePacked(super.uri(_id), tickets[_id].hash));
    }    

}

File 1 of 17: AbstractNFTAccess.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

import './Ownable.sol';
import './ERC1155Burnable.sol';
import './ERC1155Pausable.sol';
import './ERC1155Supply.sol';

abstract contract AbstractNFTAccess is ERC1155Pausable, ERC1155Supply, ERC1155Burnable, Ownable {
    
    string public name_;
    string public symbol_;   
    
    function pause() external onlyOwner {
        _pause();
    }

    function unpause() external onlyOwner {
        _unpause();
    }    

    function setURI(string memory baseURI) external onlyOwner {
        _setURI(baseURI);
    }    

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

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

    function _mint(
        address account,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual override(ERC1155, ERC1155Supply) {
        super._mint(account, id, amount, data);
    }

    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override(ERC1155, ERC1155Supply) {
        super._mintBatch(to, ids, amounts, data);
    }

    function _burn(
        address account,
        uint256 id,
        uint256 amount
    ) internal virtual override(ERC1155, ERC1155Supply) {
        super._burn(account, id, amount);
    }

    function _burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual override(ERC1155, ERC1155Supply) {
        super._burnBatch(account, ids, amounts);
    }  

    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override(ERC1155Pausable, ERC1155) {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }  
}

File 2 of 17: 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;
        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");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 3 of 17: 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) {
        return msg.data;
    }
}

File 4 of 17: Counters.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

File 5 of 17: ERC1155.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC1155.sol";
import "./IERC1155Receiver.sol";
import "./IERC1155MetadataURI.sol";
import "./Address.sol";
import "./Context.sol";
import "./ERC165.sol";

/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(_msgSender() != operator, "ERC1155: setting approval status for self");

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `account`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address account,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(account != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][account] += amount;
        emit TransferSingle(operator, address(0), account, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `account`
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address account,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        uint256 accountBalance = _balances[id][account];
        require(accountBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][account] = accountBalance - amount;
        }

        emit TransferSingle(operator, account, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 accountBalance = _balances[id][account];
            require(accountBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][account] = accountBalance - amount;
            }
        }

        emit TransferBatch(operator, account, address(0), ids, amounts);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver(to).onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver(to).onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

File 6 of 17: ERC1155Burnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC1155.sol";

/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Burnable is ERC1155 {
    function burn(
        address account,
        uint256 id,
        uint256 value
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burn(account, id, value);
    }

    function burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burnBatch(account, ids, values);
    }
}

File 7 of 17: ERC1155Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC1155.sol";
import "./Pausable.sol";

/**
 * @dev ERC1155 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Pausable is ERC1155, Pausable {
    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        require(!paused(), "ERC1155Pausable: token transfer while paused");
    }
}

File 8 of 17: ERC1155Supply.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC1155.sol";

/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates weither any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_mint}.
     */
    function _mint(
        address account,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual override {
        super._mint(account, id, amount, data);
        _totalSupply[id] += amount;
    }

    /**
     * @dev See {ERC1155-_mintBatch}.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._mintBatch(to, ids, amounts, data);
        for (uint256 i = 0; i < ids.length; ++i) {
            _totalSupply[ids[i]] += amounts[i];
        }
    }

    /**
     * @dev See {ERC1155-_burn}.
     */
    function _burn(
        address account,
        uint256 id,
        uint256 amount
    ) internal virtual override {
        super._burn(account, id, amount);
        _totalSupply[id] -= amount;
    }

    /**
     * @dev See {ERC1155-_burnBatch}.
     */
    function _burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual override {
        super._burnBatch(account, ids, amounts);
        for (uint256 i = 0; i < ids.length; ++i) {
            _totalSupply[ids[i]] -= amounts[i];
        }
    }
}

File 9 of 17: 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 10 of 17: IERC1155.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

File 11 of 17: IERC1155MetadataURI.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC1155.sol";

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

File 13 of 17: 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 15 of 17: 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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 16 of 17: Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 17 of 17: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"NFT_Access_Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"},{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"uint256","name":"_claimLimit","type":"uint256"},{"internalType":"string","name":"_hash","type":"string"},{"internalType":"bool","name":"_canClaim","type":"bool"}],"name":"addTicketStruct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"canSingleMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tier1","type":"uint256"},{"internalType":"uint256","name":"_tier2","type":"uint256"},{"internalType":"uint256","name":"_tier3","type":"uint256"}],"name":"changeTierTickets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentTierQuantity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"},{"internalType":"uint256","name":"_ticket","type":"uint256"},{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"uint256","name":"_claimLimit","type":"uint256"},{"internalType":"string","name":"_hash","type":"string"},{"internalType":"bool","name":"_canClaim","type":"bool"}],"name":"editTicketStruct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","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":"baseURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"_ticket","type":"uint256"}],"name":"singleMint","outputs":[],"stateMutability":"payable","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":[],"name":"symbol_","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tickets","outputs":[{"internalType":"uint256","name":"mintPrice","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"currentSupply","type":"uint256"},{"internalType":"uint256","name":"claimLimit","type":"uint256"},{"internalType":"string","name":"hash","type":"string"},{"internalType":"bool","name":"canClaim","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tier1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tier2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tier3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"tieredMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTierQuantity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600060085560016009556002600a55600b80546001600160a81b0319167495f71d6424f2b9bfc29378ea9539372c986f2e9b001790553480156200004757600080fd5b50604051620035a3380380620035a38339810160408190526200006a91620002a1565b604080518082019091526007815266697066733a2f2f60c81b60208201526200009381620000dd565b506003805460ff19169055620000a933620000f6565b8151620000be90600690602085019062000148565b508051620000d490600790602084019062000148565b5050506200035b565b8051620000f290600290602084019062000148565b5050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001569062000308565b90600052602060002090601f0160209004810192826200017a5760008555620001c5565b82601f106200019557805160ff1916838001178555620001c5565b82800160010185558215620001c5579182015b82811115620001c5578251825591602001919060010190620001a8565b50620001d3929150620001d7565b5090565b5b80821115620001d35760008155600101620001d8565b600082601f830112620001ff578081fd5b81516001600160401b03808211156200021c576200021c62000345565b604051601f8301601f19908116603f0116810190828211818310171562000247576200024762000345565b8160405283815260209250868385880101111562000263578485fd5b8491505b8382101562000286578582018301518183018401529082019062000267565b838211156200029757848385830101525b9695505050505050565b60008060408385031215620002b4578182fd5b82516001600160401b0380821115620002cb578384fd5b620002d986838701620001ee565b93506020850151915080821115620002ef578283fd5b50620002fe85828601620001ee565b9150509250929050565b600181811c908216806200031d57607f821691505b602082108114156200033f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b613238806200036b6000396000f3fe6080604052600436106102195760003560e01c8063715018a611610123578063bb6b13a1116100ab578063e985e9c51161006f578063e985e9c5146105f2578063edcdb7f71461063b578063f242432a1461065b578063f2fde38b1461067b578063f5298aca1461069b57600080fd5b8063bb6b13a114610572578063bd85b03914610588578063c275043f146105b5578063e2b9e186146105c8578063e8d9d08d146105dd57600080fd5b8063905ffb9d116100f2578063905ffb9d146104fb57806395d89b4114610515578063a22cb4651461052a578063af17dea61461054a578063b6a557841461055f57600080fd5b8063715018a6146104765780638456cb591461048b578063879dce7b146104a05780638da5cb5b146104dd57600080fd5b80633ac37dfc116101a65780634e1273f4116101755780634e1273f4146103b05780634f558e79146103dd57806350b447121461040c5780635c975abb1461043e5780636b20c4541461045657600080fd5b80633ac37dfc146103505780633ccfd60b146103705780633f4ba83a146103855780634b1740ad1461039a57600080fd5b80630e89341c116101ed5780630e89341c146102c55780631f93aa1e146102e55780632e222e62146102fa5780632eb2c2d61461031a5780633806153e1461033a57600080fd5b8062fdd58e1461021e57806301ffc9a71461025157806302fe53051461028157806306fdde03146102a3575b600080fd5b34801561022a57600080fd5b5061023e6102393660046127ea565b6106bb565b6040519081526020015b60405180910390f35b34801561025d57600080fd5b5061027161026c366004612910565b610752565b6040519015158152602001610248565b34801561028d57600080fd5b506102a161029c366004612948565b6107a4565b005b3480156102af57600080fd5b506102b86107da565b6040516102489190612cba565b3480156102d157600080fd5b506102b86102e0366004612983565b61086c565b3480156102f157600080fd5b5061023e610908565b34801561030657600080fd5b506102a16103153660046129e7565b610957565b34801561032657600080fd5b506102a1610335366004612647565b6109f6565b34801561034657600080fd5b5061023e60095481565b34801561035c57600080fd5b506102a161036b366004612a50565b610a8d565b34801561037c57600080fd5b506102a1610b12565b34801561039157600080fd5b506102a1610c08565b3480156103a657600080fd5b5061023e600a5481565b3480156103bc57600080fd5b506103d06103cb366004612845565b610c3c565b6040516102489190612c79565b3480156103e957600080fd5b506102716103f8366004612983565b600090815260046020526040902054151590565b34801561041857600080fd5b5061042c610427366004612983565b610d9e565b60405161024896959493929190612fbd565b34801561044a57600080fd5b5060035460ff16610271565b34801561046257600080fd5b506102a1610471366004612750565b610e60565b34801561048257600080fd5b506102a1610ea8565b34801561049757600080fd5b506102a1610edc565b3480156104ac57600080fd5b50600b546104c59061010090046001600160a01b031681565b6040516001600160a01b039091168152602001610248565b3480156104e957600080fd5b506005546001600160a01b03166104c5565b34801561050757600080fd5b50600b546102719060ff1681565b34801561052157600080fd5b506102b8610f0e565b34801561053657600080fd5b506102a16105453660046127c1565b610f1d565b34801561055657600080fd5b506102b8610ff4565b6102a161056d36600461299b565b611082565b34801561057e57600080fd5b5061023e60085481565b34801561059457600080fd5b5061023e6105a3366004612983565b60009081526004602052604090205490565b6102a16105c3366004612983565b6112cb565b3480156105d457600080fd5b506102b86115cf565b3480156105e957600080fd5b5061023e6115dc565b3480156105fe57600080fd5b5061027161060d366004612615565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561064757600080fd5b506102a16106563660046129bc565b611619565b34801561066757600080fd5b506102a16106763660046126ed565b611651565b34801561068757600080fd5b506102a16106963660046125fb565b611696565b3480156106a757600080fd5b506102a16106b6366004612813565b61172e565b60006001600160a01b03831661072c5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061078357506001600160e01b031982166303a24d0760e21b145b8061079e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6005546001600160a01b031633146107ce5760405162461bcd60e51b815260040161072390612efb565b6107d781611771565b50565b6060600680546107e99061309b565b80601f01602080910402602001604051908101604052809291908181526020018280546108159061309b565b80156108625780601f1061083757610100808354040283529160200191610862565b820191906000526020600020905b81548152906001019060200180831161084557829003601f168201915b5050505050905090565b6000818152600d60205260409020600101546060906108c65760405162461bcd60e51b81526020600482015260166024820152752aa9249d103737b732bc34b9ba32b73a103a37b5b2b760511b6044820152606401610723565b6108cf82611784565b6000838152600d602090815260409182902091516108f293926004019101612b27565b6040516020818303038152906040529050919050565b6008546000908152600d60205260408082206001908101546009548452828420820154600a54855292842090910154909190806109458385613021565b61094f9190613021565b935050505090565b6005546001600160a01b031633146109815760405162461bcd60e51b815260040161072390612efb565b6000600d6000610990600c5490565b815260208082019290925260400160009081208881556001810188905560028101919091556003810186905584519092506109d391600484019190860190612453565b5060058101805460ff1916831515179055600c805460010190555b505050505050565b6001600160a01b038516331480610a125750610a12853361060d565b610a795760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610723565b610a868585858585611818565b5050505050565b6005546001600160a01b03163314610ab75760405162461bcd60e51b815260040161072390612efb565b6000858152600d602090815260409091208781558351610adf92600490920191850190612453565b506000948552600d60205260409094206001810193909355506003820155600501805460ff191691151591909117905550565b60004711610b625760405162461bcd60e51b815260206004820152601f60248201527f436f6e74726163742063757272656e746c7920686173206e6f206574686572006044820152606401610723565b600b5460405147916000916101009091046001600160a01b031690839060006040518083038185875af1925050503d8060008114610bbc576040519150601f19603f3d011682016040523d82523d6000602084013e610bc1565b606091505b5050905080610c045760405162461bcd60e51b815260206004820152600f60248201526e4661696c656420776974686472617760881b6044820152606401610723565b5050565b6005546001600160a01b03163314610c325760405162461bcd60e51b815260040161072390612efb565b610c3a6119d6565b565b60608151835114610ca15760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610723565b6000835167ffffffffffffffff811115610ccb57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610cf4578160200160208202803683370190505b50905060005b8451811015610d9657610d5b858281518110610d2657634e487b7160e01b600052603260045260246000fd5b6020026020010151858381518110610d4e57634e487b7160e01b600052603260045260246000fd5b60200260200101516106bb565b828281518110610d7b57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152610d8f81613103565b9050610cfa565b509392505050565b600d60205260009081526040902080546001820154600283015460038401546004850180549495939492939192610dd49061309b565b80601f0160208091040260200160405190810160405280929190818152602001828054610e009061309b565b8015610e4d5780601f10610e2257610100808354040283529160200191610e4d565b820191906000526020600020905b815481529060010190602001808311610e3057829003601f168201915b5050506005909301549192505060ff1686565b6001600160a01b038316331480610e7c5750610e7c833361060d565b610e985760405162461bcd60e51b815260040161072390612d59565b610ea3838383611a69565b505050565b6005546001600160a01b03163314610ed25760405162461bcd60e51b815260040161072390612efb565b610c3a6000611a74565b6005546001600160a01b03163314610f065760405162461bcd60e51b815260040161072390612efb565b610c3a611ac6565b6060600780546107e99061309b565b336001600160a01b0383161415610f885760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610723565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600780546110019061309b565b80601f016020809104026020016040519081016040528092919081815260200182805461102d9061309b565b801561107a5780601f1061104f5761010080835404028352916020019161107a565b820191906000526020600020905b81548152906001019060200180831161105d57829003601f168201915b505050505081565b600b5461010090046001600160a01b0316331461123857600b5460ff166110dc5760405162461bcd60e51b815260206004820152600e60248201526d135d5cdd081d1a595c881b5a5b9d60921b6044820152606401610723565b6000818152600d602052604090206005015460ff1661110d5760405162461bcd60e51b815260040161072390612da2565b6000818152600d602052604090206003015482111561113e5760405162461bcd60e51b815260040161072390612de5565b6000818152600d6020526040902054349061115a908490611b41565b111561119e5760405162461bcd60e51b8152602060048201526013602482015272139bdd08195b9bdd59da08195d1a081cd95b9d606a1b6044820152606401610723565b6000818152600d602090815260408083206003810154338552600690910190925290912054106112055760405162461bcd60e51b815260206004820152601260248201527110db185a5b5959081b585e08185b5bdd5b9d60721b6044820152606401610723565b6000818152600d602090815260408083203384526006019091528120805460019290611232908490613021565b90915550505b6000818152600d60205260409020600281015460019091015461125b8483613021565b11156112795760405162461bcd60e51b815260040161072390612f30565b6000828152600d6020526040902060010154611296908490613021565b600d600084815260200190815260200160002060010181905550610ea333838560405180602001604052806000815250611b54565b6008546000818152600d60205260408082206002808201546009548552838520820154600a54865293852090910154948452600190910154929384939192916113148785613021565b116113265760085494508293506113d0565b6009546000908152600d60205260409020600101546113458784613021565b116113575760095494508193506113d0565b600a546000908152600d60205260409020600101546113768783613021565b1161138857600a5494508093506113d0565b60405162461bcd60e51b815260206004820152601d60248201527f4e6f207469636b657473206c6566742066726f6d20616e7920746965720000006044820152606401610723565b6000858152600d60205260409020600101546113ec8786613021565b111561140a5760405162461bcd60e51b815260040161072390612f30565b600b5461010090046001600160a01b0316331461157d576000858152600d602052604090206005015460ff166114525760405162461bcd60e51b815260040161072390612da2565b6000858152600d60205260409020600301548611156114835760405162461bcd60e51b815260040161072390612de5565b6000858152600d6020526040902054349061149f908890611b41565b11156114e35760405162461bcd60e51b8152602060048201526013602482015272139bdd08195b9bdd59da08195d1a081cd95b9d606a1b6044820152606401610723565b6000858152600d6020908152604080832060038101543385526006909101909252909120541061154a5760405162461bcd60e51b815260206004820152601260248201527110db185a5b5959081b585e08185b5bdd5b9d60721b6044820152606401610723565b6000858152600d602090815260408083203384526006019091528120805460019290611577908490613021565b90915550505b6000858152600d602052604090206002015461159a908790613021565b600d6000878152602001908152602001600020600201819055506109ee33868860405180602001604052806000815250611b54565b600680546110019061309b565b6008546000908152600d60205260408082206002908101546009548452828420820154600a54855292842090910154909190806109458385613021565b6005546001600160a01b031633146116435760405162461bcd60e51b815260040161072390612efb565b600892909255600955600a55565b6001600160a01b03851633148061166d575061166d853361060d565b6116895760405162461bcd60e51b815260040161072390612d59565b610a868585858585611b66565b6005546001600160a01b031633146116c05760405162461bcd60e51b815260040161072390612efb565b6001600160a01b0381166117255760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610723565b6107d781611a74565b6001600160a01b03831633148061174a575061174a833361060d565b6117665760405162461bcd60e51b815260040161072390612d59565b610ea3838383611c92565b8051610c04906002906020840190612453565b6060600280546117939061309b565b80601f01602080910402602001604051908101604052809291908181526020018280546117bf9061309b565b801561180c5780601f106117e15761010080835404028352916020019161180c565b820191906000526020600020905b8154815290600101906020018083116117ef57829003601f168201915b50505050509050919050565b81518351146118395760405162461bcd60e51b815260040161072390612f75565b6001600160a01b03841661185f5760405162461bcd60e51b815260040161072390612e29565b3361186e818787878787611c9d565b60005b845181101561197057600085828151811061189c57634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008583815181106118c857634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156119185760405162461bcd60e51b815260040161072390612eb1565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611955908490613021565b925050819055505050508061196990613103565b9050611871565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516119c0929190612c8c565b60405180910390a46109ee818787878787611cab565b60035460ff16611a1f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610723565b6003805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b610ea3838383611e16565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60035460ff1615611b0c5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610723565b6003805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611a4c3390565b6000611b4d8284613039565b9392505050565b611b6084848484611eb4565b50505050565b6001600160a01b038416611b8c5760405162461bcd60e51b815260040161072390612e29565b33611bab818787611b9c88611ee9565b611ba588611ee9565b87611c9d565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015611bec5760405162461bcd60e51b815260040161072390612eb1565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290611c29908490613021565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611c89828888888888611f42565b50505050505050565b610ea383838361200c565b6109ee86868686868661203f565b6001600160a01b0384163b156109ee5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611cef9089908990889088908890600401612bd6565b602060405180830381600087803b158015611d0957600080fd5b505af1925050508015611d39575060408051601f3d908101601f19168201909252611d369181019061292c565b60015b611de657611d4561314a565b806308c379a01415611d7f5750611d5a613162565b80611d655750611d81565b8060405162461bcd60e51b81526004016107239190612cba565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610723565b6001600160e01b0319811663bc197c8160e01b14611c895760405162461bcd60e51b815260040161072390612ccd565b611e218383836120a7565b60005b8251811015611b6057818181518110611e4d57634e487b7160e01b600052603260045260246000fd5b602002602001015160046000858481518110611e7957634e487b7160e01b600052603260045260246000fd5b602002602001015181526020019081526020016000206000828254611e9e9190613058565b90915550611ead905081613103565b9050611e24565b611ec084848484612251565b60008381526004602052604081208054849290611ede908490613021565b909155505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611f3157634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b6001600160a01b0384163b156109ee5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611f869089908990889088908890600401612c34565b602060405180830381600087803b158015611fa057600080fd5b505af1925050508015611fd0575060408051601f3d908101601f19168201909252611fcd9181019061292c565b60015b611fdc57611d4561314a565b6001600160e01b0319811663f23a6e6160e01b14611c895760405162461bcd60e51b815260040161072390612ccd565b612017838383612352565b60008281526004602052604081208054839290612035908490613058565b9091555050505050565b60035460ff16156109ee5760405162461bcd60e51b815260206004820152602c60248201527f455243313135355061757361626c653a20746f6b656e207472616e736665722060448201526b1dda1a5b19481c185d5cd95960a21b6064820152608401610723565b6001600160a01b0383166120cd5760405162461bcd60e51b815260040161072390612e6e565b80518251146120ee5760405162461bcd60e51b815260040161072390612f75565b600033905061211181856000868660405180602001604052806000815250611c9d565b60005b83518110156121f257600084828151811061213f57634e487b7160e01b600052603260045260246000fd5b60200260200101519050600084838151811061216b57634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038c1683529093529190912054909150818110156121bb5760405162461bcd60e51b815260040161072390612d15565b6000928352602083815260408085206001600160a01b038b16865290915290922091039055806121ea81613103565b915050612114565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051612243929190612c8c565b60405180910390a450505050565b6001600160a01b0384166122b15760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610723565b336122c281600087611b9c88611ee9565b6000848152602081815260408083206001600160a01b0389168452909152812080548592906122f2908490613021565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610a8681600087878787611f42565b6001600160a01b0383166123785760405162461bcd60e51b815260040161072390612e6e565b336123a78185600061238987611ee9565b61239287611ee9565b60405180602001604052806000815250611c9d565b6000838152602081815260408083206001600160a01b0388168452909152902054828110156123e85760405162461bcd60e51b815260040161072390612d15565b6000848152602081815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b82805461245f9061309b565b90600052602060002090601f01602090048101928261248157600085556124c7565b82601f1061249a57805160ff19168380011785556124c7565b828001600101855582156124c7579182015b828111156124c75782518255916020019190600101906124ac565b506124d39291506124d7565b5090565b5b808211156124d357600081556001016124d8565b80356001600160a01b038116811461250357600080fd5b919050565b600082601f830112612518578081fd5b8135602061252582612ffd565b60405161253282826130d6565b8381528281019150858301600585901b87018401881015612551578586fd5b855b8581101561256f57813584529284019290840190600101612553565b5090979650505050505050565b8035801515811461250357600080fd5b600082601f83011261259c578081fd5b813567ffffffffffffffff8111156125b6576125b6613134565b6040516125cd601f8301601f1916602001826130d6565b8181528460208386010111156125e1578283fd5b816020850160208301379081016020019190915292915050565b60006020828403121561260c578081fd5b611b4d826124ec565b60008060408385031215612627578081fd5b612630836124ec565b915061263e602084016124ec565b90509250929050565b600080600080600060a0868803121561265e578081fd5b612667866124ec565b9450612675602087016124ec565b9350604086013567ffffffffffffffff80821115612691578283fd5b61269d89838a01612508565b945060608801359150808211156126b2578283fd5b6126be89838a01612508565b935060808801359150808211156126d3578283fd5b506126e08882890161258c565b9150509295509295909350565b600080600080600060a08688031215612704578081fd5b61270d866124ec565b945061271b602087016124ec565b93506040860135925060608601359150608086013567ffffffffffffffff811115612744578182fd5b6126e08882890161258c565b600080600060608486031215612764578283fd5b61276d846124ec565b9250602084013567ffffffffffffffff80821115612789578384fd5b61279587838801612508565b935060408601359150808211156127aa578283fd5b506127b786828701612508565b9150509250925092565b600080604083850312156127d3578182fd5b6127dc836124ec565b915061263e6020840161257c565b600080604083850312156127fc578182fd5b612805836124ec565b946020939093013593505050565b600080600060608486031215612827578081fd5b612830846124ec565b95602085013595506040909401359392505050565b60008060408385031215612857578182fd5b823567ffffffffffffffff8082111561286e578384fd5b818501915085601f830112612881578384fd5b8135602061288e82612ffd565b60405161289b82826130d6565b8381528281019150858301600585901b870184018b10156128ba578889fd5b8896505b848710156128e3576128cf816124ec565b8352600196909601959183019183016128be565b50965050860135925050808211156128f9578283fd5b5061290685828601612508565b9150509250929050565b600060208284031215612921578081fd5b8135611b4d816131ec565b60006020828403121561293d578081fd5b8151611b4d816131ec565b600060208284031215612959578081fd5b813567ffffffffffffffff81111561296f578182fd5b61297b8482850161258c565b949350505050565b600060208284031215612994578081fd5b5035919050565b600080604083850312156129ad578182fd5b50508035926020909101359150565b6000806000606084860312156129d0578081fd5b505081359360208301359350604090920135919050565b600080600080600060a086880312156129fe578283fd5b853594506020860135935060408601359250606086013567ffffffffffffffff811115612a29578182fd5b612a358882890161258c565b925050612a446080870161257c565b90509295509295909350565b60008060008060008060c08789031215612a68578384fd5b86359550602087013594506040870135935060608701359250608087013567ffffffffffffffff811115612a9a578182fd5b612aa689828a0161258c565b925050612ab560a0880161257c565b90509295509295509295565b6000815180845260208085019450808401835b83811015612af057815187529582019590820190600101612ad4565b509495945050505050565b60008151808452612b1381602086016020860161306f565b601f01601f19169290920160200192915050565b600083516020612b3a828583890161306f565b8454918401918390600181811c9080831680612b5757607f831692505b858310811415612b7557634e487b7160e01b88526022600452602488fd5b808015612b895760018114612b9a57612bc6565b60ff19851688528388019550612bc6565b60008b815260209020895b85811015612bbe5781548a820152908401908801612ba5565b505083880195505b50939a9950505050505050505050565b6001600160a01b0386811682528516602082015260a060408201819052600090612c0290830186612ac1565b8281036060840152612c148186612ac1565b90508281036080840152612c288185612afb565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612c6e90830184612afb565b979650505050505050565b602081526000611b4d6020830184612ac1565b604081526000612c9f6040830185612ac1565b8281036020840152612cb18185612ac1565b95945050505050565b602081526000611b4d6020830184612afb565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526023908201527f4e6f742063757272656e746c7920616c6c6f77656420746f20626520636c61696040820152621b595960ea1b606082015260800190565b60208082526024908201527f417474656d7074696e6720746f20636c61696d20746f6f206d616e79207469636040820152636b65747360e01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f4e6f7420656e6f756768207469636b6574732061626c6520746f20626520636c604082015264185a5b595960da1b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b86815285602082015284604082015283606082015260c060808201526000612fe860c0830185612afb565b905082151560a0830152979650505050505050565b600067ffffffffffffffff82111561301757613017613134565b5060051b60200190565b600082198211156130345761303461311e565b500190565b60008160001904831182151516156130535761305361311e565b500290565b60008282101561306a5761306a61311e565b500390565b60005b8381101561308a578181015183820152602001613072565b83811115611b605750506000910152565b600181811c908216806130af57607f821691505b602082108114156130d057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff811182821017156130fc576130fc613134565b6040525050565b60006000198214156131175761311761311e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d111561315f57600481823e5160e01c5b90565b600060443d10156131705790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156131a057505050505090565b82850191508151818111156131b85750505050505090565b843d87010160208285010111156131d25750505050505090565b6131e1602082860101876130d6565b509095945050505050565b6001600160e01b0319811681146107d757600080fdfea26469706673582212200f81af71b64e979405618999412b2f864e6ce57bafa2b1ba85a89fbad0033a8064736f6c634300080400330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000104e46542041636365737320436c61696d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094e46544143434553530000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102195760003560e01c8063715018a611610123578063bb6b13a1116100ab578063e985e9c51161006f578063e985e9c5146105f2578063edcdb7f71461063b578063f242432a1461065b578063f2fde38b1461067b578063f5298aca1461069b57600080fd5b8063bb6b13a114610572578063bd85b03914610588578063c275043f146105b5578063e2b9e186146105c8578063e8d9d08d146105dd57600080fd5b8063905ffb9d116100f2578063905ffb9d146104fb57806395d89b4114610515578063a22cb4651461052a578063af17dea61461054a578063b6a557841461055f57600080fd5b8063715018a6146104765780638456cb591461048b578063879dce7b146104a05780638da5cb5b146104dd57600080fd5b80633ac37dfc116101a65780634e1273f4116101755780634e1273f4146103b05780634f558e79146103dd57806350b447121461040c5780635c975abb1461043e5780636b20c4541461045657600080fd5b80633ac37dfc146103505780633ccfd60b146103705780633f4ba83a146103855780634b1740ad1461039a57600080fd5b80630e89341c116101ed5780630e89341c146102c55780631f93aa1e146102e55780632e222e62146102fa5780632eb2c2d61461031a5780633806153e1461033a57600080fd5b8062fdd58e1461021e57806301ffc9a71461025157806302fe53051461028157806306fdde03146102a3575b600080fd5b34801561022a57600080fd5b5061023e6102393660046127ea565b6106bb565b6040519081526020015b60405180910390f35b34801561025d57600080fd5b5061027161026c366004612910565b610752565b6040519015158152602001610248565b34801561028d57600080fd5b506102a161029c366004612948565b6107a4565b005b3480156102af57600080fd5b506102b86107da565b6040516102489190612cba565b3480156102d157600080fd5b506102b86102e0366004612983565b61086c565b3480156102f157600080fd5b5061023e610908565b34801561030657600080fd5b506102a16103153660046129e7565b610957565b34801561032657600080fd5b506102a1610335366004612647565b6109f6565b34801561034657600080fd5b5061023e60095481565b34801561035c57600080fd5b506102a161036b366004612a50565b610a8d565b34801561037c57600080fd5b506102a1610b12565b34801561039157600080fd5b506102a1610c08565b3480156103a657600080fd5b5061023e600a5481565b3480156103bc57600080fd5b506103d06103cb366004612845565b610c3c565b6040516102489190612c79565b3480156103e957600080fd5b506102716103f8366004612983565b600090815260046020526040902054151590565b34801561041857600080fd5b5061042c610427366004612983565b610d9e565b60405161024896959493929190612fbd565b34801561044a57600080fd5b5060035460ff16610271565b34801561046257600080fd5b506102a1610471366004612750565b610e60565b34801561048257600080fd5b506102a1610ea8565b34801561049757600080fd5b506102a1610edc565b3480156104ac57600080fd5b50600b546104c59061010090046001600160a01b031681565b6040516001600160a01b039091168152602001610248565b3480156104e957600080fd5b506005546001600160a01b03166104c5565b34801561050757600080fd5b50600b546102719060ff1681565b34801561052157600080fd5b506102b8610f0e565b34801561053657600080fd5b506102a16105453660046127c1565b610f1d565b34801561055657600080fd5b506102b8610ff4565b6102a161056d36600461299b565b611082565b34801561057e57600080fd5b5061023e60085481565b34801561059457600080fd5b5061023e6105a3366004612983565b60009081526004602052604090205490565b6102a16105c3366004612983565b6112cb565b3480156105d457600080fd5b506102b86115cf565b3480156105e957600080fd5b5061023e6115dc565b3480156105fe57600080fd5b5061027161060d366004612615565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561064757600080fd5b506102a16106563660046129bc565b611619565b34801561066757600080fd5b506102a16106763660046126ed565b611651565b34801561068757600080fd5b506102a16106963660046125fb565b611696565b3480156106a757600080fd5b506102a16106b6366004612813565b61172e565b60006001600160a01b03831661072c5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061078357506001600160e01b031982166303a24d0760e21b145b8061079e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6005546001600160a01b031633146107ce5760405162461bcd60e51b815260040161072390612efb565b6107d781611771565b50565b6060600680546107e99061309b565b80601f01602080910402602001604051908101604052809291908181526020018280546108159061309b565b80156108625780601f1061083757610100808354040283529160200191610862565b820191906000526020600020905b81548152906001019060200180831161084557829003601f168201915b5050505050905090565b6000818152600d60205260409020600101546060906108c65760405162461bcd60e51b81526020600482015260166024820152752aa9249d103737b732bc34b9ba32b73a103a37b5b2b760511b6044820152606401610723565b6108cf82611784565b6000838152600d602090815260409182902091516108f293926004019101612b27565b6040516020818303038152906040529050919050565b6008546000908152600d60205260408082206001908101546009548452828420820154600a54855292842090910154909190806109458385613021565b61094f9190613021565b935050505090565b6005546001600160a01b031633146109815760405162461bcd60e51b815260040161072390612efb565b6000600d6000610990600c5490565b815260208082019290925260400160009081208881556001810188905560028101919091556003810186905584519092506109d391600484019190860190612453565b5060058101805460ff1916831515179055600c805460010190555b505050505050565b6001600160a01b038516331480610a125750610a12853361060d565b610a795760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610723565b610a868585858585611818565b5050505050565b6005546001600160a01b03163314610ab75760405162461bcd60e51b815260040161072390612efb565b6000858152600d602090815260409091208781558351610adf92600490920191850190612453565b506000948552600d60205260409094206001810193909355506003820155600501805460ff191691151591909117905550565b60004711610b625760405162461bcd60e51b815260206004820152601f60248201527f436f6e74726163742063757272656e746c7920686173206e6f206574686572006044820152606401610723565b600b5460405147916000916101009091046001600160a01b031690839060006040518083038185875af1925050503d8060008114610bbc576040519150601f19603f3d011682016040523d82523d6000602084013e610bc1565b606091505b5050905080610c045760405162461bcd60e51b815260206004820152600f60248201526e4661696c656420776974686472617760881b6044820152606401610723565b5050565b6005546001600160a01b03163314610c325760405162461bcd60e51b815260040161072390612efb565b610c3a6119d6565b565b60608151835114610ca15760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610723565b6000835167ffffffffffffffff811115610ccb57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610cf4578160200160208202803683370190505b50905060005b8451811015610d9657610d5b858281518110610d2657634e487b7160e01b600052603260045260246000fd5b6020026020010151858381518110610d4e57634e487b7160e01b600052603260045260246000fd5b60200260200101516106bb565b828281518110610d7b57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152610d8f81613103565b9050610cfa565b509392505050565b600d60205260009081526040902080546001820154600283015460038401546004850180549495939492939192610dd49061309b565b80601f0160208091040260200160405190810160405280929190818152602001828054610e009061309b565b8015610e4d5780601f10610e2257610100808354040283529160200191610e4d565b820191906000526020600020905b815481529060010190602001808311610e3057829003601f168201915b5050506005909301549192505060ff1686565b6001600160a01b038316331480610e7c5750610e7c833361060d565b610e985760405162461bcd60e51b815260040161072390612d59565b610ea3838383611a69565b505050565b6005546001600160a01b03163314610ed25760405162461bcd60e51b815260040161072390612efb565b610c3a6000611a74565b6005546001600160a01b03163314610f065760405162461bcd60e51b815260040161072390612efb565b610c3a611ac6565b6060600780546107e99061309b565b336001600160a01b0383161415610f885760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610723565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600780546110019061309b565b80601f016020809104026020016040519081016040528092919081815260200182805461102d9061309b565b801561107a5780601f1061104f5761010080835404028352916020019161107a565b820191906000526020600020905b81548152906001019060200180831161105d57829003601f168201915b505050505081565b600b5461010090046001600160a01b0316331461123857600b5460ff166110dc5760405162461bcd60e51b815260206004820152600e60248201526d135d5cdd081d1a595c881b5a5b9d60921b6044820152606401610723565b6000818152600d602052604090206005015460ff1661110d5760405162461bcd60e51b815260040161072390612da2565b6000818152600d602052604090206003015482111561113e5760405162461bcd60e51b815260040161072390612de5565b6000818152600d6020526040902054349061115a908490611b41565b111561119e5760405162461bcd60e51b8152602060048201526013602482015272139bdd08195b9bdd59da08195d1a081cd95b9d606a1b6044820152606401610723565b6000818152600d602090815260408083206003810154338552600690910190925290912054106112055760405162461bcd60e51b815260206004820152601260248201527110db185a5b5959081b585e08185b5bdd5b9d60721b6044820152606401610723565b6000818152600d602090815260408083203384526006019091528120805460019290611232908490613021565b90915550505b6000818152600d60205260409020600281015460019091015461125b8483613021565b11156112795760405162461bcd60e51b815260040161072390612f30565b6000828152600d6020526040902060010154611296908490613021565b600d600084815260200190815260200160002060010181905550610ea333838560405180602001604052806000815250611b54565b6008546000818152600d60205260408082206002808201546009548552838520820154600a54865293852090910154948452600190910154929384939192916113148785613021565b116113265760085494508293506113d0565b6009546000908152600d60205260409020600101546113458784613021565b116113575760095494508193506113d0565b600a546000908152600d60205260409020600101546113768783613021565b1161138857600a5494508093506113d0565b60405162461bcd60e51b815260206004820152601d60248201527f4e6f207469636b657473206c6566742066726f6d20616e7920746965720000006044820152606401610723565b6000858152600d60205260409020600101546113ec8786613021565b111561140a5760405162461bcd60e51b815260040161072390612f30565b600b5461010090046001600160a01b0316331461157d576000858152600d602052604090206005015460ff166114525760405162461bcd60e51b815260040161072390612da2565b6000858152600d60205260409020600301548611156114835760405162461bcd60e51b815260040161072390612de5565b6000858152600d6020526040902054349061149f908890611b41565b11156114e35760405162461bcd60e51b8152602060048201526013602482015272139bdd08195b9bdd59da08195d1a081cd95b9d606a1b6044820152606401610723565b6000858152600d6020908152604080832060038101543385526006909101909252909120541061154a5760405162461bcd60e51b815260206004820152601260248201527110db185a5b5959081b585e08185b5bdd5b9d60721b6044820152606401610723565b6000858152600d602090815260408083203384526006019091528120805460019290611577908490613021565b90915550505b6000858152600d602052604090206002015461159a908790613021565b600d6000878152602001908152602001600020600201819055506109ee33868860405180602001604052806000815250611b54565b600680546110019061309b565b6008546000908152600d60205260408082206002908101546009548452828420820154600a54855292842090910154909190806109458385613021565b6005546001600160a01b031633146116435760405162461bcd60e51b815260040161072390612efb565b600892909255600955600a55565b6001600160a01b03851633148061166d575061166d853361060d565b6116895760405162461bcd60e51b815260040161072390612d59565b610a868585858585611b66565b6005546001600160a01b031633146116c05760405162461bcd60e51b815260040161072390612efb565b6001600160a01b0381166117255760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610723565b6107d781611a74565b6001600160a01b03831633148061174a575061174a833361060d565b6117665760405162461bcd60e51b815260040161072390612d59565b610ea3838383611c92565b8051610c04906002906020840190612453565b6060600280546117939061309b565b80601f01602080910402602001604051908101604052809291908181526020018280546117bf9061309b565b801561180c5780601f106117e15761010080835404028352916020019161180c565b820191906000526020600020905b8154815290600101906020018083116117ef57829003601f168201915b50505050509050919050565b81518351146118395760405162461bcd60e51b815260040161072390612f75565b6001600160a01b03841661185f5760405162461bcd60e51b815260040161072390612e29565b3361186e818787878787611c9d565b60005b845181101561197057600085828151811061189c57634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008583815181106118c857634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156119185760405162461bcd60e51b815260040161072390612eb1565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611955908490613021565b925050819055505050508061196990613103565b9050611871565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516119c0929190612c8c565b60405180910390a46109ee818787878787611cab565b60035460ff16611a1f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610723565b6003805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b610ea3838383611e16565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60035460ff1615611b0c5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610723565b6003805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611a4c3390565b6000611b4d8284613039565b9392505050565b611b6084848484611eb4565b50505050565b6001600160a01b038416611b8c5760405162461bcd60e51b815260040161072390612e29565b33611bab818787611b9c88611ee9565b611ba588611ee9565b87611c9d565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015611bec5760405162461bcd60e51b815260040161072390612eb1565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290611c29908490613021565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611c89828888888888611f42565b50505050505050565b610ea383838361200c565b6109ee86868686868661203f565b6001600160a01b0384163b156109ee5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611cef9089908990889088908890600401612bd6565b602060405180830381600087803b158015611d0957600080fd5b505af1925050508015611d39575060408051601f3d908101601f19168201909252611d369181019061292c565b60015b611de657611d4561314a565b806308c379a01415611d7f5750611d5a613162565b80611d655750611d81565b8060405162461bcd60e51b81526004016107239190612cba565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610723565b6001600160e01b0319811663bc197c8160e01b14611c895760405162461bcd60e51b815260040161072390612ccd565b611e218383836120a7565b60005b8251811015611b6057818181518110611e4d57634e487b7160e01b600052603260045260246000fd5b602002602001015160046000858481518110611e7957634e487b7160e01b600052603260045260246000fd5b602002602001015181526020019081526020016000206000828254611e9e9190613058565b90915550611ead905081613103565b9050611e24565b611ec084848484612251565b60008381526004602052604081208054849290611ede908490613021565b909155505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611f3157634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b6001600160a01b0384163b156109ee5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611f869089908990889088908890600401612c34565b602060405180830381600087803b158015611fa057600080fd5b505af1925050508015611fd0575060408051601f3d908101601f19168201909252611fcd9181019061292c565b60015b611fdc57611d4561314a565b6001600160e01b0319811663f23a6e6160e01b14611c895760405162461bcd60e51b815260040161072390612ccd565b612017838383612352565b60008281526004602052604081208054839290612035908490613058565b9091555050505050565b60035460ff16156109ee5760405162461bcd60e51b815260206004820152602c60248201527f455243313135355061757361626c653a20746f6b656e207472616e736665722060448201526b1dda1a5b19481c185d5cd95960a21b6064820152608401610723565b6001600160a01b0383166120cd5760405162461bcd60e51b815260040161072390612e6e565b80518251146120ee5760405162461bcd60e51b815260040161072390612f75565b600033905061211181856000868660405180602001604052806000815250611c9d565b60005b83518110156121f257600084828151811061213f57634e487b7160e01b600052603260045260246000fd5b60200260200101519050600084838151811061216b57634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038c1683529093529190912054909150818110156121bb5760405162461bcd60e51b815260040161072390612d15565b6000928352602083815260408085206001600160a01b038b16865290915290922091039055806121ea81613103565b915050612114565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051612243929190612c8c565b60405180910390a450505050565b6001600160a01b0384166122b15760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610723565b336122c281600087611b9c88611ee9565b6000848152602081815260408083206001600160a01b0389168452909152812080548592906122f2908490613021565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610a8681600087878787611f42565b6001600160a01b0383166123785760405162461bcd60e51b815260040161072390612e6e565b336123a78185600061238987611ee9565b61239287611ee9565b60405180602001604052806000815250611c9d565b6000838152602081815260408083206001600160a01b0388168452909152902054828110156123e85760405162461bcd60e51b815260040161072390612d15565b6000848152602081815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b82805461245f9061309b565b90600052602060002090601f01602090048101928261248157600085556124c7565b82601f1061249a57805160ff19168380011785556124c7565b828001600101855582156124c7579182015b828111156124c75782518255916020019190600101906124ac565b506124d39291506124d7565b5090565b5b808211156124d357600081556001016124d8565b80356001600160a01b038116811461250357600080fd5b919050565b600082601f830112612518578081fd5b8135602061252582612ffd565b60405161253282826130d6565b8381528281019150858301600585901b87018401881015612551578586fd5b855b8581101561256f57813584529284019290840190600101612553565b5090979650505050505050565b8035801515811461250357600080fd5b600082601f83011261259c578081fd5b813567ffffffffffffffff8111156125b6576125b6613134565b6040516125cd601f8301601f1916602001826130d6565b8181528460208386010111156125e1578283fd5b816020850160208301379081016020019190915292915050565b60006020828403121561260c578081fd5b611b4d826124ec565b60008060408385031215612627578081fd5b612630836124ec565b915061263e602084016124ec565b90509250929050565b600080600080600060a0868803121561265e578081fd5b612667866124ec565b9450612675602087016124ec565b9350604086013567ffffffffffffffff80821115612691578283fd5b61269d89838a01612508565b945060608801359150808211156126b2578283fd5b6126be89838a01612508565b935060808801359150808211156126d3578283fd5b506126e08882890161258c565b9150509295509295909350565b600080600080600060a08688031215612704578081fd5b61270d866124ec565b945061271b602087016124ec565b93506040860135925060608601359150608086013567ffffffffffffffff811115612744578182fd5b6126e08882890161258c565b600080600060608486031215612764578283fd5b61276d846124ec565b9250602084013567ffffffffffffffff80821115612789578384fd5b61279587838801612508565b935060408601359150808211156127aa578283fd5b506127b786828701612508565b9150509250925092565b600080604083850312156127d3578182fd5b6127dc836124ec565b915061263e6020840161257c565b600080604083850312156127fc578182fd5b612805836124ec565b946020939093013593505050565b600080600060608486031215612827578081fd5b612830846124ec565b95602085013595506040909401359392505050565b60008060408385031215612857578182fd5b823567ffffffffffffffff8082111561286e578384fd5b818501915085601f830112612881578384fd5b8135602061288e82612ffd565b60405161289b82826130d6565b8381528281019150858301600585901b870184018b10156128ba578889fd5b8896505b848710156128e3576128cf816124ec565b8352600196909601959183019183016128be565b50965050860135925050808211156128f9578283fd5b5061290685828601612508565b9150509250929050565b600060208284031215612921578081fd5b8135611b4d816131ec565b60006020828403121561293d578081fd5b8151611b4d816131ec565b600060208284031215612959578081fd5b813567ffffffffffffffff81111561296f578182fd5b61297b8482850161258c565b949350505050565b600060208284031215612994578081fd5b5035919050565b600080604083850312156129ad578182fd5b50508035926020909101359150565b6000806000606084860312156129d0578081fd5b505081359360208301359350604090920135919050565b600080600080600060a086880312156129fe578283fd5b853594506020860135935060408601359250606086013567ffffffffffffffff811115612a29578182fd5b612a358882890161258c565b925050612a446080870161257c565b90509295509295909350565b60008060008060008060c08789031215612a68578384fd5b86359550602087013594506040870135935060608701359250608087013567ffffffffffffffff811115612a9a578182fd5b612aa689828a0161258c565b925050612ab560a0880161257c565b90509295509295509295565b6000815180845260208085019450808401835b83811015612af057815187529582019590820190600101612ad4565b509495945050505050565b60008151808452612b1381602086016020860161306f565b601f01601f19169290920160200192915050565b600083516020612b3a828583890161306f565b8454918401918390600181811c9080831680612b5757607f831692505b858310811415612b7557634e487b7160e01b88526022600452602488fd5b808015612b895760018114612b9a57612bc6565b60ff19851688528388019550612bc6565b60008b815260209020895b85811015612bbe5781548a820152908401908801612ba5565b505083880195505b50939a9950505050505050505050565b6001600160a01b0386811682528516602082015260a060408201819052600090612c0290830186612ac1565b8281036060840152612c148186612ac1565b90508281036080840152612c288185612afb565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612c6e90830184612afb565b979650505050505050565b602081526000611b4d6020830184612ac1565b604081526000612c9f6040830185612ac1565b8281036020840152612cb18185612ac1565b95945050505050565b602081526000611b4d6020830184612afb565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526023908201527f4e6f742063757272656e746c7920616c6c6f77656420746f20626520636c61696040820152621b595960ea1b606082015260800190565b60208082526024908201527f417474656d7074696e6720746f20636c61696d20746f6f206d616e79207469636040820152636b65747360e01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f4e6f7420656e6f756768207469636b6574732061626c6520746f20626520636c604082015264185a5b595960da1b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b86815285602082015284604082015283606082015260c060808201526000612fe860c0830185612afb565b905082151560a0830152979650505050505050565b600067ffffffffffffffff82111561301757613017613134565b5060051b60200190565b600082198211156130345761303461311e565b500190565b60008160001904831182151516156130535761305361311e565b500290565b60008282101561306a5761306a61311e565b500390565b60005b8381101561308a578181015183820152602001613072565b83811115611b605750506000910152565b600181811c908216806130af57607f821691505b602082108114156130d057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff811182821017156130fc576130fc613134565b6040525050565b60006000198214156131175761311761311e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d111561315f57600481823e5160e01c5b90565b600060443d10156131705790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156131a057505050505090565b82850191508151818111156131b85750505050505090565b843d87010160208285010111156131d25750505050505090565b6131e1602082860101876130d6565b509095945050505050565b6001600160e01b0319811681146107d757600080fdfea26469706673582212200f81af71b64e979405618999412b2f864e6ce57bafa2b1ba85a89fbad0033a8064736f6c63430008040033

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

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000104e46542041636365737320436c61696d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094e46544143434553530000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): NFT Access Claim
Arg [1] : _symbol (string): NFTACCESS

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [3] : 4e46542041636365737320436c61696d00000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [5] : 4e46544143434553530000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

166:6817:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2054:228:4;;;;;;;;;;-1:-1:-1;2054:228:4;;;;;:::i;:::-;;:::i;:::-;;;25647:25:17;;;25635:2;25620:18;2054:228:4;;;;;;;;1105:305;;;;;;;;;;-1:-1:-1;1105:305:4;;;;;:::i;:::-;;:::i;:::-;;;14381:14:17;;14374:22;14356:41;;14344:2;14329:18;1105:305:4;14311:92:17;486:91:0;;;;;;;;;;-1:-1:-1;486:91:0;;;;;:::i;:::-;;:::i;:::-;;587:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;6754:222:13:-;;;;;;;;;;-1:-1:-1;6754:222:13;;;;;:::i;:::-;;:::i;6126:260::-;;;;;;;;;;;;;:::i;1289:457::-;;;;;;;;;;-1:-1:-1;1289:457:13;;;;;:::i;:::-;;:::i;4082:430:4:-;;;;;;;;;;-1:-1:-1;4082:430:4;;;;;:::i;:::-;;:::i;314:21:13:-;;;;;;;;;;;;;;;;2122:397;;;;;;;;;;-1:-1:-1;2122:397:13;;;;;:::i;:::-;;:::i;5398:290::-;;;;;;;;;;;;;:::i;411:65:0:-;;;;;;;;;;;;;:::i;341:21:13:-;;;;;;;;;;;;;;;;2439:508:4;;;;;;;;;;-1:-1:-1;2439:508:4;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;807:120:7:-;;;;;;;;;;-1:-1:-1;807:120:7;;;;;:::i;:::-;864:4;691:16;;;:12;:16;;;;;;-1:-1:-1;;;807:120:7;537:47:13;;;;;;;;;;-1:-1:-1;537:47:13;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;1034:84:15:-;;;;;;;;;;-1:-1:-1;1104:7:15;;;;1034:84;;628:342:5;;;;;;;;;;-1:-1:-1;628:342:5;;;;;:::i;:::-;;:::i;1598:92:14:-;;;;;;;;;;;;;:::i;344:61:0:-;;;;;;;;;;;;;:::i;409:78:13:-;;;;;;;;;;-1:-1:-1;409:78:13;;;;;;;-1:-1:-1;;;;;409:78:13;;;;;;-1:-1:-1;;;;;12040:32:17;;;12022:51;;12010:2;11995:18;409:78:13;11977:102:17;966:85:14;;;;;;;;;;-1:-1:-1;1038:6:14;;-1:-1:-1;;;;;1038:6:14;966:85;;369:33:13;;;;;;;;;;-1:-1:-1;369:33:13;;;;;;;;674:85:0;;;;;;;;;;;;;:::i;3015:306:4:-;;;;;;;;;;-1:-1:-1;3015:306:4;;;;;:::i;:::-;;:::i;309:21:0:-;;;;;;;;;;;;;:::i;4371:956:13:-;;;;;;:::i;:::-;;:::i;287:21::-;;;;;;;;;;;;;;;;603:111:7;;;;;;;;;;-1:-1:-1;603:111:7;;;;;:::i;:::-;665:7;691:16;;;:12;:16;;;;;;;603:111;2634:1585:13;;;;;;:::i;:::-;;:::i;284:19:0:-;;;;;;;;;;;;;:::i;6465:283:13:-;;;;;;;;;;;;;:::i;3388:166:4:-;;;;;;;;;;-1:-1:-1;3388:166:4;;;;;:::i;:::-;-1:-1:-1;;;;;3510:27:4;;;3487:4;3510:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;3388:166;5885:164:13;;;;;;;;;;-1:-1:-1;5885:164:13;;;;;:::i;:::-;;:::i;3621:389:4:-;;;;;;;;;;-1:-1:-1;3621:389:4;;;;;:::i;:::-;;:::i;1839:189:14:-;;;;;;;;;;-1:-1:-1;1839:189:14;;;;;:::i;:::-;;:::i;312:310:5:-;;;;;;;;;;-1:-1:-1;312:310:5;;;;;:::i;:::-;;:::i;2054:228:4:-;2140:7;-1:-1:-1;;;;;2167:21:4;;2159:77;;;;-1:-1:-1;;;2159:77:4;;16013:2:17;2159:77:4;;;15995:21:17;16052:2;16032:18;;;16025:30;16091:34;16071:18;;;16064:62;-1:-1:-1;;;16142:18:17;;;16135:41;16193:19;;2159:77:4;;;;;;;;;-1:-1:-1;2253:9:4;:13;;;;;;;;;;;-1:-1:-1;;;;;2253:22:4;;;;;;;;;;;;2054:228::o;1105:305::-;1207:4;-1:-1:-1;;;;;;1242:41:4;;-1:-1:-1;;;1242:41:4;;:109;;-1:-1:-1;;;;;;;1299:52:4;;-1:-1:-1;;;1299:52:4;1242:109;:161;;;-1:-1:-1;;;;;;;;;;871:40:8;;;1367:36:4;1223:180;1105:305;-1:-1:-1;;1105:305:4:o;486:91:0:-;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;554:16:0::1;562:7;554;:16::i;:::-;486:91:::0;:::o;587:81::-;624:13;656:5;649:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;587:81;:::o;6754:222:13:-;6865:1;6843:12;;;:7;:12;;;;;:19;;;6810:13;;6835:58;;;;-1:-1:-1;;;6835:58:13;;22957:2:17;6835:58:13;;;22939:21:17;22996:2;22976:18;;;22969:30;-1:-1:-1;;;23015:18:17;;;23008:52;23077:18;;6835:58:13;22929:172:17;6835:58:13;6934:14;6944:3;6934:9;:14::i;:::-;6950:12;;;;:7;:12;;;;;;;;;6917:51;;;;;6950:17;;;6917:51;;:::i;:::-;;;;;;;;;;;;;6903:66;;6754:222;;;:::o;6126:260::-;6217:5;;6176:4;6209:14;;;:7;:14;;;;;;:21;;;;;6265:5;;6257:14;;;;;:21;;;6313:5;;6305:14;;;;;:21;;;;6209;;6257;6305;6345;6257;6209;6345;:::i;:::-;:33;;;;:::i;:::-;6337:42;;;;;6126:260;:::o;1289:457::-;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;1433:27:13::1;1463:7;:30;1471:21;:11;864:14:3::0;;773:112;1471:21:13::1;1463:30:::0;;::::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;1463:30:13;;;1503:29;;;1542:13:::1;::::0;::::1;:23:::0;;;1575:20:::1;::::0;::::1;:24:::0;;;;1609:17:::1;::::0;::::1;:31:::0;;;1650:19;;1463:30;;-1:-1:-1;1650:19:13::1;::::0;:11:::1;::::0;::::1;::::0;:19;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;1679:15:13::1;::::0;::::1;:27:::0;;-1:-1:-1;;1679:27:13::1;::::0;::::1;;;::::0;;1716:11:::1;978:19:3::0;;-1:-1:-1;978:19:3;;;1716:23:13::1;1248:1:14;1289:457:13::0;;;;;:::o;4082:430:4:-;-1:-1:-1;;;;;4307:20:4;;665:10:2;4307:20:4;;:60;;-1:-1:-1;4331:36:4;4348:4;665:10:2;3388:166:4;:::i;4331:36::-;4286:157;;;;-1:-1:-1;;;4286:157:4;;19980:2:17;4286:157:4;;;19962:21:17;20019:2;19999:18;;;19992:30;20058:34;20038:18;;;20031:62;-1:-1:-1;;;20109:18:17;;;20102:48;20167:19;;4286:157:4;19952:240:17;4286:157:4;4453:52;4476:4;4482:2;4486:3;4491:7;4500:4;4453:22;:52::i;:::-;4082:430;;;;;:::o;2122:397:13:-;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;2281:16:13::1;::::0;;;:7:::1;:16;::::0;;;;;;;:39;;;2334:29;;::::1;::::0;:21:::1;::::0;;::::1;::::0;:29;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;2377:16:13::1;::::0;;;:7:::1;:16;::::0;;;;;:23:::1;::::0;::::1;:33:::0;;;;-1:-1:-1;2420:27:13::1;::::0;::::1;:41:::0;2475:25:::1;;:37:::0;;-1:-1:-1;;2475:37:13::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;2122:397:13:o;5398:290::-;5469:1;5445:21;:25;5437:69;;;;-1:-1:-1;;;5437:69:13;;18464:2:17;5437:69:13;;;18446:21:17;18503:2;18483:18;;;18476:30;18542:33;18522:18;;;18515:61;18593:18;;5437:69:13;18436:181:17;5437:69:13;5588:18;;:49;;5540:21;;5516;;5588:18;;;;-1:-1:-1;;;;;5588:18:13;;5540:21;;5588:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5571:66;;;5655:6;5647:34;;;;-1:-1:-1;;;5647:34:13;;22266:2:17;5647:34:13;;;22248:21:17;22305:2;22285:18;;;22278:30;-1:-1:-1;;;22324:18:17;;;22317:45;22379:18;;5647:34:13;22238:165:17;5647:34:13;5398:290;;:::o;411:65:0:-;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;459:10:0::1;:8;:10::i;:::-;411:65::o:0;2439:508:4:-;2590:16;2649:3;:10;2630:8;:15;:29;2622:83;;;;-1:-1:-1;;;2622:83:4;;24124:2:17;2622:83:4;;;24106:21:17;24163:2;24143:18;;;24136:30;24202:34;24182:18;;;24175:62;-1:-1:-1;;;24253:18:17;;;24246:39;24302:19;;2622:83:4;24096:231:17;2622:83:4;2716:30;2763:8;:15;2749:30;;;;;;-1:-1:-1;;;2749:30:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2749:30:4;;2716:63;;2795:9;2790:120;2814:8;:15;2810:1;:19;2790:120;;;2869:30;2879:8;2888:1;2879:11;;;;;;-1:-1:-1;;;2879:11:4;;;;;;;;;;;;;;;2892:3;2896:1;2892:6;;;;;;-1:-1:-1;;;2892:6:4;;;;;;;;;;;;;;;2869:9;:30::i;:::-;2850:13;2864:1;2850:16;;;;;;-1:-1:-1;;;2850:16:4;;;;;;;;;;;;;;;;;;:49;2831:3;;;:::i;:::-;;;2790:120;;;-1:-1:-1;2927:13:4;2439:508;-1:-1:-1;;;2439:508:4:o;537:47:13:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;537:47:13;;;;;;;-1:-1:-1;;537:47:13;;;:::o;628:342:5:-;-1:-1:-1;;;;;787:23:5;;665:10:2;787:23:5;;:66;;-1:-1:-1;814:39:5;831:7;665:10:2;3388:166:4;:::i;814:39:5:-;766:154;;;;-1:-1:-1;;;766:154:5;;;;;;;:::i;:::-;931:32;942:7;951:3;956:6;931:10;:32::i;:::-;628:342;;;:::o;1598:92:14:-;1038:6;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;1662:21:::1;1680:1;1662:9;:21::i;344:61:0:-:0;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;390:8:0::1;:6;:8::i;674:85::-:0;713:13;745:7;738:14;;;;;:::i;3015:306:4:-;665:10:2;-1:-1:-1;;;;;3117:24:4;;;;3109:78;;;;-1:-1:-1;;;3109:78:4;;23714:2:17;3109:78:4;;;23696:21:17;23753:2;23733:18;;;23726:30;23792:34;23772:18;;;23765:62;-1:-1:-1;;;23843:18:17;;;23836:39;23892:19;;3109:78:4;23686:231:17;3109:78:4;665:10:2;3198:32:4;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;3198:42:4;;;;;;;;;;;;:53;;-1:-1:-1;;3198:53:4;;;;;;;;;;3266:48;;14356:41:17;;;3198:42:4;;665:10:2;3266:48:4;;14329:18:17;3266:48:4;;;;;;;3015:306;;:::o;309:21:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4371:956:13:-;4472:18;;;;;-1:-1:-1;;;;;4472:18:13;4458:10;:32;4454:571;;4514:13;;;;4506:40;;;;-1:-1:-1;;;4506:40:13;;21923:2:17;4506:40:13;;;21905:21:17;21962:2;21942:18;;;21935:30;-1:-1:-1;;;21981:18:17;;;21974:44;22035:18;;4506:40:13;21895:164:17;4506:40:13;4568:16;;;;:7;:16;;;;;:25;;;;;4560:74;;;;-1:-1:-1;;;4560:74:13;;;;;;;:::i;:::-;4668:16;;;;:7;:16;;;;;:27;;;4656:39;;;4648:88;;;;-1:-1:-1;;;4648:88:13;;;;;;;:::i;:::-;4771:16;;;;:7;:16;;;;;:26;4802:9;;4758:40;;:8;;:12;:40::i;:::-;:53;;4750:85;;;;-1:-1:-1;;;4750:85:13;;21575:2:17;4750:85:13;;;21557:21:17;21614:2;21594:18;;;21587:30;-1:-1:-1;;;21633:18:17;;;21626:49;21692:18;;4750:85:13;21547:169:17;4750:85:13;4902:16;;;;:7;:16;;;;;;;;:27;;;;4888:10;4857:42;;:30;;;;:42;;;;;;;:72;4849:104;;;;-1:-1:-1;;;4849:104:13;;22610:2:17;4849:104:13;;;22592:21:17;22649:2;22629:18;;;22622:30;-1:-1:-1;;;22668:18:17;;;22661:48;22726:18;;4849:104:13;22582:168:17;4849:104:13;4967:16;;;;:7;:16;;;;;;;;4998:10;4967:42;;:30;;:42;;;;;:47;;5013:1;;4967:16;:47;;5013:1;;4967:47;:::i;:::-;;;;-1:-1:-1;;4454:571:13;5035:18;5056:16;;;:7;:16;;;;;:30;;;;5132:23;;;;;5104:24;5120:8;5056:30;5104:24;:::i;:::-;:51;;5096:102;;;;-1:-1:-1;;;5096:102:13;;;;;;;:::i;:::-;5234:16;;;;:7;:16;;;;;:23;;;:34;;5260:8;;5234:34;:::i;:::-;5208:7;:16;5216:7;5208:16;;;;;;;;;;;:23;;:60;;;;5280:40;5286:10;5298:7;5307:8;5280:40;;;;;;;;;;;;:5;:40::i;2634:1585::-;2782:5;;2700:9;2774:14;;;:7;:14;;;;;;:28;;;;;2846:5;;2838:14;;;;;:28;;;2910:5;;2902:14;;;;;:28;;;;2978:14;;;:21;;;;;2700:9;;;;2774:28;;2838;2945:29;2966:8;2774:28;2945:29;:::i;:::-;:54;2941:525;;3022:5;;3015:12;;3057:18;3041:34;;2941:525;;;3137:5;;3129:14;;;;:7;:14;;;;;:21;;;3096:29;3117:8;3096:18;:29;:::i;:::-;:54;3092:374;;3173:5;;3166:12;;3208:18;3192:34;;3092:374;;;3288:5;;3280:14;;;;:7;:14;;;;;:21;;;3247:29;3268:8;3247:18;:29;:::i;:::-;:54;3243:223;;3324:5;;3317:12;;3359:18;3343:34;;3243:223;;;3408:47;;-1:-1:-1;;;3408:47:13;;25345:2:17;3408:47:13;;;25327:21:17;25384:2;25364:18;;;25357:30;25423:31;25403:18;;;25396:59;25472:18;;3408:47:13;25317:179:17;3408:47:13;3512:13;;;;:7;:13;;;;;:20;;;3484:24;3500:8;3484:13;:24;:::i;:::-;:48;;3476:99;;;;-1:-1:-1;;;3476:99:13;;;;;;;:::i;:::-;3604:18;;;;;-1:-1:-1;;;;;3604:18:13;3590:10;:32;3586:499;;3646:13;;;;:7;:13;;;;;:22;;;;;3638:71;;;;-1:-1:-1;;;3638:71:13;;;;;;;:::i;:::-;3743:13;;;;:7;:13;;;;;:24;;;3731:36;;;3723:85;;;;-1:-1:-1;;;3723:85:13;;;;;;;:::i;:::-;3843:13;;;;:7;:13;;;;;:23;3871:9;;3830:37;;:8;;:12;:37::i;:::-;:50;;3822:82;;;;-1:-1:-1;;;3822:82:13;;21575:2:17;3822:82:13;;;21557:21:17;21614:2;21594:18;;;21587:30;-1:-1:-1;;;21633:18:17;;;21626:49;21692:18;;3822:82:13;21547:169:17;3822:82:13;3968:13;;;;:7;:13;;;;;;;;:24;;;;3954:10;3926:39;;:27;;;;:39;;;;;;;:66;3918:98;;;;-1:-1:-1;;;3918:98:13;;22610:2:17;3918:98:13;;;22592:21:17;22649:2;22629:18;;;22622:30;-1:-1:-1;;;22668:18:17;;;22661:48;22726:18;;3918:98:13;22582:168:17;3918:98:13;4030:13;;;;:7;:13;;;;;;;;4058:10;4030:39;;:27;;:39;;;;;:44;;4073:1;;4030:13;:44;;4073:1;;4030:44;:::i;:::-;;;;-1:-1:-1;;3586:499:13;4125:13;;;;:7;:13;;;;;:27;;;:38;;4155:8;;4125:38;:::i;:::-;4095:7;:13;4103:4;4095:13;;;;;;;;;;;:27;;:68;;;;4175:37;4181:10;4193:4;4199:8;4175:37;;;;;;;;;;;;:5;:37::i;284:19:0:-;;;;;;;:::i;6465:283:13:-;6558:5;;6517:4;6550:14;;;:7;:14;;;;;;:28;;;;;6613:5;;6605:14;;;;;:28;;;6668:5;;6660:14;;;;;:28;;;;6550;;6605;6660;6707:21;6605:28;6550;6707:21;:::i;5885:164::-;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;5980:5:13::1;:14:::0;;;;6004:5:::1;:14:::0;6028:5:::1;:14:::0;5885:164::o;3621:389:4:-;-1:-1:-1;;;;;3821:20:4;;665:10:2;3821:20:4;;:60;;-1:-1:-1;3845:36:4;3862:4;665:10:2;3388:166:4;:::i;3845:36::-;3800:148;;;;-1:-1:-1;;;3800:148:4;;;;;;;:::i;:::-;3958:45;3976:4;3982:2;3986;3990:6;3998:4;3958:17;:45::i;1839:189:14:-;1038:6;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;-1:-1:-1;;;;;1927:22:14;::::1;1919:73;;;::::0;-1:-1:-1;;;1919:73:14;;16425:2:17;1919:73:14::1;::::0;::::1;16407:21:17::0;16464:2;16444:18;;;16437:30;16503:34;16483:18;;;16476:62;-1:-1:-1;;;16554:18:17;;;16547:36;16600:19;;1919:73:14::1;16397:228:17::0;1919:73:14::1;2002:19;2012:8;2002:9;:19::i;312:310:5:-:0;-1:-1:-1;;;;;446:23:5;;665:10:2;446:23:5;;:66;;-1:-1:-1;473:39:5;490:7;665:10:2;3388:166:4;:::i;473:39:5:-;425:154;;;;-1:-1:-1;;;425:154:5;;;;;;;:::i;:::-;590:25;596:7;605:2;609:5;590;:25::i;7973:86:4:-;8039:13;;;;:4;;:13;;;;;:::i;1809:103::-;1869:13;1901:4;1894:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1809:103;;;:::o;6105:1045::-;6325:7;:14;6311:3;:10;:28;6303:81;;;;-1:-1:-1;;;6303:81:4;;;;;;;:::i;:::-;-1:-1:-1;;;;;6402:16:4;;6394:66;;;;-1:-1:-1;;;6394:66:4;;;;;;;:::i;:::-;665:10:2;6513:60:4;665:10:2;6544:4:4;6550:2;6554:3;6559:7;6568:4;6513:20;:60::i;:::-;6589:9;6584:411;6608:3;:10;6604:1;:14;6584:411;;;6639:10;6652:3;6656:1;6652:6;;;;;;-1:-1:-1;;;6652:6:4;;;;;;;;;;;;;;;6639:19;;6672:14;6689:7;6697:1;6689:10;;;;;;-1:-1:-1;;;6689:10:4;;;;;;;;;;;;;;;;;;;;6714:19;6736:13;;;;;;;;;;-1:-1:-1;;;;;6736:19:4;;;;;;;;;;;;6689:10;;-1:-1:-1;6777:21:4;;;;6769:76;;;;-1:-1:-1;;;6769:76:4;;;;;;;:::i;:::-;6887:9;:13;;;;;;;;;;;-1:-1:-1;;;;;6887:19:4;;;;;;;;;;6909:20;;;6887:42;;6957:17;;;;;;;:27;;6909:20;;6887:9;6957:27;;6909:20;;6957:27;:::i;:::-;;;;;;;;6584:411;;;6620:3;;;;:::i;:::-;;;6584:411;;;;7040:2;-1:-1:-1;;;;;7010:47:4;7034:4;-1:-1:-1;;;;;7010:47:4;7024:8;-1:-1:-1;;;;;7010:47:4;;7044:3;7049:7;7010:47;;;;;;;:::i;:::-;;;;;;;;7068:75;7104:8;7114:4;7120:2;7124:3;7129:7;7138:4;7068:35;:75::i;2046:117:15:-;1104:7;;;;1605:41;;;;-1:-1:-1;;;1605:41:15;;15664:2:17;1605:41:15;;;15646:21:17;15703:2;15683:18;;;15676:30;-1:-1:-1;;;15722:18:17;;;15715:50;15782:18;;1605:41:15;15636:170:17;1605:41:15;2104:7:::1;:15:::0;;-1:-1:-1;;2104:15:15::1;::::0;;2134:22:::1;665:10:2::0;2143:12:15::1;2134:22;::::0;-1:-1:-1;;;;;12040:32:17;;;12022:51;;12010:2;11995:18;2134:22:15::1;;;;;;;2046:117::o:0;1448:221:0:-;1623:39;1640:7;1649:3;1654:7;1623:16;:39::i;2034:169:14:-;2108:6;;;-1:-1:-1;;;;;2124:17:14;;;-1:-1:-1;;;;;;2124:17:14;;;;;;;2156:40;;2108:6;;;2124:17;2108:6;;2156:40;;2089:16;;2156:40;2034:169;;:::o;1799:115:15:-;1104:7;;;;1347:9;1339:38;;;;-1:-1:-1;;;1339:38:15;;19229:2:17;1339:38:15;;;19211:21:17;19268:2;19248:18;;;19241:30;-1:-1:-1;;;19287:18:17;;;19280:46;19343:18;;1339:38:15;19201:166:17;1339:38:15;1858:7:::1;:14:::0;;-1:-1:-1;;1858:14:15::1;1868:4;1858:14;::::0;;1887:20:::1;1894:12;665:10:2::0;;586:96;3382::16;3440:7;3466:5;3470:1;3466;:5;:::i;:::-;3459:12;3382:96;-1:-1:-1;;;3382:96:16:o;775:222:0:-;952:38;964:7;973:2;977:6;985:4;952:11;:38::i;:::-;775:222;;;;:::o;4962:797:4:-;-1:-1:-1;;;;;5143:16:4;;5135:66;;;;-1:-1:-1;;;5135:66:4;;;;;;;:::i;:::-;665:10:2;5254:96:4;665:10:2;5285:4:4;5291:2;5295:21;5313:2;5295:17;:21::i;:::-;5318:25;5336:6;5318:17;:25::i;:::-;5345:4;5254:20;:96::i;:::-;5361:19;5383:13;;;;;;;;;;;-1:-1:-1;;;;;5383:19:4;;;;;;;;;;5420:21;;;;5412:76;;;;-1:-1:-1;;;5412:76:4;;;;;;;:::i;:::-;5522:9;:13;;;;;;;;;;;-1:-1:-1;;;;;5522:19:4;;;;;;;;;;5544:20;;;5522:42;;5584:17;;;;;;;:27;;5544:20;;5522:9;5584:27;;5544:20;;5584:27;:::i;:::-;;;;-1:-1:-1;;5627:46:4;;;25857:25:17;;;25913:2;25898:18;;25891:34;;;-1:-1:-1;;;;;5627:46:4;;;;;;;;;;;;;;25830:18:17;5627:46:4;;;;;;;5684:68;5715:8;5725:4;5731:2;5735;5739:6;5747:4;5684:30;:68::i;:::-;4962:797;;;;;;;:::o;1253:189:0:-;1403:32;1415:7;1424:2;1428:6;1403:11;:32::i;1677:330::-;1934:66;1961:8;1971:4;1977:2;1981:3;1986:7;1995:4;1934:26;:66::i;13973:796:4:-;-1:-1:-1;;;;;14205:13:4;;1034:20:1;1080:8;14201:562:4;;14240:79;;-1:-1:-1;;;14240:79:4;;-1:-1:-1;;;;;14240:43:4;;;;;:79;;14284:8;;14294:4;;14300:3;;14305:7;;14314:4;;14240:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14240:79:4;;;;;;;;-1:-1:-1;;14240:79:4;;;;;;;;;;;;:::i;:::-;;;14236:517;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;14629:6;14622:14;;-1:-1:-1;;;14622:14:4;;;;;;;;:::i;14236:517::-;;;14676:62;;-1:-1:-1;;;14676:62:4;;14834:2:17;14676:62:4;;;14816:21:17;14873:2;14853:18;;;14846:30;14912:34;14892:18;;;14885:62;-1:-1:-1;;;14963:18:17;;;14956:50;15023:19;;14676:62:4;14806:242:17;14236:517:4;-1:-1:-1;;;;;;14398:64:4;;-1:-1:-1;;;14398:64:4;14394:161;;14486:50;;-1:-1:-1;;;14486:50:4;;;;;;;:::i;1921:306:7:-;2072:39;2089:7;2098:3;2103:7;2072:16;:39::i;:::-;2126:9;2121:100;2145:3;:10;2141:1;:14;2121:100;;;2200:7;2208:1;2200:10;;;;;;-1:-1:-1;;;2200:10:7;;;;;;;;;;;;;;;2176:12;:20;2189:3;2193:1;2189:6;;;;;;-1:-1:-1;;;2189:6:7;;;;;;;;;;;;;;;2176:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;2157:3:7;;-1:-1:-1;2157:3:7;;:::i;:::-;;;2121:100;;982:234;1135:38;1147:7;1156:2;1160:6;1168:4;1135:11;:38::i;:::-;1183:16;;;;:12;:16;;;;;:26;;1203:6;;1183:16;:26;;1203:6;;1183:26;:::i;:::-;;;;-1:-1:-1;;;;;;982:234:7:o;14775:193:4:-;14894:16;;;14908:1;14894:16;;;;;;;;;14841;;14869:22;;14894:16;;;;;;;;;;;;-1:-1:-1;14894:16:4;14869:41;;14931:7;14920:5;14926:1;14920:8;;;;;;-1:-1:-1;;;14920:8:4;;;;;;;;;;;;;;;;;;:18;14956:5;14775:193;-1:-1:-1;;14775:193:4:o;13238:729::-;-1:-1:-1;;;;;13445:13:4;;1034:20:1;1080:8;13441:520:4;;13480:72;;-1:-1:-1;;;13480:72:4;;-1:-1:-1;;;;;13480:38:4;;;;;:72;;13519:8;;13529:4;;13535:2;;13539:6;;13547:4;;13480:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13480:72:4;;;;;;;;-1:-1:-1;;13480:72:4;;;;;;;;;;;;:::i;:::-;;;13476:475;;;;:::i;:::-;-1:-1:-1;;;;;;13601:59:4;;-1:-1:-1;;;13601:59:4;13597:156;;13684:50;;-1:-1:-1;;;13684:50:4;;;;;;;:::i;1660:201:7:-;1786:32;1798:7;1807:2;1811:6;1786:11;:32::i;:::-;1828:16;;;;:12;:16;;;;;:26;;1848:6;;1828:16;:26;;1848:6;;1828:26;:::i;:::-;;;;-1:-1:-1;;;;;1660:201:7:o;612:381:6:-;1104:7:15;;;;928:9:6;920:66;;;;-1:-1:-1;;;920:66:6;;17237:2:17;920:66:6;;;17219:21:17;17276:2;17256:18;;;17249:30;17315:34;17295:18;;;17288:62;-1:-1:-1;;;17366:18:17;;;17359:42;17418:19;;920:66:6;17209:234:17;11190:894:4;-1:-1:-1;;;;;11340:21:4;;11332:69;;;;-1:-1:-1;;;11332:69:4;;;;;;;:::i;:::-;11433:7;:14;11419:3;:10;:28;11411:81;;;;-1:-1:-1;;;11411:81:4;;;;;;;:::i;:::-;11503:16;665:10:2;11503:31:4;;11545:69;11566:8;11576:7;11593:1;11597:3;11602:7;11545:69;;;;;;;;;;;;:20;:69::i;:::-;11630:9;11625:379;11649:3;:10;11645:1;:14;11625:379;;;11680:10;11693:3;11697:1;11693:6;;;;;;-1:-1:-1;;;11693:6:4;;;;;;;;;;;;;;;11680:19;;11713:14;11730:7;11738:1;11730:10;;;;;;-1:-1:-1;;;11730:10:4;;;;;;;;;;;;;;;;;;;;11755:22;11780:13;;;;;;;;;;-1:-1:-1;;;;;11780:22:4;;;;;;;;;;;;11730:10;;-1:-1:-1;11824:24:4;;;;11816:73;;;;-1:-1:-1;;;11816:73:4;;;;;;;:::i;:::-;11931:9;:13;;;;;;;;;;;-1:-1:-1;;;;;11931:22:4;;;;;;;;;;11956:23;;11931:48;;11661:3;;;;:::i;:::-;;;;11625:379;;;;12060:1;-1:-1:-1;;;;;12019:58:4;12043:7;-1:-1:-1;;;;;12019:58:4;12033:8;-1:-1:-1;;;;;12019:58:4;;12064:3;12069:7;12019:58;;;;;;;:::i;:::-;;;;;;;;11190:894;;;;:::o;8447:583::-;-1:-1:-1;;;;;8599:21:4;;8591:67;;;;-1:-1:-1;;;8591:67:4;;24943:2:17;8591:67:4;;;24925:21:17;24982:2;24962:18;;;24955:30;25021:34;25001:18;;;24994:62;-1:-1:-1;;;25072:18:17;;;25065:31;25113:19;;8591:67:4;24915:223:17;8591:67:4;665:10:2;8711:107:4;665:10:2;8669:16:4;8754:7;8763:21;8781:2;8763:17;:21::i;8711:107::-;8829:9;:13;;;;;;;;;;;-1:-1:-1;;;;;8829:22:4;;;;;;;;;:32;;8855:6;;8829:9;:32;;8855:6;;8829:32;:::i;:::-;;;;-1:-1:-1;;8876:57:4;;;25857:25:17;;;25913:2;25898:18;;25891:34;;;-1:-1:-1;;;;;8876:57:4;;;;8909:1;;8876:57;;;;;;25830:18:17;8876:57:4;;;;;;;8944:79;8975:8;8993:1;8997:7;9006:2;9010:6;9018:4;8944:30;:79::i;10339:657::-;-1:-1:-1;;;;;10464:21:4;;10456:69;;;;-1:-1:-1;;;10456:69:4;;;;;;;:::i;:::-;665:10:2;10578:105:4;665:10:2;10609:7:4;10536:16;10630:21;10648:2;10630:17;:21::i;:::-;10653:25;10671:6;10653:17;:25::i;:::-;10578:105;;;;;;;;;;;;:20;:105::i;:::-;10694:22;10719:13;;;;;;;;;;;-1:-1:-1;;;;;10719:22:4;;;;;;;;;;10759:24;;;;10751:73;;;;-1:-1:-1;;;10751:73:4;;;;;;;:::i;:::-;10858:9;:13;;;;;;;;;;;-1:-1:-1;;;;;10858:22:4;;;;;;;;;;;;10883:23;;;10858:48;;10932:57;;25857:25:17;;;25898:18;;;25891:34;;;10858:22:4;;10932:57;;;;;;25830:18:17;10932:57:4;;;;;;;10339:657;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:17;82:20;;-1:-1:-1;;;;;131:31:17;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:755::-;246:5;299:3;292:4;284:6;280:17;276:27;266:2;;321:5;314;307:20;266:2;361:6;348:20;387:4;410:43;450:2;410:43;:::i;:::-;482:2;476:9;494:31;522:2;514:6;494:31;:::i;:::-;560:18;;;594:15;;;;-1:-1:-1;629:15:17;;;679:1;675:10;;;663:23;;659:32;;656:41;-1:-1:-1;653:2:17;;;714:5;707;700:20;653:2;740:5;754:163;768:2;765:1;762:9;754:163;;;825:17;;813:30;;863:12;;;;895;;;;786:1;779:9;754:163;;;-1:-1:-1;935:6:17;;256:691;-1:-1:-1;;;;;;;256:691:17:o;952:160::-;1017:20;;1073:13;;1066:21;1056:32;;1046:2;;1102:1;1099;1092:12;1117:575;1159:5;1212:3;1205:4;1197:6;1193:17;1189:27;1179:2;;1234:5;1227;1220:20;1179:2;1274:6;1261:20;1300:18;1296:2;1293:26;1290:2;;;1322:18;;:::i;:::-;1371:2;1365:9;1383:67;1438:2;1419:13;;-1:-1:-1;;1415:27:17;1444:4;1411:38;1365:9;1383:67;:::i;:::-;1474:2;1466:6;1459:18;1520:3;1513:4;1508:2;1500:6;1496:15;1492:26;1489:35;1486:2;;;1541:5;1534;1527:20;1486:2;1609;1602:4;1594:6;1590:17;1583:4;1575:6;1571:17;1558:54;1632:15;;;1649:4;1628:26;1621:41;;;;1636:6;1169:523;-1:-1:-1;;1169:523:17:o;1697:196::-;1756:6;1809:2;1797:9;1788:7;1784:23;1780:32;1777:2;;;1830:6;1822;1815:22;1777:2;1858:29;1877:9;1858:29;:::i;1898:270::-;1966:6;1974;2027:2;2015:9;2006:7;2002:23;1998:32;1995:2;;;2048:6;2040;2033:22;1995:2;2076:29;2095:9;2076:29;:::i;:::-;2066:39;;2124:38;2158:2;2147:9;2143:18;2124:38;:::i;:::-;2114:48;;1985:183;;;;;:::o;2173:983::-;2327:6;2335;2343;2351;2359;2412:3;2400:9;2391:7;2387:23;2383:33;2380:2;;;2434:6;2426;2419:22;2380:2;2462:29;2481:9;2462:29;:::i;:::-;2452:39;;2510:38;2544:2;2533:9;2529:18;2510:38;:::i;:::-;2500:48;;2599:2;2588:9;2584:18;2571:32;2622:18;2663:2;2655:6;2652:14;2649:2;;;2684:6;2676;2669:22;2649:2;2712:61;2765:7;2756:6;2745:9;2741:22;2712:61;:::i;:::-;2702:71;;2826:2;2815:9;2811:18;2798:32;2782:48;;2855:2;2845:8;2842:16;2839:2;;;2876:6;2868;2861:22;2839:2;2904:63;2959:7;2948:8;2937:9;2933:24;2904:63;:::i;:::-;2894:73;;3020:3;3009:9;3005:19;2992:33;2976:49;;3050:2;3040:8;3037:16;3034:2;;;3071:6;3063;3056:22;3034:2;;3099:51;3142:7;3131:8;3120:9;3116:24;3099:51;:::i;:::-;3089:61;;;2370:786;;;;;;;;:::o;3161:626::-;3265:6;3273;3281;3289;3297;3350:3;3338:9;3329:7;3325:23;3321:33;3318:2;;;3372:6;3364;3357:22;3318:2;3400:29;3419:9;3400:29;:::i;:::-;3390:39;;3448:38;3482:2;3471:9;3467:18;3448:38;:::i;:::-;3438:48;;3533:2;3522:9;3518:18;3505:32;3495:42;;3584:2;3573:9;3569:18;3556:32;3546:42;;3639:3;3628:9;3624:19;3611:33;3667:18;3659:6;3656:30;3653:2;;;3704:6;3696;3689:22;3653:2;3732:49;3773:7;3764:6;3753:9;3749:22;3732:49;:::i;3792:699::-;3919:6;3927;3935;3988:2;3976:9;3967:7;3963:23;3959:32;3956:2;;;4009:6;4001;3994:22;3956:2;4037:29;4056:9;4037:29;:::i;:::-;4027:39;;4117:2;4106:9;4102:18;4089:32;4140:18;4181:2;4173:6;4170:14;4167:2;;;4202:6;4194;4187:22;4167:2;4230:61;4283:7;4274:6;4263:9;4259:22;4230:61;:::i;:::-;4220:71;;4344:2;4333:9;4329:18;4316:32;4300:48;;4373:2;4363:8;4360:16;4357:2;;;4394:6;4386;4379:22;4357:2;;4422:63;4477:7;4466:8;4455:9;4451:24;4422:63;:::i;:::-;4412:73;;;3946:545;;;;;:::o;4496:264::-;4561:6;4569;4622:2;4610:9;4601:7;4597:23;4593:32;4590:2;;;4643:6;4635;4628:22;4590:2;4671:29;4690:9;4671:29;:::i;:::-;4661:39;;4719:35;4750:2;4739:9;4735:18;4719:35;:::i;4765:264::-;4833:6;4841;4894:2;4882:9;4873:7;4869:23;4865:32;4862:2;;;4915:6;4907;4900:22;4862:2;4943:29;4962:9;4943:29;:::i;:::-;4933:39;5019:2;5004:18;;;;4991:32;;-1:-1:-1;;;4852:177:17:o;5034:332::-;5111:6;5119;5127;5180:2;5168:9;5159:7;5155:23;5151:32;5148:2;;;5201:6;5193;5186:22;5148:2;5229:29;5248:9;5229:29;:::i;:::-;5219:39;5305:2;5290:18;;5277:32;;-1:-1:-1;5356:2:17;5341:18;;;5328:32;;5138:228;-1:-1:-1;;;5138:228:17:o;5371:1274::-;5489:6;5497;5550:2;5538:9;5529:7;5525:23;5521:32;5518:2;;;5571:6;5563;5556:22;5518:2;5616:9;5603:23;5645:18;5686:2;5678:6;5675:14;5672:2;;;5707:6;5699;5692:22;5672:2;5750:6;5739:9;5735:22;5725:32;;5795:7;5788:4;5784:2;5780:13;5776:27;5766:2;;5822:6;5814;5807:22;5766:2;5863;5850:16;5885:4;5908:43;5948:2;5908:43;:::i;:::-;5980:2;5974:9;5992:31;6020:2;6012:6;5992:31;:::i;:::-;6058:18;;;6092:15;;;;-1:-1:-1;6127:11:17;;;6169:1;6165:10;;;6157:19;;6153:28;;6150:41;-1:-1:-1;6147:2:17;;;6209:6;6201;6194:22;6147:2;6236:6;6227:15;;6251:169;6265:2;6262:1;6259:9;6251:169;;;6322:23;6341:3;6322:23;:::i;:::-;6310:36;;6283:1;6276:9;;;;;6366:12;;;;6398;;6251:169;;;-1:-1:-1;6439:6:17;-1:-1:-1;;6483:18:17;;6470:32;;-1:-1:-1;;6514:16:17;;;6511:2;;;6548:6;6540;6533:22;6511:2;;6576:63;6631:7;6620:8;6609:9;6605:24;6576:63;:::i;:::-;6566:73;;;5508:1137;;;;;:::o;6650:255::-;6708:6;6761:2;6749:9;6740:7;6736:23;6732:32;6729:2;;;6782:6;6774;6767:22;6729:2;6826:9;6813:23;6845:30;6869:5;6845:30;:::i;6910:259::-;6979:6;7032:2;7020:9;7011:7;7007:23;7003:32;7000:2;;;7053:6;7045;7038:22;7000:2;7090:9;7084:16;7109:30;7133:5;7109:30;:::i;7174:341::-;7243:6;7296:2;7284:9;7275:7;7271:23;7267:32;7264:2;;;7317:6;7309;7302:22;7264:2;7362:9;7349:23;7395:18;7387:6;7384:30;7381:2;;;7432:6;7424;7417:22;7381:2;7460:49;7501:7;7492:6;7481:9;7477:22;7460:49;:::i;:::-;7450:59;7254:261;-1:-1:-1;;;;7254:261:17:o;7520:190::-;7579:6;7632:2;7620:9;7611:7;7607:23;7603:32;7600:2;;;7653:6;7645;7638:22;7600:2;-1:-1:-1;7681:23:17;;7590:120;-1:-1:-1;7590:120:17:o;7715:258::-;7783:6;7791;7844:2;7832:9;7823:7;7819:23;7815:32;7812:2;;;7865:6;7857;7850:22;7812:2;-1:-1:-1;;7893:23:17;;;7963:2;7948:18;;;7935:32;;-1:-1:-1;7802:171:17:o;7978:326::-;8055:6;8063;8071;8124:2;8112:9;8103:7;8099:23;8095:32;8092:2;;;8145:6;8137;8130:22;8092:2;-1:-1:-1;;8173:23:17;;;8243:2;8228:18;;8215:32;;-1:-1:-1;8294:2:17;8279:18;;;8266:32;;8082:222;-1:-1:-1;8082:222:17:o;8309:615::-;8411:6;8419;8427;8435;8443;8496:3;8484:9;8475:7;8471:23;8467:33;8464:2;;;8518:6;8510;8503:22;8464:2;8559:9;8546:23;8536:33;;8616:2;8605:9;8601:18;8588:32;8578:42;;8667:2;8656:9;8652:18;8639:32;8629:42;;8722:2;8711:9;8707:18;8694:32;8749:18;8741:6;8738:30;8735:2;;;8786:6;8778;8771:22;8735:2;8814:49;8855:7;8846:6;8835:9;8831:22;8814:49;:::i;:::-;8804:59;;;8882:36;8913:3;8902:9;8898:19;8882:36;:::i;:::-;8872:46;;8454:470;;;;;;;;:::o;8929:684::-;9040:6;9048;9056;9064;9072;9080;9133:3;9121:9;9112:7;9108:23;9104:33;9101:2;;;9155:6;9147;9140:22;9101:2;9196:9;9183:23;9173:33;;9253:2;9242:9;9238:18;9225:32;9215:42;;9304:2;9293:9;9289:18;9276:32;9266:42;;9355:2;9344:9;9340:18;9327:32;9317:42;;9410:3;9399:9;9395:19;9382:33;9438:18;9430:6;9427:30;9424:2;;;9475:6;9467;9460:22;9424:2;9503:49;9544:7;9535:6;9524:9;9520:22;9503:49;:::i;:::-;9493:59;;;9571:36;9602:3;9591:9;9587:19;9571:36;:::i;:::-;9561:46;;9091:522;;;;;;;;:::o;9618:437::-;9671:3;9709:5;9703:12;9736:6;9731:3;9724:19;9762:4;9791:2;9786:3;9782:12;9775:19;;9828:2;9821:5;9817:14;9849:3;9861:169;9875:6;9872:1;9869:13;9861:169;;;9936:13;;9924:26;;9970:12;;;;10005:15;;;;9897:1;9890:9;9861:169;;;-1:-1:-1;10046:3:17;;9679:376;-1:-1:-1;;;;;9679:376:17:o;10060:257::-;10101:3;10139:5;10133:12;10166:6;10161:3;10154:19;10182:63;10238:6;10231:4;10226:3;10222:14;10215:4;10208:5;10204:16;10182:63;:::i;:::-;10299:2;10278:15;-1:-1:-1;;10274:29:17;10265:39;;;;10306:4;10261:50;;10109:208;-1:-1:-1;;10109:208:17:o;10322:1339::-;10498:3;10536:6;10530:13;10562:4;10575:51;10619:6;10614:3;10609:2;10601:6;10597:15;10575:51;:::i;:::-;10713:13;;10648:16;;;;10684:3;;10773:1;10795:18;;;;10848;;;;10875:2;;10953:4;10943:8;10939:19;10927:31;;10875:2;11016;11006:8;11003:16;10983:18;10980:40;10977:2;;;-1:-1:-1;;;11043:33:17;;11099:4;11096:1;11089:15;11129:4;11050:3;11117:17;10977:2;11160:18;11187:110;;;;11311:1;11306:330;;;;11153:483;;11187:110;-1:-1:-1;;11222:24:17;;11208:39;;11267:20;;;;-1:-1:-1;11187:110:17;;11306:330;26764:4;26783:17;;;26833:4;26817:21;;11401:3;11417:169;11431:8;11428:1;11425:15;11417:169;;;11513:14;;11498:13;;;11491:37;11556:16;;;;11448:10;;11417:169;;;11421:3;;11617:8;11610:5;11606:20;11599:27;;11153:483;-1:-1:-1;11652:3:17;;10506:1155;-1:-1:-1;;;;;;;;;;10506:1155:17:o;12084:826::-;-1:-1:-1;;;;;12481:15:17;;;12463:34;;12533:15;;12528:2;12513:18;;12506:43;12443:3;12580:2;12565:18;;12558:31;;;12406:4;;12612:57;;12649:19;;12641:6;12612:57;:::i;:::-;12717:9;12709:6;12705:22;12700:2;12689:9;12685:18;12678:50;12751:44;12788:6;12780;12751:44;:::i;:::-;12737:58;;12844:9;12836:6;12832:22;12826:3;12815:9;12811:19;12804:51;12872:32;12897:6;12889;12872:32;:::i;:::-;12864:40;12415:495;-1:-1:-1;;;;;;;;12415:495:17:o;12915:560::-;-1:-1:-1;;;;;13212:15:17;;;13194:34;;13264:15;;13259:2;13244:18;;13237:43;13311:2;13296:18;;13289:34;;;13354:2;13339:18;;13332:34;;;13174:3;13397;13382:19;;13375:32;;;13137:4;;13424:45;;13449:19;;13441:6;13424:45;:::i;:::-;13416:53;13146:329;-1:-1:-1;;;;;;;13146:329:17:o;13480:261::-;13659:2;13648:9;13641:21;13622:4;13679:56;13731:2;13720:9;13716:18;13708:6;13679:56;:::i;13746:465::-;14003:2;13992:9;13985:21;13966:4;14029:56;14081:2;14070:9;14066:18;14058:6;14029:56;:::i;:::-;14133:9;14125:6;14121:22;14116:2;14105:9;14101:18;14094:50;14161:44;14198:6;14190;14161:44;:::i;:::-;14153:52;13975:236;-1:-1:-1;;;;;13975:236:17:o;14408:219::-;14557:2;14546:9;14539:21;14520:4;14577:44;14617:2;14606:9;14602:18;14594:6;14577:44;:::i;15053:404::-;15255:2;15237:21;;;15294:2;15274:18;;;15267:30;15333:34;15328:2;15313:18;;15306:62;-1:-1:-1;;;15399:2:17;15384:18;;15377:38;15447:3;15432:19;;15227:230::o;16630:400::-;16832:2;16814:21;;;16871:2;16851:18;;;16844:30;16910:34;16905:2;16890:18;;16883:62;-1:-1:-1;;;16976:2:17;16961:18;;16954:34;17020:3;17005:19;;16804:226::o;17448:405::-;17650:2;17632:21;;;17689:2;17669:18;;;17662:30;17728:34;17723:2;17708:18;;17701:62;-1:-1:-1;;;17794:2:17;17779:18;;17772:39;17843:3;17828:19;;17622:231::o;17858:399::-;18060:2;18042:21;;;18099:2;18079:18;;;18072:30;18138:34;18133:2;18118:18;;18111:62;-1:-1:-1;;;18204:2:17;18189:18;;18182:33;18247:3;18232:19;;18032:225::o;18622:400::-;18824:2;18806:21;;;18863:2;18843:18;;;18836:30;18902:34;18897:2;18882:18;;18875:62;-1:-1:-1;;;18968:2:17;18953:18;;18946:34;19012:3;18997:19;;18796:226::o;19372:401::-;19574:2;19556:21;;;19613:2;19593:18;;;19586:30;19652:34;19647:2;19632:18;;19625:62;-1:-1:-1;;;19718:2:17;19703:18;;19696:35;19763:3;19748:19;;19546:227::o;20197:399::-;20399:2;20381:21;;;20438:2;20418:18;;;20411:30;20477:34;20472:2;20457:18;;20450:62;-1:-1:-1;;;20543:2:17;20528:18;;20521:33;20586:3;20571:19;;20371:225::o;20601:406::-;20803:2;20785:21;;;20842:2;20822:18;;;20815:30;20881:34;20876:2;20861:18;;20854:62;-1:-1:-1;;;20947:2:17;20932:18;;20925:40;20997:3;20982:19;;20775:232::o;21012:356::-;21214:2;21196:21;;;21233:18;;;21226:30;21292:34;21287:2;21272:18;;21265:62;21359:2;21344:18;;21186:182::o;23106:401::-;23308:2;23290:21;;;23347:2;23327:18;;;23320:30;23386:34;23381:2;23366:18;;23359:62;-1:-1:-1;;;23452:2:17;23437:18;;23430:35;23497:3;23482:19;;23280:227::o;24332:404::-;24534:2;24516:21;;;24573:2;24553:18;;;24546:30;24612:34;24607:2;24592:18;;24585:62;-1:-1:-1;;;24678:2:17;24663:18;;24656:38;24726:3;24711:19;;24506:230::o;25936:588::-;26219:6;26208:9;26201:25;26262:6;26257:2;26246:9;26242:18;26235:34;26305:6;26300:2;26289:9;26285:18;26278:34;26348:6;26343:2;26332:9;26328:18;26321:34;26392:3;26386;26375:9;26371:19;26364:32;26182:4;26413:45;26453:3;26442:9;26438:19;26430:6;26413:45;:::i;:::-;26405:53;;26509:6;26502:14;26495:22;26489:3;26478:9;26474:19;26467:51;26191:333;;;;;;;;;:::o;26529:183::-;26589:4;26622:18;26614:6;26611:30;26608:2;;;26644:18;;:::i;:::-;-1:-1:-1;26689:1:17;26685:14;26701:4;26681:25;;26598:114::o;26849:128::-;26889:3;26920:1;26916:6;26913:1;26910:13;26907:2;;;26926:18;;:::i;:::-;-1:-1:-1;26962:9:17;;26897:80::o;26982:168::-;27022:7;27088:1;27084;27080:6;27076:14;27073:1;27070:21;27065:1;27058:9;27051:17;27047:45;27044:2;;;27095:18;;:::i;:::-;-1:-1:-1;27135:9:17;;27034:116::o;27155:125::-;27195:4;27223:1;27220;27217:8;27214:2;;;27228:18;;:::i;:::-;-1:-1:-1;27265:9:17;;27204:76::o;27285:258::-;27357:1;27367:113;27381:6;27378:1;27375:13;27367:113;;;27457:11;;;27451:18;27438:11;;;27431:39;27403:2;27396:10;27367:113;;;27498:6;27495:1;27492:13;27489:2;;;-1:-1:-1;;27533:1:17;27515:16;;27508:27;27338:205::o;27548:380::-;27627:1;27623:12;;;;27670;;;27691:2;;27745:4;27737:6;27733:17;27723:27;;27691:2;27798;27790:6;27787:14;27767:18;27764:38;27761:2;;;27844:10;27839:3;27835:20;27832:1;27825:31;27879:4;27876:1;27869:15;27907:4;27904:1;27897:15;27761:2;;27603:325;;;:::o;27933:249::-;28043:2;28024:13;;-1:-1:-1;;28020:27:17;28008:40;;28078:18;28063:34;;28099:22;;;28060:62;28057:2;;;28125:18;;:::i;:::-;28161:2;28154:22;-1:-1:-1;;27980:202:17:o;28187:135::-;28226:3;-1:-1:-1;;28247:17:17;;28244:2;;;28267:18;;:::i;:::-;-1:-1:-1;28314:1:17;28303:13;;28234:88::o;28327:127::-;28388:10;28383:3;28379:20;28376:1;28369:31;28419:4;28416:1;28409:15;28443:4;28440:1;28433:15;28459:127;28520:10;28515:3;28511:20;28508:1;28501:31;28551:4;28548:1;28541:15;28575:4;28572:1;28565:15;28591:185;28626:3;28668:1;28650:16;28647:23;28644:2;;;28718:1;28713:3;28708;28693:27;28749:10;28744:3;28740:20;28644:2;28634:142;:::o;28781:671::-;28820:3;28862:4;28844:16;28841:26;28838:2;;;28828:624;:::o;28838:2::-;28904;28898:9;-1:-1:-1;;28969:16:17;28965:25;;28962:1;28898:9;28941:50;29020:4;29014:11;29044:16;29079:18;29150:2;29143:4;29135:6;29131:17;29128:25;29123:2;29115:6;29112:14;29109:45;29106:2;;;29157:5;;;;;28828:624;:::o;29106:2::-;29194:6;29188:4;29184:17;29173:28;;29230:3;29224:10;29257:2;29249:6;29246:14;29243:2;;;29263:5;;;;;;28828:624;:::o;29243:2::-;29347;29328:16;29322:4;29318:27;29314:36;29307:4;29298:6;29293:3;29289:16;29285:27;29282:69;29279:2;;;29354:5;;;;;;28828:624;:::o;29279:2::-;29370:57;29421:4;29412:6;29404;29400:19;29396:30;29390:4;29370:57;:::i;:::-;-1:-1:-1;29443:3:17;;28828:624;-1:-1:-1;;;;;28828:624:17:o;29457:131::-;-1:-1:-1;;;;;;29531:32:17;;29521:43;;29511:2;;29578:1;29575;29568:12

Swarm Source

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