Token SoulBound Token

Overview ERC721

Total Supply:
0 SBT

Holders:
5 addresses

Profile Summary

 
Contract:
0x26c227853a6297aff4379eb93976127b88a273740x26C227853a6297AFF4379eB93976127b88a27374

Balance
396387739119734000000000000000000000000... SBT
0x0000000000000000000000000000000000000000
Loading
[ Download CSV Export  ] 
Loading
Loading

Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SBT

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-02
*/

// File: contracts/libraries/Roles.sol


pragma solidity ^0.8.0;

/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
  struct Role {
    mapping (address => bool) bearer;
  }

  /**
   * @dev give an account access to this role
   */
  function add(Role storage role, address account) internal {
    require(account != address(0));
    role.bearer[account] = true;
  }

  /**
   * @dev remove an account's access to this role
   */
  function remove(Role storage role, address account) internal {
    require(account != address(0));
    role.bearer[account] = false;
  }

  /**
   * @dev check if an account has this role
   * @return bool
   */
  function has(Role storage role, address account)
    internal
    view
    returns (bool)
  {
    require(account != address(0));
    return role.bearer[account];
  }
}

// File: contracts/MinterRole.sol


pragma solidity ^0.8.0;


contract MinterRole {
    using Roles for Roles.Role;

    event MinterAdded(address indexed account);
    event MinterRemoved(address indexed account);

    Roles.Role private minters;

    constructor() {
        _addMinter(msg.sender);
    }

    modifier onlyMinter(address sender) {
        require(isMinter(sender));
        _;
    }

    function isMinter(address account) public view returns (bool) {
        return minters.has(account);
    }

    function addMinter(address account) public onlyMinter(msg.sender) {
        _addMinter(account);
    }

    function renounceMinter() public {
        _removeMinter(msg.sender);
    }

    function _addMinter(address account) internal {
        minters.add(account);
        emit MinterAdded(account);
    }

    function _removeMinter(address account) internal {
        minters.remove(account);
        emit MinterRemoved(account);
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal 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
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

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: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @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: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

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

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

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

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

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

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

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

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

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

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

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

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

        _afterTokenTransfer(owner, address(0), tokenId);
    }

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally checks to see if a
     * token-specific URI was set for the token, and if so, it deletes the token URI from
     * the storage mapping.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File: contracts/SBT.sol

//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;



contract SBT is ERC721URIStorage, MinterRole {
    address public owner;
    struct sbt {
        string sbtType;
        string campaignName;
        uint256 campaignID;
        string campaignStatus;
        uint256 expPoints;
        string tokenName;
        address tokenAddress;
        uint256 amount;
        string claimStatus;
        string campaignCPI;
    }

    uint256 public SBT_ID = 1;
    mapping(uint256 => sbt) public info;
    mapping(address => uint256[]) public userInfo;
    event SBT_mint(
        address minter,
        address receiver,
        uint256 SBT_ID,
        string sbtType
    );
    event SBT_burn(uint256 SBT_ID);

    constructor() ERC721("SoulBound Token", "SBT") {
        owner = msg.sender;
    }

    // function getUserInfo(address user) external view returns (uint256){
    //     return userInfo[user].length;

    // }
    function mint(
        address _to,
        sbt memory _sbt,
        string memory URI
    ) external onlyMinter(_msgSender()) {
        // require(msg.sender == owner, "Not owner");
        _mint(owner, SBT_ID);
        _setTokenURI(SBT_ID, URI);
        _transfer(owner, _to, SBT_ID);
        userInfo[_to].push(SBT_ID);
        info[SBT_ID] = _sbt;
        emit SBT_mint(owner, _to, SBT_ID, _sbt.sbtType);
        SBT_ID++;
    }

    function burn(uint256 _sbtId) external onlyMinter(_msgSender()) {
        // require(msg.sender == owner, "Not Owner");
        _burn(_sbtId);
        emit SBT_burn(_sbtId);
    }

    function _transfer(
        address from,
        address to,
        uint256 _sbtId
    ) internal override {
        require(from == owner, "NON-transferable");
        super._transfer(from, to, _sbtId);
    }
}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"SBT_ID","type":"uint256"}],"name":"SBT_burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"SBT_ID","type":"uint256"},{"indexed":false,"internalType":"string","name":"sbtType","type":"string"}],"name":"SBT_mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"SBT_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sbtId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"info","outputs":[{"internalType":"string","name":"sbtType","type":"string"},{"internalType":"string","name":"campaignName","type":"string"},{"internalType":"uint256","name":"campaignID","type":"uint256"},{"internalType":"string","name":"campaignStatus","type":"string"},{"internalType":"uint256","name":"expPoints","type":"uint256"},{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"claimStatus","type":"string"},{"internalType":"string","name":"campaignCPI","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"components":[{"internalType":"string","name":"sbtType","type":"string"},{"internalType":"string","name":"campaignName","type":"string"},{"internalType":"uint256","name":"campaignID","type":"uint256"},{"internalType":"string","name":"campaignStatus","type":"string"},{"internalType":"uint256","name":"expPoints","type":"uint256"},{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"claimStatus","type":"string"},{"internalType":"string","name":"campaignCPI","type":"string"}],"internalType":"struct SBT.sbt","name":"_sbt","type":"tuple"},{"internalType":"string","name":"URI","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

608060405260016009553480156200001657600080fd5b50604080518082018252600f81526e29b7bab62137bab732102a37b5b2b760891b60208083019182528351808501909452600384526214d09560ea1b908401528151919291620000699160009162000136565b5080516200007f90600190602084019062000136565b5050506200009333620000ab60201b60201c565b600880546001600160a01b0319163317905562000219565b620000c6816007620000fd60201b62000e261790919060201c565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b6001600160a01b0381166200011157600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b8280546200014490620001dc565b90600052602060002090601f016020900481019282620001685760008555620001b3565b82601f106200018357805160ff1916838001178555620001b3565b82800160010185558215620001b3579182015b82811115620001b357825182559160200191906001019062000196565b50620001c1929150620001c5565b5090565b5b80821115620001c15760008155600101620001c6565b600181811c90821680620001f157607f821691505b602082108114156200021357634e487b7160e01b600052602260045260246000fd5b50919050565b61212580620002296000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80636352211e116100b8578063986502751161007c57806398650275146102b7578063a22cb465146102bf578063aa271e1a146102d2578063b88d4fde146102e5578063c87b56dd146102f8578063e985e9c51461030b57600080fd5b80636352211e1461026357806370a08231146102765780638da5cb5b1461028957806395d89b411461029c578063983b2d56146102a457600080fd5b806323b872dd1161010a57806323b872dd146101e55780632e340599146101f857806342842e0e1461022157806342966c68146102345780634af4b83514610247578063627e03e21461025057600080fd5b806301ffc9a71461014757806306fdde031461016f578063081812fc14610184578063095ea7b3146101af57806321ce919d146101c4575b600080fd5b61015a61015536600461199f565b610347565b60405190151581526020015b60405180910390f35b610177610399565b6040516101669190611a14565b610197610192366004611a27565b61042b565b6040516001600160a01b039091168152602001610166565b6101c26101bd366004611a5c565b610452565b005b6101d76101d2366004611a5c565b61056d565b604051908152602001610166565b6101c26101f3366004611a86565b61059e565b61020b610206366004611a27565b6105cf565b6040516101669a99989796959493929190611ac2565b6101c261022f366004611a86565b610959565b6101c2610242366004611a27565b610974565b6101d760095481565b6101c261025e366004611c45565b6109c7565b610197610271366004611a27565b610ba5565b6101d7610284366004611dd1565b610c05565b600854610197906001600160a01b031681565b610177610c8b565b6101c26102b2366004611dd1565b610c9a565b6101c2610cba565b6101c26102cd366004611dec565b610cc5565b61015a6102e0366004611dd1565b610cd0565b6101c26102f3366004611e28565b610cdd565b610177610306366004611a27565b610d15565b61015a610319366004611ea4565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b60006001600160e01b031982166380ac58cd60e01b148061037857506001600160e01b03198216635b5e139f60e01b145b8061039357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546103a890611ed7565b80601f01602080910402602001604051908101604052809291908181526020018280546103d490611ed7565b80156104215780601f106103f657610100808354040283529160200191610421565b820191906000526020600020905b81548152906001019060200180831161040457829003601f168201915b5050505050905090565b600061043682610e5e565b506000908152600460205260409020546001600160a01b031690565b600061045d82610ba5565b9050806001600160a01b0316836001600160a01b031614156104d05760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806104ec57506104ec8133610319565b61055e5760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016104c7565b6105688383610ec0565b505050565b600b602052816000526040600020818154811061058957600080fd5b90600052602060002001600091509150505481565b6105a83382610f2e565b6105c45760405162461bcd60e51b81526004016104c790611f12565b610568838383610fac565b600a602052600090815260409020805481906105ea90611ed7565b80601f016020809104026020016040519081016040528092919081815260200182805461061690611ed7565b80156106635780601f1061063857610100808354040283529160200191610663565b820191906000526020600020905b81548152906001019060200180831161064657829003601f168201915b50505050509080600101805461067890611ed7565b80601f01602080910402602001604051908101604052809291908181526020018280546106a490611ed7565b80156106f15780601f106106c6576101008083540402835291602001916106f1565b820191906000526020600020905b8154815290600101906020018083116106d457829003601f168201915b50505050509080600201549080600301805461070c90611ed7565b80601f016020809104026020016040519081016040528092919081815260200182805461073890611ed7565b80156107855780601f1061075a57610100808354040283529160200191610785565b820191906000526020600020905b81548152906001019060200180831161076857829003601f168201915b5050505050908060040154908060050180546107a090611ed7565b80601f01602080910402602001604051908101604052809291908181526020018280546107cc90611ed7565b80156108195780601f106107ee57610100808354040283529160200191610819565b820191906000526020600020905b8154815290600101906020018083116107fc57829003601f168201915b505050506006830154600784015460088501805494956001600160a01b03909316949193509061084890611ed7565b80601f016020809104026020016040519081016040528092919081815260200182805461087490611ed7565b80156108c15780601f10610896576101008083540402835291602001916108c1565b820191906000526020600020905b8154815290600101906020018083116108a457829003601f168201915b5050505050908060090180546108d690611ed7565b80601f016020809104026020016040519081016040528092919081815260200182805461090290611ed7565b801561094f5780601f106109245761010080835404028352916020019161094f565b820191906000526020600020905b81548152906001019060200180831161093257829003601f168201915b505050505090508a565b61056883838360405180602001604052806000815250610cdd565b3361097e81610cd0565b61098757600080fd5b61099082611007565b6040518281527feca8247571dfad0823836f1b7be0b8fa6139bfc55e8ff7a1f23c405d509880009060200160405180910390a15050565b336109d181610cd0565b6109da57600080fd5b6008546009546109f3916001600160a01b031690611047565b6109ff60095483611189565b600854600954610a1a916001600160a01b0316908690610fac565b6001600160a01b0384166000908152600b6020908152604080832060098054825460018101845592865284862090920191909155548352600a8252909120845180518693610a6c9284929101906118ba565b506020828101518051610a8592600185019201906118ba565b506040820151600282015560608201518051610aab9160038401916020909101906118ba565b506080820151600482015560a08201518051610ad19160058401916020909101906118ba565b5060c08201516006820180546001600160a01b0319166001600160a01b0390921691909117905560e082015160078201556101008201518051610b1e9160088401916020909101906118ba565b506101208201518051610b3b9160098401916020909101906118ba565b505060085460095485516040517f2790adf9259dff0e92b44a3d3c932f91ca81181bfd8ce7c148c450e50a155cdc9450610b82936001600160a01b03169289929091611f60565b60405180910390a160098054906000610b9a83611fb3565b919050555050505050565b6000818152600260205260408120546001600160a01b0316806103935760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016104c7565b60006001600160a01b038216610c6f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016104c7565b506001600160a01b031660009081526003602052604090205490565b6060600180546103a890611ed7565b33610ca481610cd0565b610cad57600080fd5b610cb682611223565b5050565b610cc333611265565b565b610cb63383836112a7565b6000610393600783611376565b610ce73383610f2e565b610d035760405162461bcd60e51b81526004016104c790611f12565b610d0f848484846113ab565b50505050565b6060610d2082610e5e565b60008281526006602052604081208054610d3990611ed7565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6590611ed7565b8015610db25780601f10610d8757610100808354040283529160200191610db2565b820191906000526020600020905b815481529060010190602001808311610d9557829003601f168201915b505050505090506000610dd060408051602081019091526000815290565b9050805160001415610de3575092915050565b815115610e15578082604051602001610dfd929190611fce565b60405160208183030381529060405292505050919050565b610e1e846113de565b949350505050565b6001600160a01b038116610e3957600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6000818152600260205260409020546001600160a01b0316610ebd5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016104c7565b50565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610ef582610ba5565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610f3a83610ba5565b9050806001600160a01b0316846001600160a01b03161480610f8157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80610e1e5750836001600160a01b0316610f9a8461042b565b6001600160a01b031614949350505050565b6008546001600160a01b03848116911614610ffc5760405162461bcd60e51b815260206004820152601060248201526f4e4f4e2d7472616e7366657261626c6560801b60448201526064016104c7565b610568838383611452565b611010816115ee565b6000818152600660205260409020805461102990611ed7565b159050610ebd576000818152600660205260408120610ebd9161193e565b6001600160a01b03821661109d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104c7565b6000818152600260205260409020546001600160a01b0316156111025760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016104c7565b6001600160a01b038216600090815260036020526040812080546001929061112b908490611ffd565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000828152600260205260409020546001600160a01b03166112045760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b60648201526084016104c7565b60008281526006602090815260409091208251610568928401906118ba565b61122e600782610e26565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b611270600782611689565b6040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b816001600160a01b0316836001600160a01b031614156113095760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016104c7565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60006001600160a01b03821661138b57600080fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6113b6848484610fac565b6113c2848484846116be565b610d0f5760405162461bcd60e51b81526004016104c790612015565b60606113e982610e5e565b600061140060408051602081019091526000815290565b90506000815111611420576040518060200160405280600081525061144b565b8061142a846117bc565b60405160200161143b929190611fce565b6040516020818303038152906040525b9392505050565b826001600160a01b031661146582610ba5565b6001600160a01b0316146114c95760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016104c7565b6001600160a01b03821661152b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016104c7565b611536600082610ec0565b6001600160a01b038316600090815260036020526040812080546001929061155f908490612067565b90915550506001600160a01b038216600090815260036020526040812080546001929061158d908490611ffd565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006115f982610ba5565b9050611606600083610ec0565b6001600160a01b038116600090815260036020526040812080546001929061162f908490612067565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b03811661169c57600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b60006001600160a01b0384163b156117b157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611702903390899088908890600401611f60565b6020604051808303816000875af192505050801561173d575060408051601f3d908101601f1916820190925261173a9181019061207e565b60015b611797573d80801561176b576040519150601f19603f3d011682016040523d82523d6000602084013e611770565b606091505b50805161178f5760405162461bcd60e51b81526004016104c790612015565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610e1e565b506001949350505050565b6060816117e05750506040805180820190915260018152600360fc1b602082015290565b8160005b811561180a57806117f481611fb3565b91506118039050600a836120b1565b91506117e4565b60008167ffffffffffffffff81111561182557611825611b6f565b6040519080825280601f01601f19166020018201604052801561184f576020820181803683370190505b5090505b8415610e1e57611864600183612067565b9150611871600a866120c5565b61187c906030611ffd565b60f81b818381518110611891576118916120d9565b60200101906001600160f81b031916908160001a9053506118b3600a866120b1565b9450611853565b8280546118c690611ed7565b90600052602060002090601f0160209004810192826118e8576000855561192e565b82601f1061190157805160ff191683800117855561192e565b8280016001018555821561192e579182015b8281111561192e578251825591602001919060010190611913565b5061193a929150611974565b5090565b50805461194a90611ed7565b6000825580601f1061195a575050565b601f016020900490600052602060002090810190610ebd91905b5b8082111561193a5760008155600101611975565b6001600160e01b031981168114610ebd57600080fd5b6000602082840312156119b157600080fd5b813561144b81611989565b60005b838110156119d75781810151838201526020016119bf565b83811115610d0f5750506000910152565b60008151808452611a008160208601602086016119bc565b601f01601f19169290920160200192915050565b60208152600061144b60208301846119e8565b600060208284031215611a3957600080fd5b5035919050565b80356001600160a01b0381168114611a5757600080fd5b919050565b60008060408385031215611a6f57600080fd5b611a7883611a40565b946020939093013593505050565b600080600060608486031215611a9b57600080fd5b611aa484611a40565b9250611ab260208501611a40565b9150604084013590509250925092565b6000610140808352611ad68184018e6119e8565b90508281036020840152611aea818d6119e8565b90508a60408401528281036060840152611b04818b6119e8565b905088608084015282810360a0840152611b1e81896119e8565b6001600160a01b03881660c085015260e084018790528381036101008501529050611b4981866119e8565b9050828103610120840152611b5e81856119e8565b9d9c50505050505050505050505050565b634e487b7160e01b600052604160045260246000fd5b604051610140810167ffffffffffffffff81118282101715611ba957611ba9611b6f565b60405290565b600067ffffffffffffffff80841115611bca57611bca611b6f565b604051601f8501601f19908116603f01168101908282118183101715611bf257611bf2611b6f565b81604052809350858152868686011115611c0b57600080fd5b858560208301376000602087830101525050509392505050565b600082601f830112611c3657600080fd5b61144b83833560208501611baf565b600080600060608486031215611c5a57600080fd5b611c6384611a40565b9250602084013567ffffffffffffffff80821115611c8057600080fd5b908501906101408288031215611c9557600080fd5b611c9d611b85565b823582811115611cac57600080fd5b611cb889828601611c25565b825250602083013582811115611ccd57600080fd5b611cd989828601611c25565b60208301525060408301356040820152606083013582811115611cfb57600080fd5b611d0789828601611c25565b6060830152506080830135608082015260a083013582811115611d2957600080fd5b611d3589828601611c25565b60a083015250611d4760c08401611a40565b60c082015260e083013560e08201526101008084013583811115611d6a57600080fd5b611d768a828701611c25565b8284015250506101208084013583811115611d9057600080fd5b611d9c8a828701611c25565b828401525050809450506040860135915080821115611dba57600080fd5b50611dc786828701611c25565b9150509250925092565b600060208284031215611de357600080fd5b61144b82611a40565b60008060408385031215611dff57600080fd5b611e0883611a40565b915060208301358015158114611e1d57600080fd5b809150509250929050565b60008060008060808587031215611e3e57600080fd5b611e4785611a40565b9350611e5560208601611a40565b925060408501359150606085013567ffffffffffffffff811115611e7857600080fd5b8501601f81018713611e8957600080fd5b611e9887823560208401611baf565b91505092959194509250565b60008060408385031215611eb757600080fd5b611ec083611a40565b9150611ece60208401611a40565b90509250929050565b600181811c90821680611eeb57607f821691505b60208210811415611f0c57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611f93908301846119e8565b9695505050505050565b634e487b7160e01b600052601160045260246000fd5b6000600019821415611fc757611fc7611f9d565b5060010190565b60008351611fe08184602088016119bc565b835190830190611ff48183602088016119bc565b01949350505050565b6000821982111561201057612010611f9d565b500190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008282101561207957612079611f9d565b500390565b60006020828403121561209057600080fd5b815161144b81611989565b634e487b7160e01b600052601260045260246000fd5b6000826120c0576120c061209b565b500490565b6000826120d4576120d461209b565b500690565b634e487b7160e01b600052603260045260246000fdfea26469706673582212206b8d5735ac6adcff1a41d012317a9abc5b50e025c479fa03ad26c2487b56344664736f6c634300080b0033

Deployed ByteCode Sourcemap

39198:1773:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23955:305;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;23955:305:0;;;;;;;;24882:100;;;:::i;:::-;;;;;;;:::i;26395:171::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;26395:171:0;1528:203:1;25912:417:0;;;;;;:::i;:::-;;:::i;:::-;;39663:45;;;;;;:::i;:::-;;:::i;:::-;;;2319:25:1;;;2307:2;2292:18;39663:45:0;2173:177:1;27095:336:0;;;;;;:::i;:::-;;:::i;39621:35::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;:::i;27502:185::-;;;;;;:::i;:::-;;:::i;40559:183::-;;;;;;:::i;:::-;;:::i;39589:25::-;;;;;;40106:445;;;;;;:::i;:::-;;:::i;24593:222::-;;;;;;:::i;:::-;;:::i;24324:207::-;;;;;;:::i;:::-;;:::i;39250:20::-;;;;;-1:-1:-1;;;;;39250:20:0;;;25051:104;;;:::i;1456:::-;;;;;;:::i;:::-;;:::i;1568:77::-;;;:::i;26638:155::-;;;;;;:::i;:::-;;:::i;1340:108::-;;;;;;:::i;:::-;;:::i;27758:323::-;;;;;;:::i;:::-;;:::i;37663:624::-;;;;;;:::i;:::-;;:::i;26864:164::-;;;;;;:::i;:::-;-1:-1:-1;;;;;26985:25:0;;;26961:4;26985:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26864:164;23955:305;24057:4;-1:-1:-1;;;;;;24094:40:0;;-1:-1:-1;;;24094:40:0;;:105;;-1:-1:-1;;;;;;;24151:48:0;;-1:-1:-1;;;24151:48:0;24094:105;:158;;;-1:-1:-1;;;;;;;;;;16806:40:0;;;24216:36;24074:178;23955:305;-1:-1:-1;;23955:305:0:o;24882:100::-;24936:13;24969:5;24962:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24882:100;:::o;26395:171::-;26471:7;26491:23;26506:7;26491:14;:23::i;:::-;-1:-1:-1;26534:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;26534:24:0;;26395:171::o;25912:417::-;25993:13;26009:23;26024:7;26009:14;:23::i;:::-;25993:39;;26057:5;-1:-1:-1;;;;;26051:11:0;:2;-1:-1:-1;;;;;26051:11:0;;;26043:57;;;;-1:-1:-1;;;26043:57:0;;9420:2:1;26043:57:0;;;9402:21:1;9459:2;9439:18;;;9432:30;9498:34;9478:18;;;9471:62;-1:-1:-1;;;9549:18:1;;;9542:31;9590:19;;26043:57:0;;;;;;;;;5174:10;-1:-1:-1;;;;;26135:21:0;;;;:62;;-1:-1:-1;26160:37:0;26177:5;5174:10;26864:164;:::i;26160:37::-;26113:174;;;;-1:-1:-1;;;26113:174:0;;9822:2:1;26113:174:0;;;9804:21:1;9861:2;9841:18;;;9834:30;9900:34;9880:18;;;9873:62;9971:32;9951:18;;;9944:60;10021:19;;26113:174:0;9620:426:1;26113:174:0;26300:21;26309:2;26313:7;26300:8;:21::i;:::-;25982:347;25912:417;;:::o;39663:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27095:336::-;27290:41;5174:10;27323:7;27290:18;:41::i;:::-;27282:100;;;;-1:-1:-1;;;27282:100:0;;;;;;;:::i;:::-;27395:28;27405:4;27411:2;27415:7;27395:9;:28::i;39621:35::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;39621:35:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;39621:35:0;;;;;;-1:-1:-1;39621:35:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27502:185::-;27640:39;27657:4;27663:2;27667:7;27640:39;;;;;;;;;;;;:16;:39::i;40559:183::-;5174:10;1295:16;1304:6;1295:8;:16::i;:::-;1287:25;;;;;;40689:13:::1;40695:6;40689:5;:13::i;:::-;40718:16;::::0;2319:25:1;;;40718:16:0::1;::::0;2307:2:1;2292:18;40718:16:0::1;;;;;;;40559:183:::0;;:::o;40106:445::-;5174:10;1295:16;1304:6;1295:8;:16::i;:::-;1287:25;;;;;;40309:5:::1;::::0;40316:6:::1;::::0;40303:20:::1;::::0;-1:-1:-1;;;;;40309:5:0::1;::::0;40303::::1;:20::i;:::-;40334:25;40347:6;;40355:3;40334:12;:25::i;:::-;40380:5;::::0;40392:6:::1;::::0;40370:29:::1;::::0;-1:-1:-1;;;;;40380:5:0::1;::::0;40387:3;;40370:9:::1;:29::i;:::-;-1:-1:-1::0;;;;;40410:13:0;::::1;;::::0;;;:8:::1;:13;::::0;;;;;;;40429:6:::1;::::0;;40410:26;;::::1;::::0;::::1;::::0;;;;;;;;;;::::1;::::0;;;;40452:6;40447:12;;:4:::1;:12:::0;;;;;:19;;;;40462:4;;40447:19:::1;::::0;:12;;:19;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;40447:19:0::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;40447:19:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;40447:19:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;40447:19:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;40447:19:0::1;-1:-1:-1::0;;;;;40447:19:0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;40447:19:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;40491:5:0::1;::::0;40503:6:::1;::::0;40511:12;;40482:42:::1;::::0;::::1;::::0;-1:-1:-1;40482:42:0::1;::::0;-1:-1:-1;;;;;40491:5:0::1;::::0;40498:3;;40503:6;;40482:42:::1;:::i;:::-;;;;;;;;40535:6;:8:::0;;;:6:::1;:8;::::0;::::1;:::i;:::-;;;;;;40106:445:::0;;;;:::o;24593:222::-;24665:7;24701:16;;;:7;:16;;;;;;-1:-1:-1;;;;;24701:16:0;24736:19;24728:56;;;;-1:-1:-1;;;24728:56:0;;11436:2:1;24728:56:0;;;11418:21:1;11475:2;11455:18;;;11448:30;-1:-1:-1;;;11494:18:1;;;11487:54;11558:18;;24728:56:0;11234:348:1;24324:207:0;24396:7;-1:-1:-1;;;;;24424:19:0;;24416:73;;;;-1:-1:-1;;;24416:73:0;;11789:2:1;24416:73:0;;;11771:21:1;11828:2;11808:18;;;11801:30;11867:34;11847:18;;;11840:62;-1:-1:-1;;;11918:18:1;;;11911:39;11967:19;;24416:73:0;11587:405:1;24416:73:0;-1:-1:-1;;;;;;24507:16:0;;;;;:9;:16;;;;;;;24324:207::o;25051:104::-;25107:13;25140:7;25133:14;;;;;:::i;1456:104::-;1510:10;1295:16;1304:6;1295:8;:16::i;:::-;1287:25;;;;;;1533:19:::1;1544:7;1533:10;:19::i;:::-;1456:104:::0;;:::o;1568:77::-;1612:25;1626:10;1612:13;:25::i;:::-;1568:77::o;26638:155::-;26733:52;5174:10;26766:8;26776;26733:18;:52::i;1340:108::-;1396:4;1420:20;:7;1432;1420:11;:20::i;27758:323::-;27932:41;5174:10;27965:7;27932:18;:41::i;:::-;27924:100;;;;-1:-1:-1;;;27924:100:0;;;;;;;:::i;:::-;28035:38;28049:4;28055:2;28059:7;28068:4;28035:13;:38::i;:::-;27758:323;;;;:::o;37663:624::-;37736:13;37762:23;37777:7;37762:14;:23::i;:::-;37798;37824:19;;;:10;:19;;;;;37798:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37854:18;37875:10;25833:9;;;;;;;;;-1:-1:-1;25833:9:0;;;25756:94;37875:10;37854:31;;37967:4;37961:18;37983:1;37961:23;37957:72;;;-1:-1:-1;38008:9:0;37663:624;-1:-1:-1;;37663:624:0:o;37957:72::-;38133:23;;:27;38129:108;;38208:4;38214:9;38191:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38177:48;;;;37663:624;;;:::o;38129:108::-;38256:23;38271:7;38256:14;:23::i;:::-;38249:30;37663:624;-1:-1:-1;;;;37663:624:0:o;301:135::-;-1:-1:-1;;;;;374:21:0;;366:30;;;;;;-1:-1:-1;;;;;403:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;403:27:0;426:4;403:27;;;301:135::o;34370:::-;29653:4;29677:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29677:16:0;34444:53;;;;-1:-1:-1;;;34444:53:0;;11436:2:1;34444:53:0;;;11418:21:1;11475:2;11455:18;;;11448:30;-1:-1:-1;;;11494:18:1;;;11487:54;11558:18;;34444:53:0;11234:348:1;34444:53:0;34370:135;:::o;33649:174::-;33724:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;33724:29:0;-1:-1:-1;;;;;33724:29:0;;;;;;;;:24;;33778:23;33724:24;33778:14;:23::i;:::-;-1:-1:-1;;;;;33769:46:0;;;;;;;;;;;33649:174;;:::o;29882:264::-;29975:4;29992:13;30008:23;30023:7;30008:14;:23::i;:::-;29992:39;;30061:5;-1:-1:-1;;;;;30050:16:0;:7;-1:-1:-1;;;;;30050:16:0;;:52;;;-1:-1:-1;;;;;;26985:25:0;;;26961:4;26985:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;30070:32;30050:87;;;;30130:7;-1:-1:-1;;;;;30106:31:0;:20;30118:7;30106:11;:20::i;:::-;-1:-1:-1;;;;;30106:31:0;;30042:96;29882:264;-1:-1:-1;;;;29882:264:0:o;40750:218::-;40890:5;;-1:-1:-1;;;;;40882:13:0;;;40890:5;;40882:13;40874:42;;;;-1:-1:-1;;;40874:42:0;;12674:2:1;40874:42:0;;;12656:21:1;12713:2;12693:18;;;12686:30;-1:-1:-1;;;12732:18:1;;;12725:46;12788:18;;40874:42:0;12472:340:1;40874:42:0;40927:33;40943:4;40949:2;40953:6;40927:15;:33::i;38885:206::-;38954:20;38966:7;38954:11;:20::i;:::-;38997:19;;;;:10;:19;;;;;38991:33;;;;;:::i;:::-;:38;;-1:-1:-1;38987:97:0;;39053:19;;;;:10;:19;;;;;39046:26;;;:::i;31480:439::-;-1:-1:-1;;;;;31560:16:0;;31552:61;;;;-1:-1:-1;;;31552:61:0;;13019:2:1;31552:61:0;;;13001:21:1;;;13038:18;;;13031:30;13097:34;13077:18;;;13070:62;13149:18;;31552:61:0;12817:356:1;31552:61:0;29653:4;29677:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29677:16:0;:30;31624:58;;;;-1:-1:-1;;;31624:58:0;;13380:2:1;31624:58:0;;;13362:21:1;13419:2;13399:18;;;13392:30;13458;13438:18;;;13431:58;13506:18;;31624:58:0;13178:352:1;31624:58:0;-1:-1:-1;;;;;31753:13:0;;;;;;:9;:13;;;;;:18;;31770:1;;31753:13;:18;;31770:1;;31753:18;:::i;:::-;;;;-1:-1:-1;;31782:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31782:21:0;-1:-1:-1;;;;;31782:21:0;;;;;;;;31821:33;;31782:16;;;31821:33;;31782:16;;31821:33;1456:104;;:::o;38443:217::-;29653:4;29677:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29677:16:0;38535:75;;;;-1:-1:-1;;;38535:75:0;;13870:2:1;38535:75:0;;;13852:21:1;13909:2;13889:18;;;13882:30;13948:34;13928:18;;;13921:62;-1:-1:-1;;;13999:18:1;;;13992:44;14053:19;;38535:75:0;13668:410:1;38535:75:0;38621:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;1653:121::-;1710:20;:7;1722;1710:11;:20::i;:::-;1746;;-1:-1:-1;;;;;1746:20:0;;;;;;;;1653:121;:::o;1782:129::-;1842:23;:7;1857;1842:14;:23::i;:::-;1881:22;;-1:-1:-1;;;;;1881:22:0;;;;;;;;1782:129;:::o;33966:315::-;34121:8;-1:-1:-1;;;;;34112:17:0;:5;-1:-1:-1;;;;;34112:17:0;;;34104:55;;;;-1:-1:-1;;;34104:55:0;;14285:2:1;34104:55:0;;;14267:21:1;14324:2;14304:18;;;14297:30;14363:27;14343:18;;;14336:55;14408:18;;34104:55:0;14083:349:1;34104:55:0;-1:-1:-1;;;;;34170:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;34170:46:0;;;;;;;;;;34232:41;;540::1;;;34232::0;;513:18:1;34232:41:0;;;;;;;33966:315;;;:::o;730:173::-;817:4;-1:-1:-1;;;;;841:21:0;;833:30;;;;;;-1:-1:-1;;;;;;877:20:0;:11;:20;;;;;;;;;;;;;;;730:173::o;28962:313::-;29118:28;29128:4;29134:2;29138:7;29118:9;:28::i;:::-;29165:47;29188:4;29194:2;29198:7;29207:4;29165:22;:47::i;:::-;29157:110;;;;-1:-1:-1;;;29157:110:0;;;;;;;:::i;25226:281::-;25299:13;25325:23;25340:7;25325:14;:23::i;:::-;25361:21;25385:10;25833:9;;;;;;;;;-1:-1:-1;25833:9:0;;;25756:94;25385:10;25361:34;;25437:1;25419:7;25413:21;:25;:86;;;;;;;;;;;;;;;;;25465:7;25474:18;:7;:16;:18::i;:::-;25448:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25413:86;25406:93;25226:281;-1:-1:-1;;;25226:281:0:o;32905:625::-;33064:4;-1:-1:-1;;;;;33037:31:0;:23;33052:7;33037:14;:23::i;:::-;-1:-1:-1;;;;;33037:31:0;;33029:81;;;;-1:-1:-1;;;33029:81:0;;15058:2:1;33029:81:0;;;15040:21:1;15097:2;15077:18;;;15070:30;15136:34;15116:18;;;15109:62;-1:-1:-1;;;15187:18:1;;;15180:35;15232:19;;33029:81:0;14856:401:1;33029:81:0;-1:-1:-1;;;;;33129:16:0;;33121:65;;;;-1:-1:-1;;;33121:65:0;;15464:2:1;33121:65:0;;;15446:21:1;15503:2;15483:18;;;15476:30;15542:34;15522:18;;;15515:62;-1:-1:-1;;;15593:18:1;;;15586:34;15637:19;;33121:65:0;15262:400:1;33121:65:0;33303:29;33320:1;33324:7;33303:8;:29::i;:::-;-1:-1:-1;;;;;33345:15:0;;;;;;:9;:15;;;;;:20;;33364:1;;33345:15;:20;;33364:1;;33345:20;:::i;:::-;;;;-1:-1:-1;;;;;;;33376:13:0;;;;;;:9;:13;;;;;:18;;33393:1;;33376:13;:18;;33393:1;;33376:18;:::i;:::-;;;;-1:-1:-1;;33405:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;33405:21:0;-1:-1:-1;;;;;33405:21:0;;;;;;;;;33444:27;;33405:16;;33444:27;;;;;;;25982:347;25912:417;;:::o;32148:420::-;32208:13;32224:23;32239:7;32224:14;:23::i;:::-;32208:39;;32349:29;32366:1;32370:7;32349:8;:29::i;:::-;-1:-1:-1;;;;;32391:16:0;;;;;;:9;:16;;;;;:21;;32411:1;;32391:16;:21;;32411:1;;32391:21;:::i;:::-;;;;-1:-1:-1;;32430:16:0;;;;:7;:16;;;;;;32423:23;;-1:-1:-1;;;;;;32423:23:0;;;32464:36;32438:7;;32430:16;-1:-1:-1;;;;;32464:36:0;;;;;32430:16;;32464:36;1456:104;;:::o;507:139::-;-1:-1:-1;;;;;583:21:0;;575:30;;;;;;-1:-1:-1;;;;;612:20:0;635:5;612:20;;;;;;;;;;;:28;;-1:-1:-1;;612:28:0;;;507:139::o;35069:853::-;35223:4;-1:-1:-1;;;;;35244:13:0;;6836:19;:23;35240:675;;35280:71;;-1:-1:-1;;;35280:71:0;;-1:-1:-1;;;;;35280:36:0;;;;;:71;;5174:10;;35331:4;;35337:7;;35346:4;;35280:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35280:71:0;;;;;;;;-1:-1:-1;;35280:71:0;;;;;;;;;;;;:::i;:::-;;;35276:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35521:13:0;;35517:328;;35564:60;;-1:-1:-1;;;35564:60:0;;;;;;;:::i;35517:328::-;35795:6;35789:13;35780:6;35776:2;35772:15;35765:38;35276:584;-1:-1:-1;;;;;;35402:51:0;-1:-1:-1;;;35402:51:0;;-1:-1:-1;35395:58:0;;35240:675;-1:-1:-1;35899:4:0;35069:853;;;;;;:::o;2348:723::-;2404:13;2625:10;2621:53;;-1:-1:-1;;2652:10:0;;;;;;;;;;;;-1:-1:-1;;;2652:10:0;;;;;2348:723::o;2621:53::-;2699:5;2684:12;2740:78;2747:9;;2740:78;;2773:8;;;;:::i;:::-;;-1:-1:-1;2796:10:0;;-1:-1:-1;2804:2:0;2796:10;;:::i;:::-;;;2740:78;;;2828:19;2860:6;2850:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2850:17:0;;2828:39;;2878:154;2885:10;;2878:154;;2912:11;2922:1;2912:11;;:::i;:::-;;-1:-1:-1;2981:10:0;2989:2;2981:5;:10;:::i;:::-;2968:24;;:2;:24;:::i;:::-;2955:39;;2938:6;2945;2938:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;2938:56:0;;;;;;;;-1:-1:-1;3009:11:0;3018:2;3009:11;;:::i;:::-;;;2878:154;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2355:328::-;2432:6;2440;2448;2501:2;2489:9;2480:7;2476:23;2472:32;2469:52;;;2517:1;2514;2507:12;2469:52;2540:29;2559:9;2540:29;:::i;:::-;2530:39;;2588:38;2622:2;2611:9;2607:18;2588:38;:::i;:::-;2578:48;;2673:2;2662:9;2658:18;2645:32;2635:42;;2355:328;;;;;:::o;2688:1373::-;3152:4;3181:3;3211:2;3200:9;3193:21;3237:45;3278:2;3267:9;3263:18;3255:6;3237:45;:::i;:::-;3223:59;;3330:9;3322:6;3318:22;3313:2;3302:9;3298:18;3291:50;3364:33;3390:6;3382;3364:33;:::i;:::-;3350:47;;3433:6;3428:2;3417:9;3413:18;3406:34;3488:9;3480:6;3476:22;3471:2;3460:9;3456:18;3449:50;3522:33;3548:6;3540;3522:33;:::i;:::-;3508:47;;3592:6;3586:3;3575:9;3571:19;3564:35;3648:9;3640:6;3636:22;3630:3;3619:9;3615:19;3608:51;3682:33;3708:6;3700;3682:33;:::i;:::-;-1:-1:-1;;;;;3752:32:1;;3746:3;3731:19;;3724:61;3816:3;3801:19;;3794:35;;;3866:22;;;3860:3;3845:19;;3838:51;3668:47;-1:-1:-1;3912:33:1;3668:47;3930:6;3912:33;:::i;:::-;3898:47;;3994:9;3986:6;3982:22;3976:3;3965:9;3961:19;3954:51;4022:33;4048:6;4040;4022:33;:::i;:::-;4014:41;2688:1373;-1:-1:-1;;;;;;;;;;;;;2688:1373:1:o;4066:127::-;4127:10;4122:3;4118:20;4115:1;4108:31;4158:4;4155:1;4148:15;4182:4;4179:1;4172:15;4198:250;4265:2;4259:9;4307:6;4295:19;;4344:18;4329:34;;4365:22;;;4326:62;4323:88;;;4391:18;;:::i;:::-;4427:2;4420:22;4198:250;:::o;4453:632::-;4518:5;4548:18;4589:2;4581:6;4578:14;4575:40;;;4595:18;;:::i;:::-;4670:2;4664:9;4638:2;4724:15;;-1:-1:-1;;4720:24:1;;;4746:2;4716:33;4712:42;4700:55;;;4770:18;;;4790:22;;;4767:46;4764:72;;;4816:18;;:::i;:::-;4856:10;4852:2;4845:22;4885:6;4876:15;;4915:6;4907;4900:22;4955:3;4946:6;4941:3;4937:16;4934:25;4931:45;;;4972:1;4969;4962:12;4931:45;5022:6;5017:3;5010:4;5002:6;4998:17;4985:44;5077:1;5070:4;5061:6;5053;5049:19;5045:30;5038:41;;;;4453:632;;;;;:::o;5090:222::-;5133:5;5186:3;5179:4;5171:6;5167:17;5163:27;5153:55;;5204:1;5201;5194:12;5153:55;5226:80;5302:3;5293:6;5280:20;5273:4;5265:6;5261:17;5226:80;:::i;5317:2031::-;5425:6;5433;5441;5494:2;5482:9;5473:7;5469:23;5465:32;5462:52;;;5510:1;5507;5500:12;5462:52;5533:29;5552:9;5533:29;:::i;:::-;5523:39;;5613:2;5602:9;5598:18;5585:32;5636:18;5677:2;5669:6;5666:14;5663:34;;;5693:1;5690;5683:12;5663:34;5716:22;;;;5772:6;5754:16;;;5750:29;5747:49;;;5792:1;5789;5782:12;5747:49;5818:17;;:::i;:::-;5873:2;5860:16;5901:2;5891:8;5888:16;5885:36;;;5917:1;5914;5907:12;5885:36;5944:45;5981:7;5970:8;5966:2;5962:17;5944:45;:::i;:::-;5937:5;5930:60;;6036:2;6032;6028:11;6015:25;6065:2;6055:8;6052:16;6049:36;;;6081:1;6078;6071:12;6049:36;6117:45;6154:7;6143:8;6139:2;6135:17;6117:45;:::i;:::-;6112:2;6105:5;6101:14;6094:69;;6216:2;6212;6208:11;6195:25;6190:2;6183:5;6179:14;6172:49;6267:2;6263;6259:11;6246:25;6296:2;6286:8;6283:16;6280:36;;;6312:1;6309;6302:12;6280:36;6348:45;6385:7;6374:8;6370:2;6366:17;6348:45;:::i;:::-;6343:2;6336:5;6332:14;6325:69;;6448:3;6444:2;6440:12;6427:26;6421:3;6414:5;6410:15;6403:51;6500:3;6496:2;6492:12;6479:26;6530:2;6520:8;6517:16;6514:36;;;6546:1;6543;6536:12;6514:36;6583:45;6620:7;6609:8;6605:2;6601:17;6583:45;:::i;:::-;6577:3;6570:5;6566:15;6559:70;;6662:32;6689:3;6685:2;6681:12;6662:32;:::i;:::-;6656:3;6649:5;6645:15;6638:57;6749:3;6745:2;6741:12;6728:26;6722:3;6715:5;6711:15;6704:51;6774:3;6823:2;6819;6815:11;6802:25;6852:2;6842:8;6839:16;6836:36;;;6868:1;6865;6858:12;6836:36;6904:45;6941:7;6930:8;6926:2;6922:17;6904:45;:::i;:::-;6899:2;6892:5;6888:14;6881:69;;;6969:3;7018:2;7014;7010:11;6997:25;7047:2;7037:8;7034:16;7031:36;;;7063:1;7060;7053:12;7031:36;7099:45;7136:7;7125:8;7121:2;7117:17;7099:45;:::i;:::-;7094:2;7087:5;7083:14;7076:69;;;7164:5;7154:15;;;7222:2;7211:9;7207:18;7194:32;7178:48;;7251:2;7241:8;7238:16;7235:36;;;7267:1;7264;7257:12;7235:36;;7290:52;7334:7;7323:8;7312:9;7308:24;7290:52;:::i;:::-;7280:62;;;5317:2031;;;;;:::o;7353:186::-;7412:6;7465:2;7453:9;7444:7;7440:23;7436:32;7433:52;;;7481:1;7478;7471:12;7433:52;7504:29;7523:9;7504:29;:::i;7544:347::-;7609:6;7617;7670:2;7658:9;7649:7;7645:23;7641:32;7638:52;;;7686:1;7683;7676:12;7638:52;7709:29;7728:9;7709:29;:::i;:::-;7699:39;;7788:2;7777:9;7773:18;7760:32;7835:5;7828:13;7821:21;7814:5;7811:32;7801:60;;7857:1;7854;7847:12;7801:60;7880:5;7870:15;;;7544:347;;;;;:::o;7896:667::-;7991:6;7999;8007;8015;8068:3;8056:9;8047:7;8043:23;8039:33;8036:53;;;8085:1;8082;8075:12;8036:53;8108:29;8127:9;8108:29;:::i;:::-;8098:39;;8156:38;8190:2;8179:9;8175:18;8156:38;:::i;:::-;8146:48;;8241:2;8230:9;8226:18;8213:32;8203:42;;8296:2;8285:9;8281:18;8268:32;8323:18;8315:6;8312:30;8309:50;;;8355:1;8352;8345:12;8309:50;8378:22;;8431:4;8423:13;;8419:27;-1:-1:-1;8409:55:1;;8460:1;8457;8450:12;8409:55;8483:74;8549:7;8544:2;8531:16;8526:2;8522;8518:11;8483:74;:::i;:::-;8473:84;;;7896:667;;;;;;;:::o;8568:260::-;8636:6;8644;8697:2;8685:9;8676:7;8672:23;8668:32;8665:52;;;8713:1;8710;8703:12;8665:52;8736:29;8755:9;8736:29;:::i;:::-;8726:39;;8784:38;8818:2;8807:9;8803:18;8784:38;:::i;:::-;8774:48;;8568:260;;;;;:::o;8833:380::-;8912:1;8908:12;;;;8955;;;8976:61;;9030:4;9022:6;9018:17;9008:27;;8976:61;9083:2;9075:6;9072:14;9052:18;9049:38;9046:161;;;9129:10;9124:3;9120:20;9117:1;9110:31;9164:4;9161:1;9154:15;9192:4;9189:1;9182:15;9046:161;;8833:380;;;:::o;10051:410::-;10253:2;10235:21;;;10292:2;10272:18;;;10265:30;10331:34;10326:2;10311:18;;10304:62;-1:-1:-1;;;10397:2:1;10382:18;;10375:44;10451:3;10436:19;;10051:410::o;10466:491::-;-1:-1:-1;;;;;10737:15:1;;;10719:34;;10789:15;;10784:2;10769:18;;10762:43;10836:2;10821:18;;10814:34;;;10884:3;10879:2;10864:18;;10857:31;;;10662:4;;10905:46;;10931:19;;10923:6;10905:46;:::i;:::-;10897:54;10466:491;-1:-1:-1;;;;;;10466:491:1:o;10962:127::-;11023:10;11018:3;11014:20;11011:1;11004:31;11054:4;11051:1;11044:15;11078:4;11075:1;11068:15;11094:135;11133:3;-1:-1:-1;;11154:17:1;;11151:43;;;11174:18;;:::i;:::-;-1:-1:-1;11221:1:1;11210:13;;11094:135::o;11997:470::-;12176:3;12214:6;12208:13;12230:53;12276:6;12271:3;12264:4;12256:6;12252:17;12230:53;:::i;:::-;12346:13;;12305:16;;;;12368:57;12346:13;12305:16;12402:4;12390:17;;12368:57;:::i;:::-;12441:20;;11997:470;-1:-1:-1;;;;11997:470:1:o;13535:128::-;13575:3;13606:1;13602:6;13599:1;13596:13;13593:39;;;13612:18;;:::i;:::-;-1:-1:-1;13648:9:1;;13535:128::o;14437:414::-;14639:2;14621:21;;;14678:2;14658:18;;;14651:30;14717:34;14712:2;14697:18;;14690:62;-1:-1:-1;;;14783:2:1;14768:18;;14761:48;14841:3;14826:19;;14437:414::o;15667:125::-;15707:4;15735:1;15732;15729:8;15726:34;;;15740:18;;:::i;:::-;-1:-1:-1;15777:9:1;;15667:125::o;16291:249::-;16360:6;16413:2;16401:9;16392:7;16388:23;16384:32;16381:52;;;16429:1;16426;16419:12;16381:52;16461:9;16455:16;16480:30;16504:5;16480:30;:::i;16545:127::-;16606:10;16601:3;16597:20;16594:1;16587:31;16637:4;16634:1;16627:15;16661:4;16658:1;16651:15;16677:120;16717:1;16743;16733:35;;16748:18;;:::i;:::-;-1:-1:-1;16782:9:1;;16677:120::o;16802:112::-;16834:1;16860;16850:35;;16865:18;;:::i;:::-;-1:-1:-1;16899:9:1;;16802:112::o;16919:127::-;16980:10;16975:3;16971:20;16968:1;16961:31;17011:4;17008:1;17001:15;17035:4;17032:1;17025:15

Swarm Source

ipfs://6b8d5735ac6adcff1a41d012317a9abc5b50e025c479fa03ad26c2487b563446
Loading