ETH Price: $3,338.04 (+0.10%)

NFT_FM ()
 

Overview

TokenID

6

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

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:
NFT_FM

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

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

import "./ReentrancyGuard.sol";
import "./Context.sol";
import "./Ownable.sol";
import "./SafeMath.sol";
import "./Address.sol";
import "./IERC1155.sol";
import "./ERC1155.sol";
import "./FlatPriceSale.sol";

pragma solidity 0.8.4;

contract NFT_FM is ERC1155, Ownable, ReentrancyGuard {
    constructor(address _authAddress)
        ERC1155("https://nftfm.io/api/nft/{id}")
    {
        authAddress = _authAddress;
        onlyMintersCanMint = false;
    }

    address public authAddress;
    uint256 public nftID;
    bool public onlyMintersCanMint;
    mapping(address => bool) public isMinter;
    mapping(uint256 => address) public owners;
    mapping(address => uint256[]) public artists;
    mapping(address => bool) public isSaleContract;

    event MintAndStake(
        uint256 indexed nftID,
        uint32 quantity,
        uint256 price,
        uint256 startTime,
        address saleAddress,
        bytes data,
        string databaseID
    );

    function setMinter(address minter, bool status)
        public
        nonReentrant
        onlyOwner
    {
        isMinter[minter] = status;
    }

    function setSaleContract(address saleContract, bool status)
        public
        nonReentrant
        onlyOwner
    {
        isSaleContract[saleContract] = status;
    }

    function setAuthAddress(address _address) public nonReentrant onlyOwner {
        authAddress = _address;
    }

    function mintAndStake(
        uint32 quantity,
        uint256 price,
        uint256 startTime,
        address saleAddress,
        bytes calldata data,
        string calldata databaseID,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public nonReentrant {
        require(price >= 0, "Price less than 0");
        require(quantity > 0, "Price greater than 1");
        if (onlyMintersCanMint)
            require(isMinter[_msgSender()] == true, "Caller is not a minter");
        require(isSaleContract[saleAddress], "Unrecognized sale contract.");
        address signer = ecrecover(
            keccak256(
                abi.encode(
                    "NFTFM_mintAndStake",
                    _msgSender(),
                    quantity,
                    price,
                    startTime,
                    saleAddress,
                    data
                )
            ),
            v, r, s
        );
        require(signer == authAddress, "Invalid signature");
        nftID++;
        owners[nftID] = _msgSender();
        artists[_msgSender()].push(nftID);
        _mint(saleAddress, nftID, quantity, "initial mint");
        INFTSale(saleAddress).stake(
            nftID,
            payable(_msgSender()),
            quantity,
            price,
            startTime,
            data
        );
        emit MintAndStake(
            nftID,
            quantity,
            price,
            startTime,
            saleAddress,
            data,
            databaseID
        );
    }

    function mint(
        address to,
        uint256 id,
        uint256 quantity
    ) public nonReentrant {
        if (onlyMintersCanMint)
            require(isMinter[_msgSender()] == true, "Caller is not a minter");
        require(owners[id] == _msgSender(), "Caller does not own id");
        _mint(to, id, quantity, "the more the merrier!");
        // TODO should additional minting also be sent to a sales contract?
    }

    function burn(uint256 id, uint256 quantity) public nonReentrant {
        _burn(_msgSender(), id, quantity);
    }

    function burnBatch(uint256[] memory ids, uint256[] memory quantitys)
        public
        nonReentrant
    {
        _burnBatch(_msgSender(), ids, quantitys);
    }

    function getArtistsNFTs(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        return artists[_owner];
    }

    function getFullBalance(address user)
        public
        view
        returns (uint256[] memory, uint256[] memory)
    {
        uint256[] memory ids = new uint256[](nftID);
        uint256[] memory balances = new uint256[](nftID);
        for (uint256 id = 1; id <= nftID; id++) {
            ids[id - 1] = id;
            balances[id - 1] = balanceOf(user, id);
        }
        return (ids, balances);
    }
}

File 1 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;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 3 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");
        _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");
            _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 (uint 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");
        _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 (uint 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");
            _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 4 of 17: ERC1155Holder.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC1155Receiver.sol";

/**
 * @dev _Available since v3.1._
 */
contract ERC1155Holder is ERC1155Receiver {
    function onERC1155Received(address, address, uint256, uint256, bytes memory) public virtual override returns (bytes4) {
        return this.onERC1155Received.selector;
    }

    function onERC1155BatchReceived(address, address, uint256[] memory, uint256[] memory, bytes memory) public virtual override returns (bytes4) {
        return this.onERC1155BatchReceived.selector;
    }
}

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

pragma solidity ^0.8.0;

import "./IERC1155Receiver.sol";
import "./ERC165.sol";

/**
 * @dev _Available since v3.1._
 */
abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IERC1155Receiver).interfaceId
            || super.supportsInterface(interfaceId);
    }
}

File 6 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 7 of 17: FlatPriceSale.sol
// SPDX-License-Identifier: MIT

import "./Context.sol";
import "./SafeMath.sol";
import "./Ownable.sol";
import "./IERC20.sol";
import "./IERC1155.sol";
import "./ReentrancyGuard.sol";
import "./ERC1155Holder.sol";
import "./INFTSale.sol";

pragma solidity 0.8.4;

contract FlatPriceSale is Context, Ownable, ReentrancyGuard, ERC1155Holder, INFTSale {
    using SafeMath for uint256;

    constructor(address nftToken, address payable _authAddress) {
        NFT_TOKEN = IERC1155(nftToken);
        nftAddress = nftToken;
        authAddress = _authAddress;
    }

    event Buy(
        uint256 indexed saleId,
        uint256 nftID,
        uint256 quantity,
        address indexed account
    );

    address payable public authAddress;
    address public nftAddress;
    IERC1155 private NFT_TOKEN;

    struct NFTSetSale {
        uint32 saleId;
        uint256 timestamp;
        address buyer;
    }

    mapping(uint32 => NFTSetSale) public sales;
    uint32 public totalSales;

    struct NFTSet {
        address payable artist;
        uint256 startTime;
        uint32 quantity;
        uint32 sold;
        uint32 feePercent;
        uint256 price;
        bool isPaused;
    }

    mapping(uint256 => NFTSet) public sets;

    function stake(
        uint256 nftID,
        address payable artist,
        uint32 quantity,
        uint256 price,
        uint256 startTime,
        bytes calldata data
    ) override public nonReentrant {
        require(
            _msgSender() == nftAddress,
            "Can only stake via NFT_FM contract."
        );
        require(
            sets[nftID].artist == address(0),
            "Sale already exists for that NFT."
        );
        uint32 feePercent;
        (feePercent) = abi.decode(data, (uint32));
        sets[nftID] = NFTSet(artist, startTime, quantity, 0, feePercent, price, false);
    }

    function buyNFT(uint256 nftID, uint32 quantity) public payable nonReentrant {
        NFTSet memory set = sets[nftID];
        require(set.artist != address(0), "Sale does not exist.");
        require(quantity > 0, "Must select an quantity of tokens");
        require(block.timestamp > set.startTime, "Sale has not started yet.");
        require(!set.isPaused, "Sale is paused.");
        require(set.sold + quantity >= quantity, "Addition overflow");
        require(set.sold + quantity <= set.quantity, "Insufficient stock.");

        totalSales++;
        sales[totalSales] = NFTSetSale(
            totalSales,
            block.timestamp,
            _msgSender()
        );

        uint256 cost = set.price.mul(quantity);
        uint256 fee = cost.mul(set.feePercent).div(100);
        uint256 artistCut = cost.mul(100 - set.feePercent).div(100);
        require(artistCut + fee == msg.value, "Exact change required.");
        sets[nftID].sold = set.sold + quantity;
        sets[nftID].artist.transfer(artistCut);
        authAddress.transfer(fee);
        NFT_TOKEN.safeTransferFrom(
            address(this),
            _msgSender(),
            nftID,
            quantity,
            ""
        );
        emit Buy(totalSales, nftID, quantity, _msgSender());
    }

    function setAuthAddress(address payable _address) public onlyOwner {
        authAddress = _address;
    }

    function setSetPrice(uint256 nftID, uint256 price) public {
        require(sets[nftID].artist == _msgSender(), "You are not the artist.");
        sets[nftID].price = price;
    }

    function pauseSale(uint256 nftID) public {
        require(sets[nftID].artist == _msgSender(), "You are not the artist.");
        sets[nftID].isPaused = true;
    }

    function unpauseSale(uint256 nftID) public {
        require(sets[nftID].artist == _msgSender(), "You are not the artist.");
        sets[nftID].isPaused = false;
    }
}

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * _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 11 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 12 of 17: IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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

pragma solidity 0.8.4;

interface INFTSale {
	function stake(uint256 nftID, address payable artist, uint32 amount, uint256 price, uint256 startTime, bytes calldata data) external;
}

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor () {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

File 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. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * 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":"address","name":"_authAddress","type":"address"}],"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":"uint256","name":"nftID","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"quantity","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"address","name":"saleAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"string","name":"databaseID","type":"string"}],"name":"MintAndStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"artists","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"authAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"quantitys","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getArtistsNFTs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getFullBalance","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":[{"internalType":"address","name":"","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isSaleContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"quantity","type":"uint32"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"address","name":"saleAddress","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"string","name":"databaseID","type":"string"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"mintAndStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nftID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyMintersCanMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"owners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"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":"address","name":"_address","type":"address"}],"name":"setAuthAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"saleContract","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setSaleContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604051620051e6380380620051e6833981810160405281019062000037919062000286565b6040518060400160405280601d81526020017f68747470733a2f2f6e6674666d2e696f2f6170692f6e66742f7b69647d0000008152506200007e816200019b60201b60201c565b50600062000091620001b760201b60201c565b905080600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600160048190555080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600760006101000a81548160ff0219169083151502179055505062000365565b8060029080519060200190620001b3929190620001bf565b5050565b600033905090565b828054620001cd90620002e6565b90600052602060002090601f016020900481019282620001f157600085556200023d565b82601f106200020c57805160ff19168380011785556200023d565b828001600101855582156200023d579182015b828111156200023c5782518255916020019190600101906200021f565b5b5090506200024c919062000250565b5090565b5b808211156200026b57600081600090555060010162000251565b5090565b60008151905062000280816200034b565b92915050565b6000602082840312156200029957600080fd5b6000620002a9848285016200026f565b91505092915050565b6000620002bf82620002c6565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006002820490506001821680620002ff57607f821691505b602082108114156200031657620003156200031c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6200035681620002b2565b81146200036257600080fd5b50565b614e7180620003756000396000f3fe608060405234801561001057600080fd5b50600436106101a85760003560e01c80638da5cb5b116100f9578063c399475211610097578063e985e9c511610071578063e985e9c5146104f0578063f242432a14610520578063f2fde38b1461053c578063fed72e7b14610558576101a8565b8063c399475214610485578063cf456ae7146104a3578063d1eac5cc146104bf576101a8565b8063aa271e1a116100d3578063aa271e1a146103ed578063b390c0ab1461041d578063b95d3ee614610439578063babdab5714610469576101a8565b80638da5cb5b14610395578063a22cb465146103b3578063a64719d7146103cf576101a8565b80632433fbb1116101665780634f6f6e52116101405780634f6f6e521461030f578063578bbdc11461033f578063715018a61461036f57806383ca4b6f14610379576101a8565b80632433fbb1146102a55780632eb2c2d6146102c35780634e1273f4146102df576101a8565b8062fdd58e146101ad57806301ffc9a7146101dd578063025e7c271461020d5780630e89341c1461023d578063102656931461026d578063156e29f614610289575b600080fd5b6101c760048036038101906101c29190613521565b610574565b6040516101d4919061420f565b60405180910390f35b6101f760048036038101906101f29190613684565b61063d565b6040516102049190613e50565b60405180910390f35b610227600480360381019061022291906136d6565b61071f565b6040516102349190613d1a565b60405180910390f35b610257600480360381019061025291906136d6565b610752565b6040516102649190613eb0565b60405180910390f35b61028760048036038101906102829190613332565b6107e6565b005b6102a3600480360381019061029e919061355d565b6108fc565b005b6102ad610af0565b6040516102ba9190613e50565b60405180910390f35b6102dd60048036038101906102d89190613397565b610b03565b005b6102f960048036038101906102f491906135ac565b610ba4565b6040516103069190613df7565b60405180910390f35b61032960048036038101906103249190613332565b610d55565b6040516103369190613df7565b60405180910390f35b61035960048036038101906103549190613332565b610dec565b6040516103669190613e50565b60405180910390f35b610377610e0c565b005b610393600480360381019061038e9190613618565b610f49565b005b61039d610fb5565b6040516103aa9190613d1a565b60405180910390f35b6103cd60048036038101906103c891906134e5565b610fdf565b005b6103d7611160565b6040516103e49190613d1a565b60405180910390f35b61040760048036038101906104029190613332565b611186565b6040516104149190613e50565b60405180910390f35b610437600480360381019061043291906136ff565b6111a6565b005b610453600480360381019061044e9190613521565b611212565b604051610460919061420f565b60405180910390f35b610483600480360381019061047e919061373b565b611243565b005b61048d61177f565b60405161049a919061420f565b60405180910390f35b6104bd60048036038101906104b891906134e5565b611785565b005b6104d960048036038101906104d49190613332565b6118b2565b6040516104e7929190613e19565b60405180910390f35b61050a6004803603810190610505919061335b565b611a7d565b6040516105179190613e50565b60405180910390f35b61053a60048036038101906105359190613456565b611b11565b005b61055660048036038101906105519190613332565b611bb2565b005b610572600480360381019061056d91906134e5565b611d5e565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156105e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105dc90613f32565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061070857507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610718575061071782611e8b565b5b9050919050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060028054610761906145c8565b80601f016020809104026020016040519081016040528092919081815260200182805461078d906145c8565b80156107da5780601f106107af576101008083540402835291602001916107da565b820191906000526020600020905b8154815290600101906020018083116107bd57829003601f168201915b50505050509050919050565b6002600454141561082c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610823906141ef565b60405180910390fd5b600260048190555061083c611ef5565b73ffffffffffffffffffffffffffffffffffffffff1661085a610fb5565b73ffffffffffffffffffffffffffffffffffffffff16146108b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a79061410f565b60405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160048190555050565b60026004541415610942576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610939906141ef565b60405180910390fd5b6002600481905550600760009054906101000a900460ff16156109fa57600115156008600061096f611ef5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146109f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f09061408f565b60405180910390fd5b5b610a02611ef5565b73ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a999061412f565b60405180910390fd5b610ae38383836040518060400160405280601581526020017f746865206d6f726520746865206d657272696572210000000000000000000000815250611efd565b6001600481905550505050565b600760009054906101000a900460ff1681565b610b0b611ef5565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610b515750610b5085610b4b611ef5565b611a7d565b5b610b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b879061406f565b60405180910390fd5b610b9d8585858585612093565b5050505050565b60608151835114610bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be19061416f565b60405180910390fd5b6000835167ffffffffffffffff811115610c2d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610c5b5781602001602082028036833780820191505090505b50905060005b8451811015610d4a57610cf4858281518110610ca6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151858381518110610ce7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151610574565b828281518110610d2d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080610d439061462b565b9050610c61565b508091505092915050565b6060600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610de057602002820191906000526020600020905b815481526020019060010190808311610dcc575b50505050509050919050565b600b6020528060005260406000206000915054906101000a900460ff1681565b610e14611ef5565b73ffffffffffffffffffffffffffffffffffffffff16610e32610fb5565b73ffffffffffffffffffffffffffffffffffffffff1614610e88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7f9061410f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60026004541415610f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f86906141ef565b60405180910390fd5b6002600481905550610fa9610fa2611ef5565b83836123fc565b60016004819055505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8173ffffffffffffffffffffffffffffffffffffffff16610ffe611ef5565b73ffffffffffffffffffffffffffffffffffffffff161415611055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104c9061414f565b60405180910390fd5b8060016000611062611ef5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661110f611ef5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111549190613e50565b60405180910390a35050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60086020528060005260406000206000915054906101000a900460ff1681565b600260045414156111ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e3906141ef565b60405180910390fd5b60026004819055506112066111ff611ef5565b8383612702565b60016004819055505050565b600a602052816000526040600020818154811061122e57600080fd5b90600052602060002001600091509150505481565b60026004541415611289576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611280906141ef565b60405180910390fd5b600260048190555060008a10156112d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cc906140ef565b60405180910390fd5b60008b63ffffffff161161131e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131590613ef2565b60405180910390fd5b600760009054906101000a900460ff16156113ce576001151560086000611343611ef5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146113cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c49061408f565b60405180910390fd5b5b600b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661145a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611451906141af565b60405180910390fd5b60006001611466611ef5565b8d8d8d8d8d8d6040516020016114829796959493929190613f52565b60405160208183030381529060405280519060200120858585604051600081526020016040526040516114b89493929190613e6b565b6020604051602081039080840390855afa1580156114da573d6000803e3d6000fd5b505050602060405103519050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156d9061402f565b60405180910390fd5b600660008154809291906115899061462b565b9190505550611596611ef5565b60096000600654815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a60006115f5611ef5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060065490806001815401808255809150506001900390600052602060002001600090919091909150556116a1896006548e63ffffffff166040518060400160405280600c81526020017f696e697469616c206d696e740000000000000000000000000000000000000000815250611efd565b8873ffffffffffffffffffffffffffffffffffffffff16637aaa01bd6006546116c8611ef5565b8f8f8f8e8e6040518863ffffffff1660e01b81526004016116ef979695949392919061422a565b600060405180830381600087803b15801561170957600080fd5b505af115801561171d573d6000803e3d6000fd5b505050506006547f38180ac4be8280922a23442da79bbdef9429e1419905cba21cd2cda8b6efdbb88d8d8d8d8d8d8d8d6040516117619897969594939291906142bd565b60405180910390a25060016004819055505050505050505050505050565b60065481565b600260045414156117cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c2906141ef565b60405180910390fd5b60026004819055506117db611ef5565b73ffffffffffffffffffffffffffffffffffffffff166117f9610fb5565b73ffffffffffffffffffffffffffffffffffffffff161461184f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118469061410f565b60405180910390fd5b80600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016004819055505050565b606080600060065467ffffffffffffffff8111156118f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156119275781602001602082028036833780820191505090505b509050600060065467ffffffffffffffff81111561196e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561199c5781602001602082028036833780820191505090505b5090506000600190505b6006548111611a6f5780836001836119be91906144a5565b815181106119f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050611a0b8682610574565b82600183611a1991906144a5565b81518110611a50577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611a679061462b565b9150506119a6565b508181935093505050915091565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b19611ef5565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611b5f5750611b5e85611b59611ef5565b611a7d565b5b611b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b959061400f565b60405180910390fd5b611bab8585858585612928565b5050505050565b611bba611ef5565b73ffffffffffffffffffffffffffffffffffffffff16611bd8610fb5565b73ffffffffffffffffffffffffffffffffffffffff1614611c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c259061410f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9590613fcf565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60026004541415611da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9b906141ef565b60405180910390fd5b6002600481905550611db4611ef5565b73ffffffffffffffffffffffffffffffffffffffff16611dd2610fb5565b73ffffffffffffffffffffffffffffffffffffffff1614611e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1f9061410f565b60405180910390fd5b80600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016004819055505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f64906141cf565b60405180910390fd5b6000611f77611ef5565b9050611f9881600087611f8988612bb3565b611f9288612bb3565b87612c79565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ff7919061444f565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051612075929190614294565b60405180910390a461208c81600087878787612c81565b5050505050565b81518351146120d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ce9061418f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213e9061404f565b60405180910390fd5b6000612151611ef5565b9050612161818787878787612c79565b60005b84518110156123675760008582815181106121a8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060008583815181106121ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561228e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612285906140cf565b60405180910390fd5b818161229a91906144a5565b60008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461234c919061444f565b92505081905550505050806123609061462b565b9050612164565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516123de929190613e19565b60405180910390a46123f4818787878787612e68565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561246c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612463906140af565b60405180910390fd5b80518251146124b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a79061418f565b60405180910390fd5b60006124ba611ef5565b90506124da81856000868660405180602001604052806000815250612c79565b60005b835181101561267c576000848281518110612521577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000848381518110612566577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fe90613fef565b60405180910390fd5b818161261391906144a5565b60008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505080806126749061462b565b9150506124dd565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516126f4929190613e19565b60405180910390a450505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612772576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612769906140af565b60405180910390fd5b600061277c611ef5565b90506127ac8185600061278e87612bb3565b61279787612bb3565b60405180602001604052806000815250612c79565b600080600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015612843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283a90613fef565b60405180910390fd5b828161284f91906144a5565b60008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051612919929190614294565b60405180910390a45050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298f9061404f565b60405180910390fd5b60006129a2611ef5565b90506129c28187876129b388612bb3565b6129bc88612bb3565b87612c79565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015612a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a50906140cf565b60405180910390fd5b8381612a6591906144a5565b60008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b17919061444f565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051612b94929190614294565b60405180910390a4612baa828888888888612c81565b50505050505050565b60606000600167ffffffffffffffff811115612bf8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015612c265781602001602082028036833780820191505090505b5090508281600081518110612c64577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b505050505050565b612ca08473ffffffffffffffffffffffffffffffffffffffff1661304f565b15612e60578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612ce6959493929190613d9d565b602060405180830381600087803b158015612d0057600080fd5b505af1925050508015612d3157506040513d601f19601f82011682018060405250810190612d2e91906136ad565b60015b612dd757612d3d614701565b806308c379a01415612d9a5750612d52614d04565b80612d5d5750612d9c565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d919190613eb0565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dce90613ed2565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5590613f12565b60405180910390fd5b505b505050505050565b612e878473ffffffffffffffffffffffffffffffffffffffff1661304f565b15613047578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612ecd959493929190613d35565b602060405180830381600087803b158015612ee757600080fd5b505af1925050508015612f1857506040513d601f19601f82011682018060405250810190612f1591906136ad565b60015b612fbe57612f24614701565b806308c379a01415612f815750612f39614d04565b80612f445750612f83565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f789190613eb0565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb590613ed2565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303c90613f12565b60405180910390fd5b505b505050505050565b600080823b905060008111915050919050565b600061307561307084614355565b614330565b9050808382526020820190508285602086028201111561309457600080fd5b60005b858110156130c457816130aa8882613178565b845260208401935060208301925050600181019050613097565b5050509392505050565b60006130e16130dc84614381565b614330565b9050808382526020820190508285602086028201111561310057600080fd5b60005b85811015613130578161311688826132f3565b845260208401935060208301925050600181019050613103565b5050509392505050565b600061314d613148846143ad565b614330565b90508281526020810184848401111561316557600080fd5b613170848285614586565b509392505050565b60008135905061318781614d9a565b92915050565b600082601f83011261319e57600080fd5b81356131ae848260208601613062565b91505092915050565b600082601f8301126131c857600080fd5b81356131d88482602086016130ce565b91505092915050565b6000813590506131f081614db1565b92915050565b60008135905061320581614dc8565b92915050565b60008135905061321a81614ddf565b92915050565b60008151905061322f81614ddf565b92915050565b60008083601f84011261324757600080fd5b8235905067ffffffffffffffff81111561326057600080fd5b60208301915083600182028301111561327857600080fd5b9250929050565b600082601f83011261329057600080fd5b81356132a084826020860161313a565b91505092915050565b60008083601f8401126132bb57600080fd5b8235905067ffffffffffffffff8111156132d457600080fd5b6020830191508360018202830111156132ec57600080fd5b9250929050565b60008135905061330281614df6565b92915050565b60008135905061331781614e0d565b92915050565b60008135905061332c81614e24565b92915050565b60006020828403121561334457600080fd5b600061335284828501613178565b91505092915050565b6000806040838503121561336e57600080fd5b600061337c85828601613178565b925050602061338d85828601613178565b9150509250929050565b600080600080600060a086880312156133af57600080fd5b60006133bd88828901613178565b95505060206133ce88828901613178565b945050604086013567ffffffffffffffff8111156133eb57600080fd5b6133f7888289016131b7565b935050606086013567ffffffffffffffff81111561341457600080fd5b613420888289016131b7565b925050608086013567ffffffffffffffff81111561343d57600080fd5b6134498882890161327f565b9150509295509295909350565b600080600080600060a0868803121561346e57600080fd5b600061347c88828901613178565b955050602061348d88828901613178565b945050604061349e888289016132f3565b93505060606134af888289016132f3565b925050608086013567ffffffffffffffff8111156134cc57600080fd5b6134d88882890161327f565b9150509295509295909350565b600080604083850312156134f857600080fd5b600061350685828601613178565b9250506020613517858286016131e1565b9150509250929050565b6000806040838503121561353457600080fd5b600061354285828601613178565b9250506020613553858286016132f3565b9150509250929050565b60008060006060848603121561357257600080fd5b600061358086828701613178565b9350506020613591868287016132f3565b92505060406135a2868287016132f3565b9150509250925092565b600080604083850312156135bf57600080fd5b600083013567ffffffffffffffff8111156135d957600080fd5b6135e58582860161318d565b925050602083013567ffffffffffffffff81111561360257600080fd5b61360e858286016131b7565b9150509250929050565b6000806040838503121561362b57600080fd5b600083013567ffffffffffffffff81111561364557600080fd5b613651858286016131b7565b925050602083013567ffffffffffffffff81111561366e57600080fd5b61367a858286016131b7565b9150509250929050565b60006020828403121561369657600080fd5b60006136a48482850161320b565b91505092915050565b6000602082840312156136bf57600080fd5b60006136cd84828501613220565b91505092915050565b6000602082840312156136e857600080fd5b60006136f6848285016132f3565b91505092915050565b6000806040838503121561371257600080fd5b6000613720858286016132f3565b9250506020613731858286016132f3565b9150509250929050565b60008060008060008060008060008060006101208c8e03121561375d57600080fd5b600061376b8e828f01613308565b9b5050602061377c8e828f016132f3565b9a5050604061378d8e828f016132f3565b995050606061379e8e828f01613178565b98505060808c013567ffffffffffffffff8111156137bb57600080fd5b6137c78e828f01613235565b975097505060a08c013567ffffffffffffffff8111156137e657600080fd5b6137f28e828f016132a9565b955095505060c06138058e828f0161331d565b93505060e06138168e828f016131f6565b9250506101006138288e828f016131f6565b9150509295989b509295989b9093969950565b60006138478383613cde565b60208301905092915050565b61385c816144eb565b82525050565b61386b816144d9565b82525050565b600061387c826143ee565b613886818561441c565b9350613891836143de565b8060005b838110156138c25781516138a9888261383b565b97506138b48361440f565b925050600181019050613895565b5085935050505092915050565b6138d8816144fd565b82525050565b6138e781614509565b82525050565b60006138f9838561442d565b9350613906838584614586565b61390f83614723565b840190509392505050565b6000613925826143f9565b61392f818561442d565b935061393f818560208601614595565b61394881614723565b840191505092915050565b600061395f838561443e565b935061396c838584614586565b61397583614723565b840190509392505050565b600061398b82614404565b613995818561443e565b93506139a5818560208601614595565b6139ae81614723565b840191505092915050565b60006139c660348361443e565b91506139d182614741565b604082019050919050565b60006139e960148361443e565b91506139f482614790565b602082019050919050565b6000613a0c60288361443e565b9150613a17826147b9565b604082019050919050565b6000613a2f602b8361443e565b9150613a3a82614808565b604082019050919050565b6000613a5260128361443e565b9150613a5d82614857565b602082019050919050565b6000613a7560268361443e565b9150613a8082614880565b604082019050919050565b6000613a9860248361443e565b9150613aa3826148cf565b604082019050919050565b6000613abb60298361443e565b9150613ac68261491e565b604082019050919050565b6000613ade60118361443e565b9150613ae98261496d565b602082019050919050565b6000613b0160258361443e565b9150613b0c82614996565b604082019050919050565b6000613b2460328361443e565b9150613b2f826149e5565b604082019050919050565b6000613b4760168361443e565b9150613b5282614a34565b602082019050919050565b6000613b6a60238361443e565b9150613b7582614a5d565b604082019050919050565b6000613b8d602a8361443e565b9150613b9882614aac565b604082019050919050565b6000613bb060118361443e565b9150613bbb82614afb565b602082019050919050565b6000613bd360208361443e565b9150613bde82614b24565b602082019050919050565b6000613bf660168361443e565b9150613c0182614b4d565b602082019050919050565b6000613c1960298361443e565b9150613c2482614b76565b604082019050919050565b6000613c3c60298361443e565b9150613c4782614bc5565b604082019050919050565b6000613c5f60288361443e565b9150613c6a82614c14565b604082019050919050565b6000613c82601b8361443e565b9150613c8d82614c63565b602082019050919050565b6000613ca560218361443e565b9150613cb082614c8c565b604082019050919050565b6000613cc8601f8361443e565b9150613cd382614cdb565b602082019050919050565b613ce78161455f565b82525050565b613cf68161455f565b82525050565b613d0581614569565b82525050565b613d1481614579565b82525050565b6000602082019050613d2f6000830184613862565b92915050565b600060a082019050613d4a6000830188613862565b613d576020830187613862565b8181036040830152613d698186613871565b90508181036060830152613d7d8185613871565b90508181036080830152613d91818461391a565b90509695505050505050565b600060a082019050613db26000830188613862565b613dbf6020830187613862565b613dcc6040830186613ced565b613dd96060830185613ced565b8181036080830152613deb818461391a565b90509695505050505050565b60006020820190508181036000830152613e118184613871565b905092915050565b60006040820190508181036000830152613e338185613871565b90508181036020830152613e478184613871565b90509392505050565b6000602082019050613e6560008301846138cf565b92915050565b6000608082019050613e8060008301876138de565b613e8d6020830186613d0b565b613e9a60408301856138de565b613ea760608301846138de565b95945050505050565b60006020820190508181036000830152613eca8184613980565b905092915050565b60006020820190508181036000830152613eeb816139b9565b9050919050565b60006020820190508181036000830152613f0b816139dc565b9050919050565b60006020820190508181036000830152613f2b816139ff565b9050919050565b60006020820190508181036000830152613f4b81613a22565b9050919050565b600060e0820190508181036000830152613f6b81613a45565b9050613f7a602083018a613862565b613f876040830189613cfc565b613f946060830188613ced565b613fa16080830187613ced565b613fae60a0830186613862565b81810360c0830152613fc18184866138ed565b905098975050505050505050565b60006020820190508181036000830152613fe881613a68565b9050919050565b6000602082019050818103600083015261400881613a8b565b9050919050565b6000602082019050818103600083015261402881613aae565b9050919050565b6000602082019050818103600083015261404881613ad1565b9050919050565b6000602082019050818103600083015261406881613af4565b9050919050565b6000602082019050818103600083015261408881613b17565b9050919050565b600060208201905081810360008301526140a881613b3a565b9050919050565b600060208201905081810360008301526140c881613b5d565b9050919050565b600060208201905081810360008301526140e881613b80565b9050919050565b6000602082019050818103600083015261410881613ba3565b9050919050565b6000602082019050818103600083015261412881613bc6565b9050919050565b6000602082019050818103600083015261414881613be9565b9050919050565b6000602082019050818103600083015261416881613c0c565b9050919050565b6000602082019050818103600083015261418881613c2f565b9050919050565b600060208201905081810360008301526141a881613c52565b9050919050565b600060208201905081810360008301526141c881613c75565b9050919050565b600060208201905081810360008301526141e881613c98565b9050919050565b6000602082019050818103600083015261420881613cbb565b9050919050565b60006020820190506142246000830184613ced565b92915050565b600060c08201905061423f600083018a613ced565b61424c6020830189613853565b6142596040830188613cfc565b6142666060830187613ced565b6142736080830186613ced565b81810360a08301526142868184866138ed565b905098975050505050505050565b60006040820190506142a96000830185613ced565b6142b66020830184613ced565b9392505050565b600060c0820190506142d2600083018b613cfc565b6142df602083018a613ced565b6142ec6040830189613ced565b6142f96060830188613862565b818103608083015261430c8186886138ed565b905081810360a0830152614321818486613953565b90509998505050505050505050565b600061433a61434b565b905061434682826145fa565b919050565b6000604051905090565b600067ffffffffffffffff8211156143705761436f6146d2565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561439c5761439b6146d2565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156143c8576143c76146d2565b5b6143d182614723565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061445a8261455f565b91506144658361455f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561449a57614499614674565b5b828201905092915050565b60006144b08261455f565b91506144bb8361455f565b9250828210156144ce576144cd614674565b5b828203905092915050565b60006144e48261453f565b9050919050565b60006144f68261453f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156145b3578082015181840152602081019050614598565b838111156145c2576000848401525b50505050565b600060028204905060018216806145e057607f821691505b602082108114156145f4576145f36146a3565b5b50919050565b61460382614723565b810181811067ffffffffffffffff82111715614622576146216146d2565b5b80604052505050565b60006146368261455f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561466957614668614674565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d11156147205760046000803e61471d600051614734565b90505b90565b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f50726963652067726561746572207468616e2031000000000000000000000000600082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4e4654464d5f6d696e74416e645374616b650000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f43616c6c6572206973206e6f742061206d696e74657200000000000000000000600082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f5072696365206c657373207468616e2030000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f43616c6c657220646f6573206e6f74206f776e20696400000000000000000000600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f556e7265636f676e697a65642073616c6520636f6e74726163742e0000000000600082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600060443d1015614d1457614d97565b614d1c61434b565b60043d036004823e80513d602482011167ffffffffffffffff82111715614d44575050614d97565b808201805167ffffffffffffffff811115614d625750505050614d97565b80602083010160043d038501811115614d7f575050505050614d97565b614d8e826020018501866145fa565b82955050505050505b90565b614da3816144d9565b8114614dae57600080fd5b50565b614dba816144fd565b8114614dc557600080fd5b50565b614dd181614509565b8114614ddc57600080fd5b50565b614de881614513565b8114614df357600080fd5b50565b614dff8161455f565b8114614e0a57600080fd5b50565b614e1681614569565b8114614e2157600080fd5b50565b614e2d81614579565b8114614e3857600080fd5b5056fea2646970667358221220d77ea0abc5c2ca3f4dd740ac1319c801c66c79ad464de376fcb22cebcad67f3c64736f6c63430008040033000000000000000000000000c894929862b974a616d35953c8c3e479a38d339a

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101a85760003560e01c80638da5cb5b116100f9578063c399475211610097578063e985e9c511610071578063e985e9c5146104f0578063f242432a14610520578063f2fde38b1461053c578063fed72e7b14610558576101a8565b8063c399475214610485578063cf456ae7146104a3578063d1eac5cc146104bf576101a8565b8063aa271e1a116100d3578063aa271e1a146103ed578063b390c0ab1461041d578063b95d3ee614610439578063babdab5714610469576101a8565b80638da5cb5b14610395578063a22cb465146103b3578063a64719d7146103cf576101a8565b80632433fbb1116101665780634f6f6e52116101405780634f6f6e521461030f578063578bbdc11461033f578063715018a61461036f57806383ca4b6f14610379576101a8565b80632433fbb1146102a55780632eb2c2d6146102c35780634e1273f4146102df576101a8565b8062fdd58e146101ad57806301ffc9a7146101dd578063025e7c271461020d5780630e89341c1461023d578063102656931461026d578063156e29f614610289575b600080fd5b6101c760048036038101906101c29190613521565b610574565b6040516101d4919061420f565b60405180910390f35b6101f760048036038101906101f29190613684565b61063d565b6040516102049190613e50565b60405180910390f35b610227600480360381019061022291906136d6565b61071f565b6040516102349190613d1a565b60405180910390f35b610257600480360381019061025291906136d6565b610752565b6040516102649190613eb0565b60405180910390f35b61028760048036038101906102829190613332565b6107e6565b005b6102a3600480360381019061029e919061355d565b6108fc565b005b6102ad610af0565b6040516102ba9190613e50565b60405180910390f35b6102dd60048036038101906102d89190613397565b610b03565b005b6102f960048036038101906102f491906135ac565b610ba4565b6040516103069190613df7565b60405180910390f35b61032960048036038101906103249190613332565b610d55565b6040516103369190613df7565b60405180910390f35b61035960048036038101906103549190613332565b610dec565b6040516103669190613e50565b60405180910390f35b610377610e0c565b005b610393600480360381019061038e9190613618565b610f49565b005b61039d610fb5565b6040516103aa9190613d1a565b60405180910390f35b6103cd60048036038101906103c891906134e5565b610fdf565b005b6103d7611160565b6040516103e49190613d1a565b60405180910390f35b61040760048036038101906104029190613332565b611186565b6040516104149190613e50565b60405180910390f35b610437600480360381019061043291906136ff565b6111a6565b005b610453600480360381019061044e9190613521565b611212565b604051610460919061420f565b60405180910390f35b610483600480360381019061047e919061373b565b611243565b005b61048d61177f565b60405161049a919061420f565b60405180910390f35b6104bd60048036038101906104b891906134e5565b611785565b005b6104d960048036038101906104d49190613332565b6118b2565b6040516104e7929190613e19565b60405180910390f35b61050a6004803603810190610505919061335b565b611a7d565b6040516105179190613e50565b60405180910390f35b61053a60048036038101906105359190613456565b611b11565b005b61055660048036038101906105519190613332565b611bb2565b005b610572600480360381019061056d91906134e5565b611d5e565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156105e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105dc90613f32565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061070857507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610718575061071782611e8b565b5b9050919050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060028054610761906145c8565b80601f016020809104026020016040519081016040528092919081815260200182805461078d906145c8565b80156107da5780601f106107af576101008083540402835291602001916107da565b820191906000526020600020905b8154815290600101906020018083116107bd57829003601f168201915b50505050509050919050565b6002600454141561082c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610823906141ef565b60405180910390fd5b600260048190555061083c611ef5565b73ffffffffffffffffffffffffffffffffffffffff1661085a610fb5565b73ffffffffffffffffffffffffffffffffffffffff16146108b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a79061410f565b60405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160048190555050565b60026004541415610942576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610939906141ef565b60405180910390fd5b6002600481905550600760009054906101000a900460ff16156109fa57600115156008600061096f611ef5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146109f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f09061408f565b60405180910390fd5b5b610a02611ef5565b73ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a999061412f565b60405180910390fd5b610ae38383836040518060400160405280601581526020017f746865206d6f726520746865206d657272696572210000000000000000000000815250611efd565b6001600481905550505050565b600760009054906101000a900460ff1681565b610b0b611ef5565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610b515750610b5085610b4b611ef5565b611a7d565b5b610b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b879061406f565b60405180910390fd5b610b9d8585858585612093565b5050505050565b60608151835114610bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be19061416f565b60405180910390fd5b6000835167ffffffffffffffff811115610c2d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610c5b5781602001602082028036833780820191505090505b50905060005b8451811015610d4a57610cf4858281518110610ca6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151858381518110610ce7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151610574565b828281518110610d2d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080610d439061462b565b9050610c61565b508091505092915050565b6060600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610de057602002820191906000526020600020905b815481526020019060010190808311610dcc575b50505050509050919050565b600b6020528060005260406000206000915054906101000a900460ff1681565b610e14611ef5565b73ffffffffffffffffffffffffffffffffffffffff16610e32610fb5565b73ffffffffffffffffffffffffffffffffffffffff1614610e88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7f9061410f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60026004541415610f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f86906141ef565b60405180910390fd5b6002600481905550610fa9610fa2611ef5565b83836123fc565b60016004819055505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8173ffffffffffffffffffffffffffffffffffffffff16610ffe611ef5565b73ffffffffffffffffffffffffffffffffffffffff161415611055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104c9061414f565b60405180910390fd5b8060016000611062611ef5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661110f611ef5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111549190613e50565b60405180910390a35050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60086020528060005260406000206000915054906101000a900460ff1681565b600260045414156111ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e3906141ef565b60405180910390fd5b60026004819055506112066111ff611ef5565b8383612702565b60016004819055505050565b600a602052816000526040600020818154811061122e57600080fd5b90600052602060002001600091509150505481565b60026004541415611289576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611280906141ef565b60405180910390fd5b600260048190555060008a10156112d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cc906140ef565b60405180910390fd5b60008b63ffffffff161161131e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131590613ef2565b60405180910390fd5b600760009054906101000a900460ff16156113ce576001151560086000611343611ef5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146113cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c49061408f565b60405180910390fd5b5b600b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661145a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611451906141af565b60405180910390fd5b60006001611466611ef5565b8d8d8d8d8d8d6040516020016114829796959493929190613f52565b60405160208183030381529060405280519060200120858585604051600081526020016040526040516114b89493929190613e6b565b6020604051602081039080840390855afa1580156114da573d6000803e3d6000fd5b505050602060405103519050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156d9061402f565b60405180910390fd5b600660008154809291906115899061462b565b9190505550611596611ef5565b60096000600654815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a60006115f5611ef5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060065490806001815401808255809150506001900390600052602060002001600090919091909150556116a1896006548e63ffffffff166040518060400160405280600c81526020017f696e697469616c206d696e740000000000000000000000000000000000000000815250611efd565b8873ffffffffffffffffffffffffffffffffffffffff16637aaa01bd6006546116c8611ef5565b8f8f8f8e8e6040518863ffffffff1660e01b81526004016116ef979695949392919061422a565b600060405180830381600087803b15801561170957600080fd5b505af115801561171d573d6000803e3d6000fd5b505050506006547f38180ac4be8280922a23442da79bbdef9429e1419905cba21cd2cda8b6efdbb88d8d8d8d8d8d8d8d6040516117619897969594939291906142bd565b60405180910390a25060016004819055505050505050505050505050565b60065481565b600260045414156117cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c2906141ef565b60405180910390fd5b60026004819055506117db611ef5565b73ffffffffffffffffffffffffffffffffffffffff166117f9610fb5565b73ffffffffffffffffffffffffffffffffffffffff161461184f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118469061410f565b60405180910390fd5b80600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016004819055505050565b606080600060065467ffffffffffffffff8111156118f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156119275781602001602082028036833780820191505090505b509050600060065467ffffffffffffffff81111561196e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561199c5781602001602082028036833780820191505090505b5090506000600190505b6006548111611a6f5780836001836119be91906144a5565b815181106119f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050611a0b8682610574565b82600183611a1991906144a5565b81518110611a50577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611a679061462b565b9150506119a6565b508181935093505050915091565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b19611ef5565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611b5f5750611b5e85611b59611ef5565b611a7d565b5b611b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b959061400f565b60405180910390fd5b611bab8585858585612928565b5050505050565b611bba611ef5565b73ffffffffffffffffffffffffffffffffffffffff16611bd8610fb5565b73ffffffffffffffffffffffffffffffffffffffff1614611c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c259061410f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9590613fcf565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60026004541415611da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9b906141ef565b60405180910390fd5b6002600481905550611db4611ef5565b73ffffffffffffffffffffffffffffffffffffffff16611dd2610fb5565b73ffffffffffffffffffffffffffffffffffffffff1614611e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1f9061410f565b60405180910390fd5b80600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016004819055505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f64906141cf565b60405180910390fd5b6000611f77611ef5565b9050611f9881600087611f8988612bb3565b611f9288612bb3565b87612c79565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ff7919061444f565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051612075929190614294565b60405180910390a461208c81600087878787612c81565b5050505050565b81518351146120d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ce9061418f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213e9061404f565b60405180910390fd5b6000612151611ef5565b9050612161818787878787612c79565b60005b84518110156123675760008582815181106121a8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060008583815181106121ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561228e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612285906140cf565b60405180910390fd5b818161229a91906144a5565b60008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461234c919061444f565b92505081905550505050806123609061462b565b9050612164565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516123de929190613e19565b60405180910390a46123f4818787878787612e68565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561246c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612463906140af565b60405180910390fd5b80518251146124b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a79061418f565b60405180910390fd5b60006124ba611ef5565b90506124da81856000868660405180602001604052806000815250612c79565b60005b835181101561267c576000848281518110612521577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000848381518110612566577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fe90613fef565b60405180910390fd5b818161261391906144a5565b60008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505080806126749061462b565b9150506124dd565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516126f4929190613e19565b60405180910390a450505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612772576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612769906140af565b60405180910390fd5b600061277c611ef5565b90506127ac8185600061278e87612bb3565b61279787612bb3565b60405180602001604052806000815250612c79565b600080600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015612843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283a90613fef565b60405180910390fd5b828161284f91906144a5565b60008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051612919929190614294565b60405180910390a45050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298f9061404f565b60405180910390fd5b60006129a2611ef5565b90506129c28187876129b388612bb3565b6129bc88612bb3565b87612c79565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015612a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a50906140cf565b60405180910390fd5b8381612a6591906144a5565b60008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b17919061444f565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051612b94929190614294565b60405180910390a4612baa828888888888612c81565b50505050505050565b60606000600167ffffffffffffffff811115612bf8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015612c265781602001602082028036833780820191505090505b5090508281600081518110612c64577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b505050505050565b612ca08473ffffffffffffffffffffffffffffffffffffffff1661304f565b15612e60578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612ce6959493929190613d9d565b602060405180830381600087803b158015612d0057600080fd5b505af1925050508015612d3157506040513d601f19601f82011682018060405250810190612d2e91906136ad565b60015b612dd757612d3d614701565b806308c379a01415612d9a5750612d52614d04565b80612d5d5750612d9c565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d919190613eb0565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dce90613ed2565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5590613f12565b60405180910390fd5b505b505050505050565b612e878473ffffffffffffffffffffffffffffffffffffffff1661304f565b15613047578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612ecd959493929190613d35565b602060405180830381600087803b158015612ee757600080fd5b505af1925050508015612f1857506040513d601f19601f82011682018060405250810190612f1591906136ad565b60015b612fbe57612f24614701565b806308c379a01415612f815750612f39614d04565b80612f445750612f83565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f789190613eb0565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb590613ed2565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303c90613f12565b60405180910390fd5b505b505050505050565b600080823b905060008111915050919050565b600061307561307084614355565b614330565b9050808382526020820190508285602086028201111561309457600080fd5b60005b858110156130c457816130aa8882613178565b845260208401935060208301925050600181019050613097565b5050509392505050565b60006130e16130dc84614381565b614330565b9050808382526020820190508285602086028201111561310057600080fd5b60005b85811015613130578161311688826132f3565b845260208401935060208301925050600181019050613103565b5050509392505050565b600061314d613148846143ad565b614330565b90508281526020810184848401111561316557600080fd5b613170848285614586565b509392505050565b60008135905061318781614d9a565b92915050565b600082601f83011261319e57600080fd5b81356131ae848260208601613062565b91505092915050565b600082601f8301126131c857600080fd5b81356131d88482602086016130ce565b91505092915050565b6000813590506131f081614db1565b92915050565b60008135905061320581614dc8565b92915050565b60008135905061321a81614ddf565b92915050565b60008151905061322f81614ddf565b92915050565b60008083601f84011261324757600080fd5b8235905067ffffffffffffffff81111561326057600080fd5b60208301915083600182028301111561327857600080fd5b9250929050565b600082601f83011261329057600080fd5b81356132a084826020860161313a565b91505092915050565b60008083601f8401126132bb57600080fd5b8235905067ffffffffffffffff8111156132d457600080fd5b6020830191508360018202830111156132ec57600080fd5b9250929050565b60008135905061330281614df6565b92915050565b60008135905061331781614e0d565b92915050565b60008135905061332c81614e24565b92915050565b60006020828403121561334457600080fd5b600061335284828501613178565b91505092915050565b6000806040838503121561336e57600080fd5b600061337c85828601613178565b925050602061338d85828601613178565b9150509250929050565b600080600080600060a086880312156133af57600080fd5b60006133bd88828901613178565b95505060206133ce88828901613178565b945050604086013567ffffffffffffffff8111156133eb57600080fd5b6133f7888289016131b7565b935050606086013567ffffffffffffffff81111561341457600080fd5b613420888289016131b7565b925050608086013567ffffffffffffffff81111561343d57600080fd5b6134498882890161327f565b9150509295509295909350565b600080600080600060a0868803121561346e57600080fd5b600061347c88828901613178565b955050602061348d88828901613178565b945050604061349e888289016132f3565b93505060606134af888289016132f3565b925050608086013567ffffffffffffffff8111156134cc57600080fd5b6134d88882890161327f565b9150509295509295909350565b600080604083850312156134f857600080fd5b600061350685828601613178565b9250506020613517858286016131e1565b9150509250929050565b6000806040838503121561353457600080fd5b600061354285828601613178565b9250506020613553858286016132f3565b9150509250929050565b60008060006060848603121561357257600080fd5b600061358086828701613178565b9350506020613591868287016132f3565b92505060406135a2868287016132f3565b9150509250925092565b600080604083850312156135bf57600080fd5b600083013567ffffffffffffffff8111156135d957600080fd5b6135e58582860161318d565b925050602083013567ffffffffffffffff81111561360257600080fd5b61360e858286016131b7565b9150509250929050565b6000806040838503121561362b57600080fd5b600083013567ffffffffffffffff81111561364557600080fd5b613651858286016131b7565b925050602083013567ffffffffffffffff81111561366e57600080fd5b61367a858286016131b7565b9150509250929050565b60006020828403121561369657600080fd5b60006136a48482850161320b565b91505092915050565b6000602082840312156136bf57600080fd5b60006136cd84828501613220565b91505092915050565b6000602082840312156136e857600080fd5b60006136f6848285016132f3565b91505092915050565b6000806040838503121561371257600080fd5b6000613720858286016132f3565b9250506020613731858286016132f3565b9150509250929050565b60008060008060008060008060008060006101208c8e03121561375d57600080fd5b600061376b8e828f01613308565b9b5050602061377c8e828f016132f3565b9a5050604061378d8e828f016132f3565b995050606061379e8e828f01613178565b98505060808c013567ffffffffffffffff8111156137bb57600080fd5b6137c78e828f01613235565b975097505060a08c013567ffffffffffffffff8111156137e657600080fd5b6137f28e828f016132a9565b955095505060c06138058e828f0161331d565b93505060e06138168e828f016131f6565b9250506101006138288e828f016131f6565b9150509295989b509295989b9093969950565b60006138478383613cde565b60208301905092915050565b61385c816144eb565b82525050565b61386b816144d9565b82525050565b600061387c826143ee565b613886818561441c565b9350613891836143de565b8060005b838110156138c25781516138a9888261383b565b97506138b48361440f565b925050600181019050613895565b5085935050505092915050565b6138d8816144fd565b82525050565b6138e781614509565b82525050565b60006138f9838561442d565b9350613906838584614586565b61390f83614723565b840190509392505050565b6000613925826143f9565b61392f818561442d565b935061393f818560208601614595565b61394881614723565b840191505092915050565b600061395f838561443e565b935061396c838584614586565b61397583614723565b840190509392505050565b600061398b82614404565b613995818561443e565b93506139a5818560208601614595565b6139ae81614723565b840191505092915050565b60006139c660348361443e565b91506139d182614741565b604082019050919050565b60006139e960148361443e565b91506139f482614790565b602082019050919050565b6000613a0c60288361443e565b9150613a17826147b9565b604082019050919050565b6000613a2f602b8361443e565b9150613a3a82614808565b604082019050919050565b6000613a5260128361443e565b9150613a5d82614857565b602082019050919050565b6000613a7560268361443e565b9150613a8082614880565b604082019050919050565b6000613a9860248361443e565b9150613aa3826148cf565b604082019050919050565b6000613abb60298361443e565b9150613ac68261491e565b604082019050919050565b6000613ade60118361443e565b9150613ae98261496d565b602082019050919050565b6000613b0160258361443e565b9150613b0c82614996565b604082019050919050565b6000613b2460328361443e565b9150613b2f826149e5565b604082019050919050565b6000613b4760168361443e565b9150613b5282614a34565b602082019050919050565b6000613b6a60238361443e565b9150613b7582614a5d565b604082019050919050565b6000613b8d602a8361443e565b9150613b9882614aac565b604082019050919050565b6000613bb060118361443e565b9150613bbb82614afb565b602082019050919050565b6000613bd360208361443e565b9150613bde82614b24565b602082019050919050565b6000613bf660168361443e565b9150613c0182614b4d565b602082019050919050565b6000613c1960298361443e565b9150613c2482614b76565b604082019050919050565b6000613c3c60298361443e565b9150613c4782614bc5565b604082019050919050565b6000613c5f60288361443e565b9150613c6a82614c14565b604082019050919050565b6000613c82601b8361443e565b9150613c8d82614c63565b602082019050919050565b6000613ca560218361443e565b9150613cb082614c8c565b604082019050919050565b6000613cc8601f8361443e565b9150613cd382614cdb565b602082019050919050565b613ce78161455f565b82525050565b613cf68161455f565b82525050565b613d0581614569565b82525050565b613d1481614579565b82525050565b6000602082019050613d2f6000830184613862565b92915050565b600060a082019050613d4a6000830188613862565b613d576020830187613862565b8181036040830152613d698186613871565b90508181036060830152613d7d8185613871565b90508181036080830152613d91818461391a565b90509695505050505050565b600060a082019050613db26000830188613862565b613dbf6020830187613862565b613dcc6040830186613ced565b613dd96060830185613ced565b8181036080830152613deb818461391a565b90509695505050505050565b60006020820190508181036000830152613e118184613871565b905092915050565b60006040820190508181036000830152613e338185613871565b90508181036020830152613e478184613871565b90509392505050565b6000602082019050613e6560008301846138cf565b92915050565b6000608082019050613e8060008301876138de565b613e8d6020830186613d0b565b613e9a60408301856138de565b613ea760608301846138de565b95945050505050565b60006020820190508181036000830152613eca8184613980565b905092915050565b60006020820190508181036000830152613eeb816139b9565b9050919050565b60006020820190508181036000830152613f0b816139dc565b9050919050565b60006020820190508181036000830152613f2b816139ff565b9050919050565b60006020820190508181036000830152613f4b81613a22565b9050919050565b600060e0820190508181036000830152613f6b81613a45565b9050613f7a602083018a613862565b613f876040830189613cfc565b613f946060830188613ced565b613fa16080830187613ced565b613fae60a0830186613862565b81810360c0830152613fc18184866138ed565b905098975050505050505050565b60006020820190508181036000830152613fe881613a68565b9050919050565b6000602082019050818103600083015261400881613a8b565b9050919050565b6000602082019050818103600083015261402881613aae565b9050919050565b6000602082019050818103600083015261404881613ad1565b9050919050565b6000602082019050818103600083015261406881613af4565b9050919050565b6000602082019050818103600083015261408881613b17565b9050919050565b600060208201905081810360008301526140a881613b3a565b9050919050565b600060208201905081810360008301526140c881613b5d565b9050919050565b600060208201905081810360008301526140e881613b80565b9050919050565b6000602082019050818103600083015261410881613ba3565b9050919050565b6000602082019050818103600083015261412881613bc6565b9050919050565b6000602082019050818103600083015261414881613be9565b9050919050565b6000602082019050818103600083015261416881613c0c565b9050919050565b6000602082019050818103600083015261418881613c2f565b9050919050565b600060208201905081810360008301526141a881613c52565b9050919050565b600060208201905081810360008301526141c881613c75565b9050919050565b600060208201905081810360008301526141e881613c98565b9050919050565b6000602082019050818103600083015261420881613cbb565b9050919050565b60006020820190506142246000830184613ced565b92915050565b600060c08201905061423f600083018a613ced565b61424c6020830189613853565b6142596040830188613cfc565b6142666060830187613ced565b6142736080830186613ced565b81810360a08301526142868184866138ed565b905098975050505050505050565b60006040820190506142a96000830185613ced565b6142b66020830184613ced565b9392505050565b600060c0820190506142d2600083018b613cfc565b6142df602083018a613ced565b6142ec6040830189613ced565b6142f96060830188613862565b818103608083015261430c8186886138ed565b905081810360a0830152614321818486613953565b90509998505050505050505050565b600061433a61434b565b905061434682826145fa565b919050565b6000604051905090565b600067ffffffffffffffff8211156143705761436f6146d2565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561439c5761439b6146d2565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156143c8576143c76146d2565b5b6143d182614723565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061445a8261455f565b91506144658361455f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561449a57614499614674565b5b828201905092915050565b60006144b08261455f565b91506144bb8361455f565b9250828210156144ce576144cd614674565b5b828203905092915050565b60006144e48261453f565b9050919050565b60006144f68261453f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156145b3578082015181840152602081019050614598565b838111156145c2576000848401525b50505050565b600060028204905060018216806145e057607f821691505b602082108114156145f4576145f36146a3565b5b50919050565b61460382614723565b810181811067ffffffffffffffff82111715614622576146216146d2565b5b80604052505050565b60006146368261455f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561466957614668614674565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d11156147205760046000803e61471d600051614734565b90505b90565b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f50726963652067726561746572207468616e2031000000000000000000000000600082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4e4654464d5f6d696e74416e645374616b650000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f43616c6c6572206973206e6f742061206d696e74657200000000000000000000600082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f5072696365206c657373207468616e2030000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f43616c6c657220646f6573206e6f74206f776e20696400000000000000000000600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f556e7265636f676e697a65642073616c6520636f6e74726163742e0000000000600082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600060443d1015614d1457614d97565b614d1c61434b565b60043d036004823e80513d602482011167ffffffffffffffff82111715614d44575050614d97565b808201805167ffffffffffffffff811115614d625750505050614d97565b80602083010160043d038501811115614d7f575050505050614d97565b614d8e826020018501866145fa565b82955050505050505b90565b614da3816144d9565b8114614dae57600080fd5b50565b614dba816144fd565b8114614dc557600080fd5b50565b614dd181614509565b8114614ddc57600080fd5b50565b614de881614513565b8114614df357600080fd5b50565b614dff8161455f565b8114614e0a57600080fd5b50565b614e1681614569565b8114614e2157600080fd5b50565b614e2d81614579565b8114614e3857600080fd5b5056fea2646970667358221220d77ea0abc5c2ca3f4dd740ac1319c801c66c79ad464de376fcb22cebcad67f3c64736f6c63430008040033

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

000000000000000000000000c894929862b974a616d35953c8c3e479a38d339a

-----Decoded View---------------
Arg [0] : _authAddress (address): 0xc894929862b974a616D35953c8C3E479A38D339a

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


Deployed Bytecode Sourcemap

266:4020:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2048:228:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1111:293;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;637:41:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1803:103:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1332:111:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2990:429;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;555:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4126:458:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2433:530;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3717:146:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;734:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1693:145:14;;;:::i;:::-;;3545:166:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1061:85:14;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3031:306:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;497:26:13;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;591:40;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3425:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;684:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1449:1535;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;529:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1000:148;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3869:415;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;3404:166:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3637:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1987:240:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1154:172:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2048:228:2;2134:7;2180:1;2161:21;;:7;:21;;;;2153:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;2247:9;:13;2257:2;2247:13;;;;;;;;;;;:22;2261:7;2247:22;;;;;;;;;;;;;;;;2240:29;;2048:228;;;;:::o;1111:293::-;1213:4;1251:26;1236:41;;;:11;:41;;;;:109;;;;1308:37;1293:52;;;:11;:52;;;;1236:109;:161;;;;1361:36;1385:11;1361:23;:36::i;:::-;1236:161;1229:168;;1111:293;;;:::o;637:41:13:-;;;;;;;;;;;;;;;;;;;;;;:::o;1803:103:2:-;1863:13;1895:4;1888:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1803:103;;;:::o;1332:111:13:-;1680:1:15;2260:7;;:19;;2252:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1680:1;2390:7;:18;;;;1284:12:14::1;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1428:8:13::2;1414:11;;:22;;;;;;;;;;;;;;;;;;1637:1:15::0;2563:7;:22;;;;1332:111:13;:::o;2990:429::-;1680:1:15;2260:7;;:19;;2252:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1680:1;2390:7;:18;;;;3110::13::1;;;;;;;;;;;3106:101;;;3176:4;3150:30;;:8;:22;3159:12;:10;:12::i;:::-;3150:22;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;3142:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;3106:101;3239:12;:10;:12::i;:::-;3225:26;;:6;:10;3232:2;3225:10;;;;;;;;;;;;;;;;;;;;;:26;;;3217:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;3288:48;3294:2;3298;3302:8;3288:48;;;;;;;;;;;;;;;;::::0;:5:::1;:48::i;:::-;1637:1:15::0;2563:7;:22;;;;2990:429:13;;;:::o;555:30::-;;;;;;;;;;;;;:::o;4126:458:2:-;4387:12;:10;:12::i;:::-;4379:20;;:4;:20;;;:60;;;;4403:36;4420:4;4426:12;:10;:12::i;:::-;4403:16;:36::i;:::-;4379:60;4358:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;4525:52;4548:4;4554:2;4558:3;4563:7;4572:4;4525:22;:52::i;:::-;4126:458;;;;;:::o;2433:530::-;2606:16;2665:3;:10;2646:8;:15;:29;2638:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;2732:30;2779:8;:15;2765:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2732:63;;2811:9;2806:120;2830:8;:15;2826:1;:19;2806:120;;;2885:30;2895:8;2904:1;2895:11;;;;;;;;;;;;;;;;;;;;;;2908:3;2912:1;2908:6;;;;;;;;;;;;;;;;;;;;;;2885:9;:30::i;:::-;2866:13;2880:1;2866:16;;;;;;;;;;;;;;;;;;;;;:49;;;;;2847:3;;;;:::i;:::-;;;2806:120;;;;2943:13;2936:20;;;2433:530;;;;:::o;3717:146:13:-;3802:16;3841:7;:15;3849:6;3841:15;;;;;;;;;;;;;;;3834:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3717:146;;;:::o;734:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;1693:145:14:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1799:1:::1;1762:40;;1783:6;;;;;;;;;;;1762:40;;;;;;;;;;;;1829:1;1812:6;;:19;;;;;;;;;;;;;;;;;;1693:145::o:0;3545:166:13:-;1680:1:15;2260:7;;:19;;2252:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1680:1;2390:7;:18;;;;3664:40:13::1;3675:12;:10;:12::i;:::-;3689:3;3694:9;3664:10;:40::i;:::-;1637:1:15::0;2563:7;:22;;;;3545:166:13;;:::o;1061:85:14:-;1107:7;1133:6;;;;;;;;;;;1126:13;;1061:85;:::o;3031:306:2:-;3149:8;3133:24;;:12;:10;:12::i;:::-;:24;;;;3125:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;3259:8;3214:18;:32;3233:12;:10;:12::i;:::-;3214:32;;;;;;;;;;;;;;;:42;3247:8;3214:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;3311:8;3282:48;;3297:12;:10;:12::i;:::-;3282:48;;;3321:8;3282:48;;;;;;:::i;:::-;;;;;;;;3031:306;;:::o;497:26:13:-;;;;;;;;;;;;;:::o;591:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;3425:114::-;1680:1:15;2260:7;;:19;;2252:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1680:1;2390:7;:18;;;;3499:33:13::1;3505:12;:10;:12::i;:::-;3519:2;3523:8;3499:5;:33::i;:::-;1637:1:15::0;2563:7;:22;;;;3425:114:13;;:::o;684:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1449:1535::-;1680:1:15;2260:7;;:19;;2252:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1680:1;2390:7;:18;;;;1748:1:13::1;1739:5;:10;;1731:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;1800:1;1789:8;:12;;;1781:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;1840:18;;;;;;;;;;;1836:101;;;1906:4;1880:30;;:8;:22;1889:12;:10;:12::i;:::-;1880:22;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;1872:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;1836:101;1955:14;:27;1970:11;1955:27;;;;;;;;;;;;;;;;;;;;;;;;;1947:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;2024:14;2041:346;2165:12;:10;:12::i;:::-;2199:8;2229:5;2256:9;2287:11;2320:4;;2091:251;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2064:292;;;;;;2370:1;2373;2376;2041:346;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;2024:363;;2415:11;;;;;;;;;;;2405:21;;:6;:21;;;2397:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;2458:5;;:7;;;;;;;;;:::i;:::-;;;;;;2491:12;:10;:12::i;:::-;2475:6;:13;2482:5;;2475:13;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;2513:7;:21;2521:12;:10;:12::i;:::-;2513:21;;;;;;;;;;;;;;;2540:5;;2513:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2556:51;2562:11;2575:5;;2582:8;2556:51;;;;;;;;;;;;;;;;;;::::0;:5:::1;:51::i;:::-;2626:11;2617:27;;;2658:5;;2685:12;:10;:12::i;:::-;2712:8;2734:5;2753:9;2776:4;;2617:173;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;2831:5;;2805:172;2850:8;2872:5;2891:9;2914:11;2939:4;;2957:10;;2805:172;;;;;;;;;;;;;:::i;:::-;;;;;;;;2419:1:15;1637::::0;2563:7;:22;;;;1449:1535:13;;;;;;;;;;;:::o;529:20::-;;;;:::o;1000:148::-;1680:1:15;2260:7;;:19;;2252:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1680:1;2390:7;:18;;;;1284:12:14::1;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1135:6:13::2;1116:8;:16;1125:6;1116:16;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;1637:1:15::0;2563:7;:22;;;;1000:148:13;;:::o;3869:415::-;3952:16;3970;4002:20;4039:5;;4025:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4002:43;;4055:25;4097:5;;4083:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4055:48;;4118:10;4131:1;4118:14;;4113:133;4140:5;;4134:2;:11;4113:133;;4181:2;4167:3;4176:1;4171:2;:6;;;;:::i;:::-;4167:11;;;;;;;;;;;;;;;;;;;;;:16;;;;;4216:19;4226:4;4232:2;4216:9;:19::i;:::-;4197:8;4211:1;4206:2;:6;;;;:::i;:::-;4197:16;;;;;;;;;;;;;;;;;;;;;:38;;;;;4147:4;;;;;:::i;:::-;;;;4113:133;;;;4263:3;4268:8;4255:22;;;;;;3869:415;;;:::o;3404:166:2:-;3503:4;3526:18;:27;3545:7;3526:27;;;;;;;;;;;;;;;:37;3554:8;3526:37;;;;;;;;;;;;;;;;;;;;;;;;;3519:44;;3404:166;;;;:::o;3637:417::-;3873:12;:10;:12::i;:::-;3865:20;;:4;:20;;;:60;;;;3889:36;3906:4;3912:12;:10;:12::i;:::-;3889:16;:36::i;:::-;3865:60;3844:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;4002:45;4020:4;4026:2;4030;4034:6;4042:4;4002:17;:45::i;:::-;3637:417;;;;;:::o;1987:240:14:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2095:1:::1;2075:22;;:8;:22;;;;2067:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2184:8;2155:38;;2176:6;;;;;;;;;;;2155:38;;;;;;;;;;;;2212:8;2203:6;;:17;;;;;;;;;;;;;;;;;;1987:240:::0;:::o;1154:172:13:-;1680:1:15;2260:7;;:19;;2252:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1680:1;2390:7;:18;;;;1284:12:14::1;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1313:6:13::2;1282:14;:28;1297:12;1282:28;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;1637:1:15::0;2563:7;:22;;;;1154:172:13;;:::o;763:155:5:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;586:96:1:-;639:7;665:10;658:17;;586:96;:::o;8483:545:2:-;8616:1;8597:21;;:7;:21;;;;8589:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;8667:16;8686:12;:10;:12::i;:::-;8667:31;;8709:107;8730:8;8748:1;8752:7;8761:21;8779:2;8761:17;:21::i;:::-;8784:25;8802:6;8784:17;:25::i;:::-;8811:4;8709:20;:107::i;:::-;8853:6;8827:9;:13;8837:2;8827:13;;;;;;;;;;;:22;8841:7;8827:22;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;8911:7;8874:57;;8907:1;8874:57;;8889:8;8874:57;;;8920:2;8924:6;8874:57;;;;;;;:::i;:::-;;;;;;;;8942:79;8973:8;8991:1;8995:7;9004:2;9008:6;9016:4;8942:30;:79::i;:::-;8483:545;;;;;:::o;6163:1023::-;6403:7;:14;6389:3;:10;:28;6381:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;6494:1;6480:16;;:2;:16;;;;6472:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;6549:16;6568:12;:10;:12::i;:::-;6549:31;;6591:60;6612:8;6622:4;6628:2;6632:3;6637:7;6646:4;6591:20;:60::i;:::-;6667:9;6662:369;6686:3;:10;6682:1;:14;6662:369;;;6717:10;6730:3;6734:1;6730:6;;;;;;;;;;;;;;;;;;;;;;6717:19;;6750:14;6767:7;6775:1;6767:10;;;;;;;;;;;;;;;;;;;;;;6750:27;;6792:19;6814:9;:13;6824:2;6814:13;;;;;;;;;;;:19;6828:4;6814:19;;;;;;;;;;;;;;;;6792:41;;6870:6;6855:11;:21;;6847:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;6973:6;6959:11;:20;;;;:::i;:::-;6937:9;:13;6947:2;6937:13;;;;;;;;;;;:19;6951:4;6937:19;;;;;;;;;;;;;;;:42;;;;7014:6;6993:9;:13;7003:2;6993:13;;;;;;;;;;;:17;7007:2;6993:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;6662:369;;;6698:3;;;;:::i;:::-;;;6662:369;;;;7076:2;7046:47;;7070:4;7046:47;;7060:8;7046:47;;;7080:3;7085:7;7046:47;;;;;;;:::i;:::-;;;;;;;;7104:75;7140:8;7150:4;7156:2;7160:3;7165:7;7174:4;7104:35;:75::i;:::-;6163:1023;;;;;;:::o;11083:819::-;11222:1;11203:21;;:7;:21;;;;11195:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;11296:7;:14;11282:3;:10;:28;11274:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;11366:16;11385:12;:10;:12::i;:::-;11366:31;;11408:69;11429:8;11439:7;11456:1;11460:3;11465:7;11408:69;;;;;;;;;;;;:20;:69::i;:::-;11493:6;11488:334;11509:3;:10;11505:1;:14;11488:334;;;11540:10;11553:3;11557:1;11553:6;;;;;;;;;;;;;;;;;;;;;;11540:19;;11573:14;11590:7;11598:1;11590:10;;;;;;;;;;;;;;;;;;;;;;11573:27;;11615:22;11640:9;:13;11650:2;11640:13;;;;;;;;;;;:22;11654:7;11640:22;;;;;;;;;;;;;;;;11615:47;;11702:6;11684:14;:24;;11676:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;11805:6;11788:14;:23;;;;:::i;:::-;11763:9;:13;11773:2;11763:13;;;;;;;;;;;:22;11777:7;11763:22;;;;;;;;;;;;;;;:48;;;;11488:334;;;11521:3;;;;;:::i;:::-;;;;11488:334;;;;11878:1;11837:58;;11861:7;11837:58;;11851:8;11837:58;;;11882:3;11887:7;11837:58;;;;;;;:::i;:::-;;;;;;;;11083:819;;;;:::o;10296:593::-;10410:1;10391:21;;:7;:21;;;;10383:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;10463:16;10482:12;:10;:12::i;:::-;10463:31;;10505:105;10526:8;10536:7;10553:1;10557:21;10575:2;10557:17;:21::i;:::-;10580:25;10598:6;10580:17;:25::i;:::-;10505:105;;;;;;;;;;;;:20;:105::i;:::-;10621:22;10646:9;:13;10656:2;10646:13;;;;;;;;;;;:22;10660:7;10646:22;;;;;;;;;;;;;;;;10621:47;;10704:6;10686:14;:24;;10678:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10803:6;10786:14;:23;;;;:::i;:::-;10761:9;:13;10771:2;10761:13;;;;;;;;;;;:22;10775:7;10761:22;;;;;;;;;;;;;;;:48;;;;10867:1;10825:57;;10850:7;10825:57;;10840:8;10825:57;;;10871:2;10875:6;10825:57;;;;;;;:::i;:::-;;;;;;;;10296:593;;;;;:::o;5034:783::-;5249:1;5235:16;;:2;:16;;;;5227:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;5304:16;5323:12;:10;:12::i;:::-;5304:31;;5346:96;5367:8;5377:4;5383:2;5387:21;5405:2;5387:17;:21::i;:::-;5410:25;5428:6;5410:17;:25::i;:::-;5437:4;5346:20;:96::i;:::-;5453:19;5475:9;:13;5485:2;5475:13;;;;;;;;;;;:19;5489:4;5475:19;;;;;;;;;;;;;;;;5453:41;;5527:6;5512:11;:21;;5504:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;5626:6;5612:11;:20;;;;:::i;:::-;5590:9;:13;5600:2;5590:13;;;;;;;;;;;:19;5604:4;5590:19;;;;;;;;;;;;;;;:42;;;;5663:6;5642:9;:13;5652:2;5642:13;;;;;;;;;;;:17;5656:2;5642:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;5716:2;5685:46;;5710:4;5685:46;;5700:8;5685:46;;;5720:2;5724:6;5685:46;;;;;;;:::i;:::-;;;;;;;;5742:68;5773:8;5783:4;5789:2;5793;5797:6;5805:4;5742:30;:68::i;:::-;5034:783;;;;;;;:::o;14608:193::-;14674:16;14702:22;14741:1;14727:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14702:41;;14764:7;14753:5;14759:1;14753:8;;;;;;;;;;;;;;;;;;;;;:18;;;;;14789:5;14782:12;;;14608:193;;;:::o;12836:235::-;;;;;;;:::o;13077:741::-;13296:15;:2;:13;;;:15::i;:::-;13292:520;;;13348:2;13331:38;;;13370:8;13380:4;13386:2;13390:6;13398:4;13331:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;13327:475;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;13678:6;13671:14;;;;;;;;;;;:::i;:::-;;;;;;;;13327:475;;;13725:62;;;;;;;;;;:::i;:::-;;;;;;;;13327:475;13464:47;;;13452:59;;;:8;:59;;;;13448:156;;13535:50;;;;;;;;;;:::i;:::-;;;;;;;;13448:156;13404:214;13292:520;13077:741;;;;;;:::o;13824:778::-;14068:15;:2;:13;;;:15::i;:::-;14064:532;;;14120:2;14103:43;;;14147:8;14157:4;14163:3;14168:7;14177:4;14103:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14099:487;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;14462:6;14455:14;;;;;;;;;;;:::i;:::-;;;;;;;;14099:487;;;14509:62;;;;;;;;;;:::i;:::-;;;;;;;;14099:487;14243:52;;;14231:64;;;:8;:64;;;;14227:161;;14319:50;;;;;;;;;;:::i;:::-;;;;;;;;14227:161;14183:219;14064:532;13824:778;;;;;;:::o;718:413:0:-;778:4;981:12;1090:7;1078:20;1070:28;;1123:1;1116:4;:8;1109:15;;;718:413;;;:::o;24:655:17:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;702:655::-;798:5;823:81;839:64;896:6;839:64;:::i;:::-;823:81;:::i;:::-;814:90;;924:5;953:6;946:5;939:21;987:4;980:5;976:16;969:23;;1013:6;1063:3;1055:4;1047:6;1043:17;1038:3;1034:27;1031:36;1028:2;;;1092:1;1089;1082:12;1028:2;1128:1;1113:238;1138:6;1135:1;1132:13;1113:238;;;1206:3;1235:37;1268:3;1256:10;1235:37;:::i;:::-;1230:3;1223:50;1302:4;1297:3;1293:14;1286:21;;1336:4;1331:3;1327:14;1320:21;;1173:178;1160:1;1157;1153:9;1148:14;;1113:238;;;1117:14;804:553;;;;;;;:::o;1363:343::-;1440:5;1465:65;1481:48;1522:6;1481:48;:::i;:::-;1465:65;:::i;:::-;1456:74;;1553:6;1546:5;1539:21;1591:4;1584:5;1580:16;1629:3;1620:6;1615:3;1611:16;1608:25;1605:2;;;1646:1;1643;1636:12;1605:2;1659:41;1693:6;1688:3;1683;1659:41;:::i;:::-;1446:260;;;;;;:::o;1712:139::-;1758:5;1796:6;1783:20;1774:29;;1812:33;1839:5;1812:33;:::i;:::-;1764:87;;;;:::o;1874:303::-;1945:5;1994:3;1987:4;1979:6;1975:17;1971:27;1961:2;;2012:1;2009;2002:12;1961:2;2052:6;2039:20;2077:94;2167:3;2159:6;2152:4;2144:6;2140:17;2077:94;:::i;:::-;2068:103;;1951:226;;;;;:::o;2200:303::-;2271:5;2320:3;2313:4;2305:6;2301:17;2297:27;2287:2;;2338:1;2335;2328:12;2287:2;2378:6;2365:20;2403:94;2493:3;2485:6;2478:4;2470:6;2466:17;2403:94;:::i;:::-;2394:103;;2277:226;;;;;:::o;2509:133::-;2552:5;2590:6;2577:20;2568:29;;2606:30;2630:5;2606:30;:::i;:::-;2558:84;;;;:::o;2648:139::-;2694:5;2732:6;2719:20;2710:29;;2748:33;2775:5;2748:33;:::i;:::-;2700:87;;;;:::o;2793:137::-;2838:5;2876:6;2863:20;2854:29;;2892:32;2918:5;2892:32;:::i;:::-;2844:86;;;;:::o;2936:141::-;2992:5;3023:6;3017:13;3008:22;;3039:32;3065:5;3039:32;:::i;:::-;2998:79;;;;:::o;3096:351::-;3153:8;3163:6;3213:3;3206:4;3198:6;3194:17;3190:27;3180:2;;3231:1;3228;3221:12;3180:2;3267:6;3254:20;3244:30;;3297:18;3289:6;3286:30;3283:2;;;3329:1;3326;3319:12;3283:2;3366:4;3358:6;3354:17;3342:29;;3420:3;3412:4;3404:6;3400:17;3390:8;3386:32;3383:41;3380:2;;;3437:1;3434;3427:12;3380:2;3170:277;;;;;:::o;3466:271::-;3521:5;3570:3;3563:4;3555:6;3551:17;3547:27;3537:2;;3588:1;3585;3578:12;3537:2;3628:6;3615:20;3653:78;3727:3;3719:6;3712:4;3704:6;3700:17;3653:78;:::i;:::-;3644:87;;3527:210;;;;;:::o;3757:352::-;3815:8;3825:6;3875:3;3868:4;3860:6;3856:17;3852:27;3842:2;;3893:1;3890;3883:12;3842:2;3929:6;3916:20;3906:30;;3959:18;3951:6;3948:30;3945:2;;;3991:1;3988;3981:12;3945:2;4028:4;4020:6;4016:17;4004:29;;4082:3;4074:4;4066:6;4062:17;4052:8;4048:32;4045:41;4042:2;;;4099:1;4096;4089:12;4042:2;3832:277;;;;;:::o;4115:139::-;4161:5;4199:6;4186:20;4177:29;;4215:33;4242:5;4215:33;:::i;:::-;4167:87;;;;:::o;4260:137::-;4305:5;4343:6;4330:20;4321:29;;4359:32;4385:5;4359:32;:::i;:::-;4311:86;;;;:::o;4403:135::-;4447:5;4485:6;4472:20;4463:29;;4501:31;4526:5;4501:31;:::i;:::-;4453:85;;;;:::o;4544:262::-;4603:6;4652:2;4640:9;4631:7;4627:23;4623:32;4620:2;;;4668:1;4665;4658:12;4620:2;4711:1;4736:53;4781:7;4772:6;4761:9;4757:22;4736:53;:::i;:::-;4726:63;;4682:117;4610:196;;;;:::o;4812:407::-;4880:6;4888;4937:2;4925:9;4916:7;4912:23;4908:32;4905:2;;;4953:1;4950;4943:12;4905:2;4996:1;5021:53;5066:7;5057:6;5046:9;5042:22;5021:53;:::i;:::-;5011:63;;4967:117;5123:2;5149:53;5194:7;5185:6;5174:9;5170:22;5149:53;:::i;:::-;5139:63;;5094:118;4895:324;;;;;:::o;5225:1241::-;5379:6;5387;5395;5403;5411;5460:3;5448:9;5439:7;5435:23;5431:33;5428:2;;;5477:1;5474;5467:12;5428:2;5520:1;5545:53;5590:7;5581:6;5570:9;5566:22;5545:53;:::i;:::-;5535:63;;5491:117;5647:2;5673:53;5718:7;5709:6;5698:9;5694:22;5673:53;:::i;:::-;5663:63;;5618:118;5803:2;5792:9;5788:18;5775:32;5834:18;5826:6;5823:30;5820:2;;;5866:1;5863;5856:12;5820:2;5894:78;5964:7;5955:6;5944:9;5940:22;5894:78;:::i;:::-;5884:88;;5746:236;6049:2;6038:9;6034:18;6021:32;6080:18;6072:6;6069:30;6066:2;;;6112:1;6109;6102:12;6066:2;6140:78;6210:7;6201:6;6190:9;6186:22;6140:78;:::i;:::-;6130:88;;5992:236;6295:3;6284:9;6280:19;6267:33;6327:18;6319:6;6316:30;6313:2;;;6359:1;6356;6349:12;6313:2;6387:62;6441:7;6432:6;6421:9;6417:22;6387:62;:::i;:::-;6377:72;;6238:221;5418:1048;;;;;;;;:::o;6472:955::-;6576:6;6584;6592;6600;6608;6657:3;6645:9;6636:7;6632:23;6628:33;6625:2;;;6674:1;6671;6664:12;6625:2;6717:1;6742:53;6787:7;6778:6;6767:9;6763:22;6742:53;:::i;:::-;6732:63;;6688:117;6844:2;6870:53;6915:7;6906:6;6895:9;6891:22;6870:53;:::i;:::-;6860:63;;6815:118;6972:2;6998:53;7043:7;7034:6;7023:9;7019:22;6998:53;:::i;:::-;6988:63;;6943:118;7100:2;7126:53;7171:7;7162:6;7151:9;7147:22;7126:53;:::i;:::-;7116:63;;7071:118;7256:3;7245:9;7241:19;7228:33;7288:18;7280:6;7277:30;7274:2;;;7320:1;7317;7310:12;7274:2;7348:62;7402:7;7393:6;7382:9;7378:22;7348:62;:::i;:::-;7338:72;;7199:221;6615:812;;;;;;;;:::o;7433:401::-;7498:6;7506;7555:2;7543:9;7534:7;7530:23;7526:32;7523:2;;;7571:1;7568;7561:12;7523:2;7614:1;7639:53;7684:7;7675:6;7664:9;7660:22;7639:53;:::i;:::-;7629:63;;7585:117;7741:2;7767:50;7809:7;7800:6;7789:9;7785:22;7767:50;:::i;:::-;7757:60;;7712:115;7513:321;;;;;:::o;7840:407::-;7908:6;7916;7965:2;7953:9;7944:7;7940:23;7936:32;7933:2;;;7981:1;7978;7971:12;7933:2;8024:1;8049:53;8094:7;8085:6;8074:9;8070:22;8049:53;:::i;:::-;8039:63;;7995:117;8151:2;8177:53;8222:7;8213:6;8202:9;8198:22;8177:53;:::i;:::-;8167:63;;8122:118;7923:324;;;;;:::o;8253:552::-;8330:6;8338;8346;8395:2;8383:9;8374:7;8370:23;8366:32;8363:2;;;8411:1;8408;8401:12;8363:2;8454:1;8479:53;8524:7;8515:6;8504:9;8500:22;8479:53;:::i;:::-;8469:63;;8425:117;8581:2;8607:53;8652:7;8643:6;8632:9;8628:22;8607:53;:::i;:::-;8597:63;;8552:118;8709:2;8735:53;8780:7;8771:6;8760:9;8756:22;8735:53;:::i;:::-;8725:63;;8680:118;8353:452;;;;;:::o;8811:693::-;8929:6;8937;8986:2;8974:9;8965:7;8961:23;8957:32;8954:2;;;9002:1;8999;8992:12;8954:2;9073:1;9062:9;9058:17;9045:31;9103:18;9095:6;9092:30;9089:2;;;9135:1;9132;9125:12;9089:2;9163:78;9233:7;9224:6;9213:9;9209:22;9163:78;:::i;:::-;9153:88;;9016:235;9318:2;9307:9;9303:18;9290:32;9349:18;9341:6;9338:30;9335:2;;;9381:1;9378;9371:12;9335:2;9409:78;9479:7;9470:6;9459:9;9455:22;9409:78;:::i;:::-;9399:88;;9261:236;8944:560;;;;;:::o;9510:693::-;9628:6;9636;9685:2;9673:9;9664:7;9660:23;9656:32;9653:2;;;9701:1;9698;9691:12;9653:2;9772:1;9761:9;9757:17;9744:31;9802:18;9794:6;9791:30;9788:2;;;9834:1;9831;9824:12;9788:2;9862:78;9932:7;9923:6;9912:9;9908:22;9862:78;:::i;:::-;9852:88;;9715:235;10017:2;10006:9;10002:18;9989:32;10048:18;10040:6;10037:30;10034:2;;;10080:1;10077;10070:12;10034:2;10108:78;10178:7;10169:6;10158:9;10154:22;10108:78;:::i;:::-;10098:88;;9960:236;9643:560;;;;;:::o;10209:260::-;10267:6;10316:2;10304:9;10295:7;10291:23;10287:32;10284:2;;;10332:1;10329;10322:12;10284:2;10375:1;10400:52;10444:7;10435:6;10424:9;10420:22;10400:52;:::i;:::-;10390:62;;10346:116;10274:195;;;;:::o;10475:282::-;10544:6;10593:2;10581:9;10572:7;10568:23;10564:32;10561:2;;;10609:1;10606;10599:12;10561:2;10652:1;10677:63;10732:7;10723:6;10712:9;10708:22;10677:63;:::i;:::-;10667:73;;10623:127;10551:206;;;;:::o;10763:262::-;10822:6;10871:2;10859:9;10850:7;10846:23;10842:32;10839:2;;;10887:1;10884;10877:12;10839:2;10930:1;10955:53;11000:7;10991:6;10980:9;10976:22;10955:53;:::i;:::-;10945:63;;10901:117;10829:196;;;;:::o;11031:407::-;11099:6;11107;11156:2;11144:9;11135:7;11131:23;11127:32;11124:2;;;11172:1;11169;11162:12;11124:2;11215:1;11240:53;11285:7;11276:6;11265:9;11261:22;11240:53;:::i;:::-;11230:63;;11186:117;11342:2;11368:53;11413:7;11404:6;11393:9;11389:22;11368:53;:::i;:::-;11358:63;;11313:118;11114:324;;;;;:::o;11444:1688::-;11595:6;11603;11611;11619;11627;11635;11643;11651;11659;11667;11675:7;11725:3;11713:9;11704:7;11700:23;11696:33;11693:2;;;11742:1;11739;11732:12;11693:2;11785:1;11810:52;11854:7;11845:6;11834:9;11830:22;11810:52;:::i;:::-;11800:62;;11756:116;11911:2;11937:53;11982:7;11973:6;11962:9;11958:22;11937:53;:::i;:::-;11927:63;;11882:118;12039:2;12065:53;12110:7;12101:6;12090:9;12086:22;12065:53;:::i;:::-;12055:63;;12010:118;12167:2;12193:53;12238:7;12229:6;12218:9;12214:22;12193:53;:::i;:::-;12183:63;;12138:118;12323:3;12312:9;12308:19;12295:33;12355:18;12347:6;12344:30;12341:2;;;12387:1;12384;12377:12;12341:2;12423:64;12479:7;12470:6;12459:9;12455:22;12423:64;:::i;:::-;12405:82;;;;12266:231;12564:3;12553:9;12549:19;12536:33;12596:18;12588:6;12585:30;12582:2;;;12628:1;12625;12618:12;12582:2;12664:65;12721:7;12712:6;12701:9;12697:22;12664:65;:::i;:::-;12646:83;;;;12507:232;12778:3;12805:51;12848:7;12839:6;12828:9;12824:22;12805:51;:::i;:::-;12795:61;;12749:117;12905:3;12932:53;12977:7;12968:6;12957:9;12953:22;12932:53;:::i;:::-;12922:63;;12876:119;13034:3;13062:53;13107:7;13098:6;13087:9;13083:22;13062:53;:::i;:::-;13051:64;;13005:120;11683:1449;;;;;;;;;;;;;;:::o;13138:179::-;13207:10;13228:46;13270:3;13262:6;13228:46;:::i;:::-;13306:4;13301:3;13297:14;13283:28;;13218:99;;;;:::o;13323:142::-;13426:32;13452:5;13426:32;:::i;:::-;13421:3;13414:45;13404:61;;:::o;13471:118::-;13558:24;13576:5;13558:24;:::i;:::-;13553:3;13546:37;13536:53;;:::o;13625:732::-;13744:3;13773:54;13821:5;13773:54;:::i;:::-;13843:86;13922:6;13917:3;13843:86;:::i;:::-;13836:93;;13953:56;14003:5;13953:56;:::i;:::-;14032:7;14063:1;14048:284;14073:6;14070:1;14067:13;14048:284;;;14149:6;14143:13;14176:63;14235:3;14220:13;14176:63;:::i;:::-;14169:70;;14262:60;14315:6;14262:60;:::i;:::-;14252:70;;14108:224;14095:1;14092;14088:9;14083:14;;14048:284;;;14052:14;14348:3;14341:10;;13749:608;;;;;;;:::o;14363:109::-;14444:21;14459:5;14444:21;:::i;:::-;14439:3;14432:34;14422:50;;:::o;14478:118::-;14565:24;14583:5;14565:24;:::i;:::-;14560:3;14553:37;14543:53;;:::o;14624:301::-;14720:3;14741:70;14804:6;14799:3;14741:70;:::i;:::-;14734:77;;14821:43;14857:6;14852:3;14845:5;14821:43;:::i;:::-;14889:29;14911:6;14889:29;:::i;:::-;14884:3;14880:39;14873:46;;14724:201;;;;;:::o;14931:360::-;15017:3;15045:38;15077:5;15045:38;:::i;:::-;15099:70;15162:6;15157:3;15099:70;:::i;:::-;15092:77;;15178:52;15223:6;15218:3;15211:4;15204:5;15200:16;15178:52;:::i;:::-;15255:29;15277:6;15255:29;:::i;:::-;15250:3;15246:39;15239:46;;15021:270;;;;;:::o;15321:304::-;15419:3;15440:71;15504:6;15499:3;15440:71;:::i;:::-;15433:78;;15521:43;15557:6;15552:3;15545:5;15521:43;:::i;:::-;15589:29;15611:6;15589:29;:::i;:::-;15584:3;15580:39;15573:46;;15423:202;;;;;:::o;15631:364::-;15719:3;15747:39;15780:5;15747:39;:::i;:::-;15802:71;15866:6;15861:3;15802:71;:::i;:::-;15795:78;;15882:52;15927:6;15922:3;15915:4;15908:5;15904:16;15882:52;:::i;:::-;15959:29;15981:6;15959:29;:::i;:::-;15954:3;15950:39;15943:46;;15723:272;;;;;:::o;16001:366::-;16143:3;16164:67;16228:2;16223:3;16164:67;:::i;:::-;16157:74;;16240:93;16329:3;16240:93;:::i;:::-;16358:2;16353:3;16349:12;16342:19;;16147:220;;;:::o;16373:366::-;16515:3;16536:67;16600:2;16595:3;16536:67;:::i;:::-;16529:74;;16612:93;16701:3;16612:93;:::i;:::-;16730:2;16725:3;16721:12;16714:19;;16519:220;;;:::o;16745:366::-;16887:3;16908:67;16972:2;16967:3;16908:67;:::i;:::-;16901:74;;16984:93;17073:3;16984:93;:::i;:::-;17102:2;17097:3;17093:12;17086:19;;16891:220;;;:::o;17117:366::-;17259:3;17280:67;17344:2;17339:3;17280:67;:::i;:::-;17273:74;;17356:93;17445:3;17356:93;:::i;:::-;17474:2;17469:3;17465:12;17458:19;;17263:220;;;:::o;17489:366::-;17631:3;17652:67;17716:2;17711:3;17652:67;:::i;:::-;17645:74;;17728:93;17817:3;17728:93;:::i;:::-;17846:2;17841:3;17837:12;17830:19;;17635:220;;;:::o;17861:366::-;18003:3;18024:67;18088:2;18083:3;18024:67;:::i;:::-;18017:74;;18100:93;18189:3;18100:93;:::i;:::-;18218:2;18213:3;18209:12;18202:19;;18007:220;;;:::o;18233:366::-;18375:3;18396:67;18460:2;18455:3;18396:67;:::i;:::-;18389:74;;18472:93;18561:3;18472:93;:::i;:::-;18590:2;18585:3;18581:12;18574:19;;18379:220;;;:::o;18605:366::-;18747:3;18768:67;18832:2;18827:3;18768:67;:::i;:::-;18761:74;;18844:93;18933:3;18844:93;:::i;:::-;18962:2;18957:3;18953:12;18946:19;;18751:220;;;:::o;18977:366::-;19119:3;19140:67;19204:2;19199:3;19140:67;:::i;:::-;19133:74;;19216:93;19305:3;19216:93;:::i;:::-;19334:2;19329:3;19325:12;19318:19;;19123:220;;;:::o;19349:366::-;19491:3;19512:67;19576:2;19571:3;19512:67;:::i;:::-;19505:74;;19588:93;19677:3;19588:93;:::i;:::-;19706:2;19701:3;19697:12;19690:19;;19495:220;;;:::o;19721:366::-;19863:3;19884:67;19948:2;19943:3;19884:67;:::i;:::-;19877:74;;19960:93;20049:3;19960:93;:::i;:::-;20078:2;20073:3;20069:12;20062:19;;19867:220;;;:::o;20093:366::-;20235:3;20256:67;20320:2;20315:3;20256:67;:::i;:::-;20249:74;;20332:93;20421:3;20332:93;:::i;:::-;20450:2;20445:3;20441:12;20434:19;;20239:220;;;:::o;20465:366::-;20607:3;20628:67;20692:2;20687:3;20628:67;:::i;:::-;20621:74;;20704:93;20793:3;20704:93;:::i;:::-;20822:2;20817:3;20813:12;20806:19;;20611:220;;;:::o;20837:366::-;20979:3;21000:67;21064:2;21059:3;21000:67;:::i;:::-;20993:74;;21076:93;21165:3;21076:93;:::i;:::-;21194:2;21189:3;21185:12;21178:19;;20983:220;;;:::o;21209:366::-;21351:3;21372:67;21436:2;21431:3;21372:67;:::i;:::-;21365:74;;21448:93;21537:3;21448:93;:::i;:::-;21566:2;21561:3;21557:12;21550:19;;21355:220;;;:::o;21581:366::-;21723:3;21744:67;21808:2;21803:3;21744:67;:::i;:::-;21737:74;;21820:93;21909:3;21820:93;:::i;:::-;21938:2;21933:3;21929:12;21922:19;;21727:220;;;:::o;21953:366::-;22095:3;22116:67;22180:2;22175:3;22116:67;:::i;:::-;22109:74;;22192:93;22281:3;22192:93;:::i;:::-;22310:2;22305:3;22301:12;22294:19;;22099:220;;;:::o;22325:366::-;22467:3;22488:67;22552:2;22547:3;22488:67;:::i;:::-;22481:74;;22564:93;22653:3;22564:93;:::i;:::-;22682:2;22677:3;22673:12;22666:19;;22471:220;;;:::o;22697:366::-;22839:3;22860:67;22924:2;22919:3;22860:67;:::i;:::-;22853:74;;22936:93;23025:3;22936:93;:::i;:::-;23054:2;23049:3;23045:12;23038:19;;22843:220;;;:::o;23069:366::-;23211:3;23232:67;23296:2;23291:3;23232:67;:::i;:::-;23225:74;;23308:93;23397:3;23308:93;:::i;:::-;23426:2;23421:3;23417:12;23410:19;;23215:220;;;:::o;23441:366::-;23583:3;23604:67;23668:2;23663:3;23604:67;:::i;:::-;23597:74;;23680:93;23769:3;23680:93;:::i;:::-;23798:2;23793:3;23789:12;23782:19;;23587:220;;;:::o;23813:366::-;23955:3;23976:67;24040:2;24035:3;23976:67;:::i;:::-;23969:74;;24052:93;24141:3;24052:93;:::i;:::-;24170:2;24165:3;24161:12;24154:19;;23959:220;;;:::o;24185:366::-;24327:3;24348:67;24412:2;24407:3;24348:67;:::i;:::-;24341:74;;24424:93;24513:3;24424:93;:::i;:::-;24542:2;24537:3;24533:12;24526:19;;24331:220;;;:::o;24557:108::-;24634:24;24652:5;24634:24;:::i;:::-;24629:3;24622:37;24612:53;;:::o;24671:118::-;24758:24;24776:5;24758:24;:::i;:::-;24753:3;24746:37;24736:53;;:::o;24795:115::-;24880:23;24897:5;24880:23;:::i;:::-;24875:3;24868:36;24858:52;;:::o;24916:112::-;24999:22;25015:5;24999:22;:::i;:::-;24994:3;24987:35;24977:51;;:::o;25034:222::-;25127:4;25165:2;25154:9;25150:18;25142:26;;25178:71;25246:1;25235:9;25231:17;25222:6;25178:71;:::i;:::-;25132:124;;;;:::o;25262:1053::-;25585:4;25623:3;25612:9;25608:19;25600:27;;25637:71;25705:1;25694:9;25690:17;25681:6;25637:71;:::i;:::-;25718:72;25786:2;25775:9;25771:18;25762:6;25718:72;:::i;:::-;25837:9;25831:4;25827:20;25822:2;25811:9;25807:18;25800:48;25865:108;25968:4;25959:6;25865:108;:::i;:::-;25857:116;;26020:9;26014:4;26010:20;26005:2;25994:9;25990:18;25983:48;26048:108;26151:4;26142:6;26048:108;:::i;:::-;26040:116;;26204:9;26198:4;26194:20;26188:3;26177:9;26173:19;26166:49;26232:76;26303:4;26294:6;26232:76;:::i;:::-;26224:84;;25590:725;;;;;;;;:::o;26321:751::-;26544:4;26582:3;26571:9;26567:19;26559:27;;26596:71;26664:1;26653:9;26649:17;26640:6;26596:71;:::i;:::-;26677:72;26745:2;26734:9;26730:18;26721:6;26677:72;:::i;:::-;26759;26827:2;26816:9;26812:18;26803:6;26759:72;:::i;:::-;26841;26909:2;26898:9;26894:18;26885:6;26841:72;:::i;:::-;26961:9;26955:4;26951:20;26945:3;26934:9;26930:19;26923:49;26989:76;27060:4;27051:6;26989:76;:::i;:::-;26981:84;;26549:523;;;;;;;;:::o;27078:373::-;27221:4;27259:2;27248:9;27244:18;27236:26;;27308:9;27302:4;27298:20;27294:1;27283:9;27279:17;27272:47;27336:108;27439:4;27430:6;27336:108;:::i;:::-;27328:116;;27226:225;;;;:::o;27457:634::-;27678:4;27716:2;27705:9;27701:18;27693:26;;27765:9;27759:4;27755:20;27751:1;27740:9;27736:17;27729:47;27793:108;27896:4;27887:6;27793:108;:::i;:::-;27785:116;;27948:9;27942:4;27938:20;27933:2;27922:9;27918:18;27911:48;27976:108;28079:4;28070:6;27976:108;:::i;:::-;27968:116;;27683:408;;;;;:::o;28097:210::-;28184:4;28222:2;28211:9;28207:18;28199:26;;28235:65;28297:1;28286:9;28282:17;28273:6;28235:65;:::i;:::-;28189:118;;;;:::o;28313:545::-;28486:4;28524:3;28513:9;28509:19;28501:27;;28538:71;28606:1;28595:9;28591:17;28582:6;28538:71;:::i;:::-;28619:68;28683:2;28672:9;28668:18;28659:6;28619:68;:::i;:::-;28697:72;28765:2;28754:9;28750:18;28741:6;28697:72;:::i;:::-;28779;28847:2;28836:9;28832:18;28823:6;28779:72;:::i;:::-;28491:367;;;;;;;:::o;28864:313::-;28977:4;29015:2;29004:9;29000:18;28992:26;;29064:9;29058:4;29054:20;29050:1;29039:9;29035:17;29028:47;29092:78;29165:4;29156:6;29092:78;:::i;:::-;29084:86;;28982:195;;;;:::o;29183:419::-;29349:4;29387:2;29376:9;29372:18;29364:26;;29436:9;29430:4;29426:20;29422:1;29411:9;29407:17;29400:47;29464:131;29590:4;29464:131;:::i;:::-;29456:139;;29354:248;;;:::o;29608:419::-;29774:4;29812:2;29801:9;29797:18;29789:26;;29861:9;29855:4;29851:20;29847:1;29836:9;29832:17;29825:47;29889:131;30015:4;29889:131;:::i;:::-;29881:139;;29779:248;;;:::o;30033:419::-;30199:4;30237:2;30226:9;30222:18;30214:26;;30286:9;30280:4;30276:20;30272:1;30261:9;30257:17;30250:47;30314:131;30440:4;30314:131;:::i;:::-;30306:139;;30204:248;;;:::o;30458:419::-;30624:4;30662:2;30651:9;30647:18;30639:26;;30711:9;30705:4;30701:20;30697:1;30686:9;30682:17;30675:47;30739:131;30865:4;30739:131;:::i;:::-;30731:139;;30629:248;;;:::o;30883:1186::-;31243:4;31281:3;31270:9;31266:19;31258:27;;31331:9;31325:4;31321:20;31317:1;31306:9;31302:17;31295:47;31359:131;31485:4;31359:131;:::i;:::-;31351:139;;31500:72;31568:2;31557:9;31553:18;31544:6;31500:72;:::i;:::-;31582:70;31648:2;31637:9;31633:18;31624:6;31582:70;:::i;:::-;31662:72;31730:2;31719:9;31715:18;31706:6;31662:72;:::i;:::-;31744:73;31812:3;31801:9;31797:19;31788:6;31744:73;:::i;:::-;31827;31895:3;31884:9;31880:19;31871:6;31827:73;:::i;:::-;31948:9;31942:4;31938:20;31932:3;31921:9;31917:19;31910:49;31976:86;32057:4;32048:6;32040;31976:86;:::i;:::-;31968:94;;31248:821;;;;;;;;;;:::o;32075:419::-;32241:4;32279:2;32268:9;32264:18;32256:26;;32328:9;32322:4;32318:20;32314:1;32303:9;32299:17;32292:47;32356:131;32482:4;32356:131;:::i;:::-;32348:139;;32246:248;;;:::o;32500:419::-;32666:4;32704:2;32693:9;32689:18;32681:26;;32753:9;32747:4;32743:20;32739:1;32728:9;32724:17;32717:47;32781:131;32907:4;32781:131;:::i;:::-;32773:139;;32671:248;;;:::o;32925:419::-;33091:4;33129:2;33118:9;33114:18;33106:26;;33178:9;33172:4;33168:20;33164:1;33153:9;33149:17;33142:47;33206:131;33332:4;33206:131;:::i;:::-;33198:139;;33096:248;;;:::o;33350:419::-;33516:4;33554:2;33543:9;33539:18;33531:26;;33603:9;33597:4;33593:20;33589:1;33578:9;33574:17;33567:47;33631:131;33757:4;33631:131;:::i;:::-;33623:139;;33521:248;;;:::o;33775:419::-;33941:4;33979:2;33968:9;33964:18;33956:26;;34028:9;34022:4;34018:20;34014:1;34003:9;33999:17;33992:47;34056:131;34182:4;34056:131;:::i;:::-;34048:139;;33946:248;;;:::o;34200:419::-;34366:4;34404:2;34393:9;34389:18;34381:26;;34453:9;34447:4;34443:20;34439:1;34428:9;34424:17;34417:47;34481:131;34607:4;34481:131;:::i;:::-;34473:139;;34371:248;;;:::o;34625:419::-;34791:4;34829:2;34818:9;34814:18;34806:26;;34878:9;34872:4;34868:20;34864:1;34853:9;34849:17;34842:47;34906:131;35032:4;34906:131;:::i;:::-;34898:139;;34796:248;;;:::o;35050:419::-;35216:4;35254:2;35243:9;35239:18;35231:26;;35303:9;35297:4;35293:20;35289:1;35278:9;35274:17;35267:47;35331:131;35457:4;35331:131;:::i;:::-;35323:139;;35221:248;;;:::o;35475:419::-;35641:4;35679:2;35668:9;35664:18;35656:26;;35728:9;35722:4;35718:20;35714:1;35703:9;35699:17;35692:47;35756:131;35882:4;35756:131;:::i;:::-;35748:139;;35646:248;;;:::o;35900:419::-;36066:4;36104:2;36093:9;36089:18;36081:26;;36153:9;36147:4;36143:20;36139:1;36128:9;36124:17;36117:47;36181:131;36307:4;36181:131;:::i;:::-;36173:139;;36071:248;;;:::o;36325:419::-;36491:4;36529:2;36518:9;36514:18;36506:26;;36578:9;36572:4;36568:20;36564:1;36553:9;36549:17;36542:47;36606:131;36732:4;36606:131;:::i;:::-;36598:139;;36496:248;;;:::o;36750:419::-;36916:4;36954:2;36943:9;36939:18;36931:26;;37003:9;36997:4;36993:20;36989:1;36978:9;36974:17;36967:47;37031:131;37157:4;37031:131;:::i;:::-;37023:139;;36921:248;;;:::o;37175:419::-;37341:4;37379:2;37368:9;37364:18;37356:26;;37428:9;37422:4;37418:20;37414:1;37403:9;37399:17;37392:47;37456:131;37582:4;37456:131;:::i;:::-;37448:139;;37346:248;;;:::o;37600:419::-;37766:4;37804:2;37793:9;37789:18;37781:26;;37853:9;37847:4;37843:20;37839:1;37828:9;37824:17;37817:47;37881:131;38007:4;37881:131;:::i;:::-;37873:139;;37771:248;;;:::o;38025:419::-;38191:4;38229:2;38218:9;38214:18;38206:26;;38278:9;38272:4;38268:20;38264:1;38253:9;38249:17;38242:47;38306:131;38432:4;38306:131;:::i;:::-;38298:139;;38196:248;;;:::o;38450:419::-;38616:4;38654:2;38643:9;38639:18;38631:26;;38703:9;38697:4;38693:20;38689:1;38678:9;38674:17;38667:47;38731:131;38857:4;38731:131;:::i;:::-;38723:139;;38621:248;;;:::o;38875:419::-;39041:4;39079:2;39068:9;39064:18;39056:26;;39128:9;39122:4;39118:20;39114:1;39103:9;39099:17;39092:47;39156:131;39282:4;39156:131;:::i;:::-;39148:139;;39046:248;;;:::o;39300:419::-;39466:4;39504:2;39493:9;39489:18;39481:26;;39553:9;39547:4;39543:20;39539:1;39528:9;39524:17;39517:47;39581:131;39707:4;39581:131;:::i;:::-;39573:139;;39471:248;;;:::o;39725:222::-;39818:4;39856:2;39845:9;39841:18;39833:26;;39869:71;39937:1;39926:9;39922:17;39913:6;39869:71;:::i;:::-;39823:124;;;;:::o;39953:910::-;40228:4;40266:3;40255:9;40251:19;40243:27;;40280:71;40348:1;40337:9;40333:17;40324:6;40280:71;:::i;:::-;40361:88;40445:2;40434:9;40430:18;40421:6;40361:88;:::i;:::-;40459:70;40525:2;40514:9;40510:18;40501:6;40459:70;:::i;:::-;40539:72;40607:2;40596:9;40592:18;40583:6;40539:72;:::i;:::-;40621:73;40689:3;40678:9;40674:19;40665:6;40621:73;:::i;:::-;40742:9;40736:4;40732:20;40726:3;40715:9;40711:19;40704:49;40770:86;40851:4;40842:6;40834;40770:86;:::i;:::-;40762:94;;40233:630;;;;;;;;;;:::o;40869:332::-;40990:4;41028:2;41017:9;41013:18;41005:26;;41041:71;41109:1;41098:9;41094:17;41085:6;41041:71;:::i;:::-;41122:72;41190:2;41179:9;41175:18;41166:6;41122:72;:::i;:::-;40995:206;;;;;:::o;41207:989::-;41496:4;41534:3;41523:9;41519:19;41511:27;;41548:69;41614:1;41603:9;41599:17;41590:6;41548:69;:::i;:::-;41627:72;41695:2;41684:9;41680:18;41671:6;41627:72;:::i;:::-;41709;41777:2;41766:9;41762:18;41753:6;41709:72;:::i;:::-;41791;41859:2;41848:9;41844:18;41835:6;41791:72;:::i;:::-;41911:9;41905:4;41901:20;41895:3;41884:9;41880:19;41873:49;41939:86;42020:4;42011:6;42003;41939:86;:::i;:::-;41931:94;;42073:9;42067:4;42063:20;42057:3;42046:9;42042:19;42035:49;42101:88;42184:4;42175:6;42167;42101:88;:::i;:::-;42093:96;;41501:695;;;;;;;;;;;:::o;42202:129::-;42236:6;42263:20;;:::i;:::-;42253:30;;42292:33;42320:4;42312:6;42292:33;:::i;:::-;42243:88;;;:::o;42337:75::-;42370:6;42403:2;42397:9;42387:19;;42377:35;:::o;42418:311::-;42495:4;42585:18;42577:6;42574:30;42571:2;;;42607:18;;:::i;:::-;42571:2;42657:4;42649:6;42645:17;42637:25;;42717:4;42711;42707:15;42699:23;;42500:229;;;:::o;42735:311::-;42812:4;42902:18;42894:6;42891:30;42888:2;;;42924:18;;:::i;:::-;42888:2;42974:4;42966:6;42962:17;42954:25;;43034:4;43028;43024:15;43016:23;;42817:229;;;:::o;43052:307::-;43113:4;43203:18;43195:6;43192:30;43189:2;;;43225:18;;:::i;:::-;43189:2;43263:29;43285:6;43263:29;:::i;:::-;43255:37;;43347:4;43341;43337:15;43329:23;;43118:241;;;:::o;43365:132::-;43432:4;43455:3;43447:11;;43485:4;43480:3;43476:14;43468:22;;43437:60;;;:::o;43503:114::-;43570:6;43604:5;43598:12;43588:22;;43577:40;;;:::o;43623:98::-;43674:6;43708:5;43702:12;43692:22;;43681:40;;;:::o;43727:99::-;43779:6;43813:5;43807:12;43797:22;;43786:40;;;:::o;43832:113::-;43902:4;43934;43929:3;43925:14;43917:22;;43907:38;;;:::o;43951:184::-;44050:11;44084:6;44079:3;44072:19;44124:4;44119:3;44115:14;44100:29;;44062:73;;;;:::o;44141:168::-;44224:11;44258:6;44253:3;44246:19;44298:4;44293:3;44289:14;44274:29;;44236:73;;;;:::o;44315:169::-;44399:11;44433:6;44428:3;44421:19;44473:4;44468:3;44464:14;44449:29;;44411:73;;;;:::o;44490:305::-;44530:3;44549:20;44567:1;44549:20;:::i;:::-;44544:25;;44583:20;44601:1;44583:20;:::i;:::-;44578:25;;44737:1;44669:66;44665:74;44662:1;44659:81;44656:2;;;44743:18;;:::i;:::-;44656:2;44787:1;44784;44780:9;44773:16;;44534:261;;;;:::o;44801:191::-;44841:4;44861:20;44879:1;44861:20;:::i;:::-;44856:25;;44895:20;44913:1;44895:20;:::i;:::-;44890:25;;44934:1;44931;44928:8;44925:2;;;44939:18;;:::i;:::-;44925:2;44984:1;44981;44977:9;44969:17;;44846:146;;;;:::o;44998:96::-;45035:7;45064:24;45082:5;45064:24;:::i;:::-;45053:35;;45043:51;;;:::o;45100:104::-;45145:7;45174:24;45192:5;45174:24;:::i;:::-;45163:35;;45153:51;;;:::o;45210:90::-;45244:7;45287:5;45280:13;45273:21;45262:32;;45252:48;;;:::o;45306:77::-;45343:7;45372:5;45361:16;;45351:32;;;:::o;45389:149::-;45425:7;45465:66;45458:5;45454:78;45443:89;;45433:105;;;:::o;45544:126::-;45581:7;45621:42;45614:5;45610:54;45599:65;;45589:81;;;:::o;45676:77::-;45713:7;45742:5;45731:16;;45721:32;;;:::o;45759:93::-;45795:7;45835:10;45828:5;45824:22;45813:33;;45803:49;;;:::o;45858:86::-;45893:7;45933:4;45926:5;45922:16;45911:27;;45901:43;;;:::o;45950:154::-;46034:6;46029:3;46024;46011:30;46096:1;46087:6;46082:3;46078:16;46071:27;46001:103;;;:::o;46110:307::-;46178:1;46188:113;46202:6;46199:1;46196:13;46188:113;;;46287:1;46282:3;46278:11;46272:18;46268:1;46263:3;46259:11;46252:39;46224:2;46221:1;46217:10;46212:15;;46188:113;;;46319:6;46316:1;46313:13;46310:2;;;46399:1;46390:6;46385:3;46381:16;46374:27;46310:2;46159:258;;;;:::o;46423:320::-;46467:6;46504:1;46498:4;46494:12;46484:22;;46551:1;46545:4;46541:12;46572:18;46562:2;;46628:4;46620:6;46616:17;46606:27;;46562:2;46690;46682:6;46679:14;46659:18;46656:38;46653:2;;;46709:18;;:::i;:::-;46653:2;46474:269;;;;:::o;46749:281::-;46832:27;46854:4;46832:27;:::i;:::-;46824:6;46820:40;46962:6;46950:10;46947:22;46926:18;46914:10;46911:34;46908:62;46905:2;;;46973:18;;:::i;:::-;46905:2;47013:10;47009:2;47002:22;46792:238;;;:::o;47036:233::-;47075:3;47098:24;47116:5;47098:24;:::i;:::-;47089:33;;47144:66;47137:5;47134:77;47131:2;;;47214:18;;:::i;:::-;47131:2;47261:1;47254:5;47250:13;47243:20;;47079:190;;;:::o;47275:180::-;47323:77;47320:1;47313:88;47420:4;47417:1;47410:15;47444:4;47441:1;47434:15;47461:180;47509:77;47506:1;47499:88;47606:4;47603:1;47596:15;47630:4;47627:1;47620:15;47647:180;47695:77;47692:1;47685:88;47792:4;47789:1;47782:15;47816:4;47813:1;47806:15;47833:183;47868:3;47906:1;47888:16;47885:23;47882:2;;;47944:1;47941;47938;47923:23;47966:34;47997:1;47991:8;47966:34;:::i;:::-;47959:41;;47882:2;47872:144;:::o;48022:102::-;48063:6;48114:2;48110:7;48105:2;48098:5;48094:14;48090:28;48080:38;;48070:54;;;:::o;48130:106::-;48174:8;48223:5;48218:3;48214:15;48193:36;;48183:53;;;:::o;48242:239::-;48382:34;48378:1;48370:6;48366:14;48359:58;48451:22;48446:2;48438:6;48434:15;48427:47;48348:133;:::o;48487:170::-;48627:22;48623:1;48615:6;48611:14;48604:46;48593:64;:::o;48663:227::-;48803:34;48799:1;48791:6;48787:14;48780:58;48872:10;48867:2;48859:6;48855:15;48848:35;48769:121;:::o;48896:230::-;49036:34;49032:1;49024:6;49020:14;49013:58;49105:13;49100:2;49092:6;49088:15;49081:38;49002:124;:::o;49132:168::-;49272:20;49268:1;49260:6;49256:14;49249:44;49238:62;:::o;49306:225::-;49446:34;49442:1;49434:6;49430:14;49423:58;49515:8;49510:2;49502:6;49498:15;49491:33;49412:119;:::o;49537:223::-;49677:34;49673:1;49665:6;49661:14;49654:58;49746:6;49741:2;49733:6;49729:15;49722:31;49643:117;:::o;49766:228::-;49906:34;49902:1;49894:6;49890:14;49883:58;49975:11;49970:2;49962:6;49958:15;49951:36;49872:122;:::o;50000:167::-;50140:19;50136:1;50128:6;50124:14;50117:43;50106:61;:::o;50173:224::-;50313:34;50309:1;50301:6;50297:14;50290:58;50382:7;50377:2;50369:6;50365:15;50358:32;50279:118;:::o;50403:237::-;50543:34;50539:1;50531:6;50527:14;50520:58;50612:20;50607:2;50599:6;50595:15;50588:45;50509:131;:::o;50646:172::-;50786:24;50782:1;50774:6;50770:14;50763:48;50752:66;:::o;50824:222::-;50964:34;50960:1;50952:6;50948:14;50941:58;51033:5;51028:2;51020:6;51016:15;51009:30;50930:116;:::o;51052:229::-;51192:34;51188:1;51180:6;51176:14;51169:58;51261:12;51256:2;51248:6;51244:15;51237:37;51158:123;:::o;51287:167::-;51427:19;51423:1;51415:6;51411:14;51404:43;51393:61;:::o;51460:182::-;51600:34;51596:1;51588:6;51584:14;51577:58;51566:76;:::o;51648:172::-;51788:24;51784:1;51776:6;51772:14;51765:48;51754:66;:::o;51826:228::-;51966:34;51962:1;51954:6;51950:14;51943:58;52035:11;52030:2;52022:6;52018:15;52011:36;51932:122;:::o;52060:228::-;52200:34;52196:1;52188:6;52184:14;52177:58;52269:11;52264:2;52256:6;52252:15;52245:36;52166:122;:::o;52294:227::-;52434:34;52430:1;52422:6;52418:14;52411:58;52503:10;52498:2;52490:6;52486:15;52479:35;52400:121;:::o;52527:177::-;52667:29;52663:1;52655:6;52651:14;52644:53;52633:71;:::o;52710:220::-;52850:34;52846:1;52838:6;52834:14;52827:58;52919:3;52914:2;52906:6;52902:15;52895:28;52816:114;:::o;52936:181::-;53076:33;53072:1;53064:6;53060:14;53053:57;53042:75;:::o;53123:711::-;53162:3;53200:4;53182:16;53179:26;53176:2;;;53208:5;;53176:2;53237:20;;:::i;:::-;53312:1;53294:16;53290:24;53287:1;53281:4;53266:49;53345:4;53339:11;53444:16;53437:4;53429:6;53425:17;53422:39;53389:18;53381:6;53378:30;53362:113;53359:2;;;53490:5;;;;53359:2;53536:6;53530:4;53526:17;53572:3;53566:10;53599:18;53591:6;53588:30;53585:2;;;53621:5;;;;;;53585:2;53669:6;53662:4;53657:3;53653:14;53649:27;53728:1;53710:16;53706:24;53700:4;53696:35;53691:3;53688:44;53685:2;;;53735:5;;;;;;;53685:2;53752:57;53800:6;53794:4;53790:17;53782:6;53778:30;53772:4;53752:57;:::i;:::-;53825:3;53818:10;;53166:668;;;;;;;:::o;53840:122::-;53913:24;53931:5;53913:24;:::i;:::-;53906:5;53903:35;53893:2;;53952:1;53949;53942:12;53893:2;53883:79;:::o;53968:116::-;54038:21;54053:5;54038:21;:::i;:::-;54031:5;54028:32;54018:2;;54074:1;54071;54064:12;54018:2;54008:76;:::o;54090:122::-;54163:24;54181:5;54163:24;:::i;:::-;54156:5;54153:35;54143:2;;54202:1;54199;54192:12;54143:2;54133:79;:::o;54218:120::-;54290:23;54307:5;54290:23;:::i;:::-;54283:5;54280:34;54270:2;;54328:1;54325;54318:12;54270:2;54260:78;:::o;54344:122::-;54417:24;54435:5;54417:24;:::i;:::-;54410:5;54407:35;54397:2;;54456:1;54453;54446:12;54397:2;54387:79;:::o;54472:120::-;54544:23;54561:5;54544:23;:::i;:::-;54537:5;54534:34;54524:2;;54582:1;54579;54572:12;54524:2;54514:78;:::o;54598:118::-;54669:22;54685:5;54669:22;:::i;:::-;54662:5;54659:33;54649:2;;54706:1;54703;54696:12;54649:2;54639:77;:::o

Swarm Source

ipfs://d77ea0abc5c2ca3f4dd740ac1319c801c66c79ad464de376fcb22cebcad67f3c
Loading...
Loading
Loading...
Loading
[ 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.