Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
5,462 BRWS
Holders
3,142
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 BRWSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BrwsNFT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-01-18 */ // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // 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/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (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 `IERC721.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 v4.4.1 (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`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @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 v4.4.1 (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: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _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: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {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 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 { 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 {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: BrwsNFT.sol pragma solidity ^0.8.2; contract BrwsNFT is ERC721, ERC721Enumerable, Pausable, Ownable { uint public constant MAX_SUPPLY = 5555; uint public constant MAX_PUBLIC = 5305; uint public constant RESERVED = 250; uint _price = 169000000000000000; mapping (address => uint8) private _freeMintAddresses; mapping (address => bool) private _freeMintAddressesClaimed; using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; constructor() ERC721("BrwsNFT", "BRWS") {} function _baseURI() internal pure override returns (string memory) { return "https://cybermole.club/meta/"; } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function mint(uint _count) public payable whenNotPaused { require(totalSupply() + _count <= MAX_PUBLIC, "BrwsNFT: Not enough left to mint"); require(totalSupply() < MAX_PUBLIC, "BrwsNFT: Not enough left to mint"); require(_count <= 3, "BrwsNFT: Exceeds the max you can mint"); require(msg.value >= price(_count), "BrwsNFT: Value below price"); for (uint x = 0; x < _count; x++) { _tokenIdCounter.increment(); _safeMint(msg.sender, _tokenIdCounter.current()); } } function claim() public whenNotPaused { require(isInFreeMint(msg.sender) > 0, "BrwsNFT: You are not eligible for a free mint"); require(isInFreeMintClaimed(msg.sender) == false, "BrwsNFT: You already claimed a free mint"); for (uint x = 0; x < isInFreeMint(msg.sender); x++) { _tokenIdCounter.increment(); _safeMint(msg.sender, _tokenIdCounter.current()); } _freeMintAddressesClaimed[msg.sender] = true; } function price(uint _count) public view returns (uint256) { return _price * _count; } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal whenNotPaused override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function addFreeMintAddresses(address[] calldata _addresses, uint8[] calldata _amounts) public onlyOwner { for (uint x = 0; x < _addresses.length; x++) { _freeMintAddresses[_addresses[x]] = _amounts[x]; } } function removeFreeMintAddresses(address[] calldata _addresses) public onlyOwner { for (uint x = 0; x < _addresses.length; x++) { _freeMintAddresses[_addresses[x]] = 0; } } function isInFreeMint(address _address) public view returns (uint8) { return _freeMintAddresses[_address]; } function isInFreeMintClaimed(address _address) public view returns (bool) { return _freeMintAddressesClaimed[_address]; } // The following functions are overrides required by Solidity. function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } function getReserves() public onlyOwner { require(totalSupply() + 35 <= MAX_SUPPLY, "BrwsNFT: Not enough left to mint"); for (uint x = 0; x < 35; x++) { _tokenIdCounter.increment(); _safeMint(msg.sender, _tokenIdCounter.current()); } } function withdrawAll() public payable onlyOwner { require(payable(_msgSender()).send(address(this).balance)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint8[]","name":"_amounts","type":"uint8[]"}],"name":"addFreeMintAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","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":[],"name":"getReserves","outputs":[],"stateMutability":"nonpayable","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":"_address","type":"address"}],"name":"isInFreeMint","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isInFreeMintClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"removeFreeMintAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
6080604052670258689ac70a8000600b553480156200001d57600080fd5b506040518060400160405280600781526020017f427277734e4654000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f42525753000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000a2929190620001cd565b508060019080519060200190620000bb929190620001cd565b5050506000600a60006101000a81548160ff021916908315150217905550620000f9620000ed620000ff60201b60201c565b6200010760201b60201c565b620002e2565b600033905090565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001db906200027d565b90600052602060002090601f016020900481019282620001ff57600085556200024b565b82601f106200021a57805160ff19168380011785556200024b565b828001600101855582156200024b579182015b828111156200024a5782518255916020019190600101906200022d565b5b5090506200025a91906200025e565b5090565b5b80821115620002795760008160009055506001016200025f565b5090565b600060028204905060018216806200029657607f821691505b60208210811415620002ad57620002ac620002b3565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6147c380620002f26000396000f3fe6080604052600436106101f95760003560e01c80636352211e1161010d578063a0712d68116100a0578063c87b56dd1161006f578063c87b56dd146106e1578063dc0e50071461071e578063e985e9c514610747578063f2fde38b14610784578063fb053e81146107ad576101f9565b8063a0712d6814610648578063a22cb46514610664578063aa592f251461068d578063b88d4fde146106b8576101f9565b8063853828b6116100dc578063853828b6146105bd5780638da5cb5b146105c757806395d89b41146105f25780639753eac01461061d576101f9565b80636352211e1461051557806370a0823114610552578063715018a61461058f5780638456cb59146105a6576101f9565b806326a49e371161019057806342842e0e1161015f57806342842e0e146104305780634e71d92d146104595780634f6ccce7146104705780635a4c6210146104ad5780635c975abb146104ea576101f9565b806326a49e37146103745780632f745c59146103b157806332cb6b0c146103ee5780633f4ba83a14610419576101f9565b80630902f1ac116101cc5780630902f1ac146102e0578063095ea7b3146102f757806318160ddd1461032057806323b872dd1461034b576101f9565b806301ffc9a7146101fe57806306815dcf1461023b57806306fdde0314610278578063081812fc146102a3575b600080fd5b34801561020a57600080fd5b50610225600480360381019061022091906132e0565b6107d6565b6040516102329190613869565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d919061304f565b6107e8565b60405161026f9190613869565b60405180910390f35b34801561028457600080fd5b5061028d61083e565b60405161029a9190613884565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c5919061333a565b6108d0565b6040516102d79190613802565b60405180910390f35b3480156102ec57600080fd5b506102f5610955565b005b34801561030357600080fd5b5061031e600480360381019061031991906131d2565b610a68565b005b34801561032c57600080fd5b50610335610b80565b6040516103429190613bc6565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d91906130bc565b610b8d565b005b34801561038057600080fd5b5061039b6004803603810190610396919061333a565b610bed565b6040516103a89190613bc6565b60405180910390f35b3480156103bd57600080fd5b506103d860048036038101906103d391906131d2565b610c04565b6040516103e59190613bc6565b60405180910390f35b3480156103fa57600080fd5b50610403610ca9565b6040516104109190613bc6565b60405180910390f35b34801561042557600080fd5b5061042e610caf565b005b34801561043c57600080fd5b50610457600480360381019061045291906130bc565b610d35565b005b34801561046557600080fd5b5061046e610d55565b005b34801561047c57600080fd5b506104976004803603810190610492919061333a565b610edb565b6040516104a49190613bc6565b60405180910390f35b3480156104b957600080fd5b506104d460048036038101906104cf919061304f565b610f4c565b6040516104e19190613be1565b60405180910390f35b3480156104f657600080fd5b506104ff610fa2565b60405161050c9190613869565b60405180910390f35b34801561052157600080fd5b5061053c6004803603810190610537919061333a565b610fb9565b6040516105499190613802565b60405180910390f35b34801561055e57600080fd5b506105796004803603810190610574919061304f565b61106b565b6040516105869190613bc6565b60405180910390f35b34801561059b57600080fd5b506105a4611123565b005b3480156105b257600080fd5b506105bb6111ab565b005b6105c5611231565b005b3480156105d357600080fd5b506105dc6112f4565b6040516105e99190613802565b60405180910390f35b3480156105fe57600080fd5b5061060761131e565b6040516106149190613884565b60405180910390f35b34801561062957600080fd5b506106326113b0565b60405161063f9190613bc6565b60405180910390f35b610662600480360381019061065d919061333a565b6113b6565b005b34801561067057600080fd5b5061068b60048036038101906106869190613192565b61156e565b005b34801561069957600080fd5b506106a2611584565b6040516106af9190613bc6565b60405180910390f35b3480156106c457600080fd5b506106df60048036038101906106da919061310f565b611589565b005b3480156106ed57600080fd5b506107086004803603810190610703919061333a565b6115eb565b6040516107159190613884565b60405180910390f35b34801561072a57600080fd5b506107456004803603810190610740919061325f565b611692565b005b34801561075357600080fd5b5061076e6004803603810190610769919061307c565b6117dc565b60405161077b9190613869565b60405180910390f35b34801561079057600080fd5b506107ab60048036038101906107a6919061304f565b611870565b005b3480156107b957600080fd5b506107d460048036038101906107cf9190613212565b611968565b005b60006107e182611a8a565b9050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60606000805461084d90613e6d565b80601f016020809104026020016040519081016040528092919081815260200182805461087990613e6d565b80156108c65780601f1061089b576101008083540402835291602001916108c6565b820191906000526020600020905b8154815290600101906020018083116108a957829003601f168201915b5050505050905090565b60006108db82611b04565b61091a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091190613ac6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61095d611b70565b73ffffffffffffffffffffffffffffffffffffffff1661097b6112f4565b73ffffffffffffffffffffffffffffffffffffffff16146109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c890613ae6565b60405180910390fd5b6115b360236109de610b80565b6109e89190613c95565b1115610a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2090613926565b60405180910390fd5b60005b6023811015610a6557610a3f600e611b78565b610a5233610a4d600e611b8e565b611b9c565b8080610a5d90613ed0565b915050610a2c565b50565b6000610a7382610fb9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adb90613b46565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b03611b70565b73ffffffffffffffffffffffffffffffffffffffff161480610b325750610b3181610b2c611b70565b6117dc565b5b610b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6890613a46565b60405180910390fd5b610b7b8383611bba565b505050565b6000600880549050905090565b610b9e610b98611b70565b82611c73565b610bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd490613b86565b60405180910390fd5b610be8838383611d51565b505050565b600081600b54610bfd9190613d1c565b9050919050565b6000610c0f8361106b565b8210610c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c47906138c6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6115b381565b610cb7611b70565b73ffffffffffffffffffffffffffffffffffffffff16610cd56112f4565b73ffffffffffffffffffffffffffffffffffffffff1614610d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2290613ae6565b60405180910390fd5b610d33611fad565b565b610d5083838360405180602001604052806000815250611589565b505050565b610d5d610fa2565b15610d9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9490613a06565b60405180910390fd5b6000610da833610f4c565b60ff1611610deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de290613a26565b60405180910390fd5b60001515610df8336107e8565b151514610e3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3190613966565b60405180910390fd5b60005b610e4633610f4c565b60ff16811015610e8057610e5a600e611b78565b610e6d33610e68600e611b8e565b611b9c565b8080610e7890613ed0565b915050610e3d565b506001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550565b6000610ee5610b80565b8210610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d90613ba6565b60405180910390fd5b60088281548110610f3a57610f39614006565b5b90600052602060002001549050919050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600a60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611062576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105990613a86565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d390613a66565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61112b611b70565b73ffffffffffffffffffffffffffffffffffffffff166111496112f4565b73ffffffffffffffffffffffffffffffffffffffff161461119f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119690613ae6565b60405180910390fd5b6111a9600061204f565b565b6111b3611b70565b73ffffffffffffffffffffffffffffffffffffffff166111d16112f4565b73ffffffffffffffffffffffffffffffffffffffff1614611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121e90613ae6565b60405180910390fd5b61122f612115565b565b611239611b70565b73ffffffffffffffffffffffffffffffffffffffff166112576112f4565b73ffffffffffffffffffffffffffffffffffffffff16146112ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a490613ae6565b60405180910390fd5b6112b5611b70565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506112f257600080fd5b565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461132d90613e6d565b80601f016020809104026020016040519081016040528092919081815260200182805461135990613e6d565b80156113a65780601f1061137b576101008083540402835291602001916113a6565b820191906000526020600020905b81548152906001019060200180831161138957829003601f168201915b5050505050905090565b6114b981565b6113be610fa2565b156113fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f590613a06565b60405180910390fd5b6114b98161140a610b80565b6114149190613c95565b1115611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c90613926565b60405180910390fd5b6114b9611460610b80565b106114a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149790613926565b60405180910390fd5b60038111156114e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114db90613b66565b60405180910390fd5b6114ed81610bed565b34101561152f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611526906139e6565b60405180910390fd5b60005b8181101561156a57611544600e611b78565b61155733611552600e611b8e565b611b9c565b808061156290613ed0565b915050611532565b5050565b611580611579611b70565b83836121b8565b5050565b60fa81565b61159a611594611b70565b83611c73565b6115d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d090613b86565b60405180910390fd5b6115e584848484612325565b50505050565b60606115f682611b04565b611635576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162c90613b26565b60405180910390fd5b600061163f612381565b9050600081511161165f576040518060200160405280600081525061168a565b80611669846123be565b60405160200161167a9291906137de565b6040516020818303038152906040525b915050919050565b61169a611b70565b73ffffffffffffffffffffffffffffffffffffffff166116b86112f4565b73ffffffffffffffffffffffffffffffffffffffff161461170e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170590613ae6565b60405180910390fd5b60005b848490508110156117d55782828281811061172f5761172e614006565b5b90506020020160208101906117449190613367565b600c600087878581811061175b5761175a614006565b5b9050602002016020810190611770919061304f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555080806117cd90613ed0565b915050611711565b5050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611878611b70565b73ffffffffffffffffffffffffffffffffffffffff166118966112f4565b73ffffffffffffffffffffffffffffffffffffffff16146118ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e390613ae6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561195c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195390613906565b60405180910390fd5b6119658161204f565b50565b611970611b70565b73ffffffffffffffffffffffffffffffffffffffff1661198e6112f4565b73ffffffffffffffffffffffffffffffffffffffff16146119e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119db90613ae6565b60405180910390fd5b60005b82829050811015611a85576000600c6000858585818110611a0b57611a0a614006565b5b9050602002016020810190611a20919061304f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080611a7d90613ed0565b9150506119e7565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611afd5750611afc8261251f565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b6001816000016000828254019250508190555050565b600081600001549050919050565b611bb6828260405180602001604052806000815250612601565b5050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611c2d83610fb9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c7e82611b04565b611cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb4906139c6565b60405180910390fd5b6000611cc883610fb9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d3757508373ffffffffffffffffffffffffffffffffffffffff16611d1f846108d0565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d485750611d4781856117dc565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d7182610fb9565b73ffffffffffffffffffffffffffffffffffffffff1614611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90613b06565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2e90613986565b60405180910390fd5b611e4283838361265c565b611e4d600082611bba565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e9d9190613d76565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ef49190613c95565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611fb5610fa2565b611ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611feb906138a6565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612038611b70565b6040516120459190613802565b60405180910390a1565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61211d610fa2565b1561215d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215490613a06565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586121a1611b70565b6040516121ae9190613802565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221e906139a6565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123189190613869565b60405180910390a3505050565b612330848484611d51565b61233c848484846126b4565b61237b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612372906138e6565b60405180910390fd5b50505050565b60606040518060400160405280601c81526020017f68747470733a2f2f63796265726d6f6c652e636c75622f6d6574612f00000000815250905090565b60606000821415612406576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061251a565b600082905060005b6000821461243857808061242190613ed0565b915050600a826124319190613ceb565b915061240e565b60008167ffffffffffffffff81111561245457612453614035565b5b6040519080825280601f01601f1916602001820160405280156124865781602001600182028036833780820191505090505b5090505b600085146125135760018261249f9190613d76565b9150600a856124ae9190613f19565b60306124ba9190613c95565b60f81b8183815181106124d0576124cf614006565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561250c9190613ceb565b945061248a565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125ea57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806125fa57506125f98261284b565b5b9050919050565b61260b83836128b5565b61261860008484846126b4565b612657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264e906138e6565b60405180910390fd5b505050565b612664610fa2565b156126a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269b90613a06565b60405180910390fd5b6126af838383612a83565b505050565b60006126d58473ffffffffffffffffffffffffffffffffffffffff16612b97565b1561283e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126fe611b70565b8786866040518563ffffffff1660e01b8152600401612720949392919061381d565b602060405180830381600087803b15801561273a57600080fd5b505af192505050801561276b57506040513d601f19601f82011682018060405250810190612768919061330d565b60015b6127ee573d806000811461279b576040519150601f19603f3d011682016040523d82523d6000602084013e6127a0565b606091505b506000815114156127e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127dd906138e6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612843565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291c90613aa6565b60405180910390fd5b61292e81611b04565b1561296e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296590613946565b60405180910390fd5b61297a6000838361265c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129ca9190613c95565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612a8e838383612baa565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ad157612acc81612baf565b612b10565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612b0f57612b0e8382612bf8565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b5357612b4e81612d65565b612b92565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612b9157612b908282612e36565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c058461106b565b612c0f9190613d76565b9050600060076000848152602001908152602001600020549050818114612cf4576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612d799190613d76565b9050600060096000848152602001908152602001600020549050600060088381548110612da957612da8614006565b5b906000526020600020015490508060088381548110612dcb57612dca614006565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e1a57612e19613fd7565b5b6001900381819060005260206000200160009055905550505050565b6000612e418361106b565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000612ec8612ec384613c21565b613bfc565b905082815260208101848484011115612ee457612ee3614073565b5b612eef848285613e2b565b509392505050565b600081359050612f068161471a565b92915050565b60008083601f840112612f2257612f21614069565b5b8235905067ffffffffffffffff811115612f3f57612f3e614064565b5b602083019150836020820283011115612f5b57612f5a61406e565b5b9250929050565b60008083601f840112612f7857612f77614069565b5b8235905067ffffffffffffffff811115612f9557612f94614064565b5b602083019150836020820283011115612fb157612fb061406e565b5b9250929050565b600081359050612fc781614731565b92915050565b600081359050612fdc81614748565b92915050565b600081519050612ff181614748565b92915050565b600082601f83011261300c5761300b614069565b5b813561301c848260208601612eb5565b91505092915050565b6000813590506130348161475f565b92915050565b60008135905061304981614776565b92915050565b6000602082840312156130655761306461407d565b5b600061307384828501612ef7565b91505092915050565b600080604083850312156130935761309261407d565b5b60006130a185828601612ef7565b92505060206130b285828601612ef7565b9150509250929050565b6000806000606084860312156130d5576130d461407d565b5b60006130e386828701612ef7565b93505060206130f486828701612ef7565b925050604061310586828701613025565b9150509250925092565b600080600080608085870312156131295761312861407d565b5b600061313787828801612ef7565b945050602061314887828801612ef7565b935050604061315987828801613025565b925050606085013567ffffffffffffffff81111561317a57613179614078565b5b61318687828801612ff7565b91505092959194509250565b600080604083850312156131a9576131a861407d565b5b60006131b785828601612ef7565b92505060206131c885828601612fb8565b9150509250929050565b600080604083850312156131e9576131e861407d565b5b60006131f785828601612ef7565b925050602061320885828601613025565b9150509250929050565b600080602083850312156132295761322861407d565b5b600083013567ffffffffffffffff81111561324757613246614078565b5b61325385828601612f0c565b92509250509250929050565b600080600080604085870312156132795761327861407d565b5b600085013567ffffffffffffffff81111561329757613296614078565b5b6132a387828801612f0c565b9450945050602085013567ffffffffffffffff8111156132c6576132c5614078565b5b6132d287828801612f62565b925092505092959194509250565b6000602082840312156132f6576132f561407d565b5b600061330484828501612fcd565b91505092915050565b6000602082840312156133235761332261407d565b5b600061333184828501612fe2565b91505092915050565b6000602082840312156133505761334f61407d565b5b600061335e84828501613025565b91505092915050565b60006020828403121561337d5761337c61407d565b5b600061338b8482850161303a565b91505092915050565b61339d81613daa565b82525050565b6133ac81613dbc565b82525050565b60006133bd82613c52565b6133c78185613c68565b93506133d7818560208601613e3a565b6133e081614082565b840191505092915050565b60006133f682613c5d565b6134008185613c79565b9350613410818560208601613e3a565b61341981614082565b840191505092915050565b600061342f82613c5d565b6134398185613c8a565b9350613449818560208601613e3a565b80840191505092915050565b6000613462601483613c79565b915061346d82614093565b602082019050919050565b6000613485602b83613c79565b9150613490826140bc565b604082019050919050565b60006134a8603283613c79565b91506134b38261410b565b604082019050919050565b60006134cb602683613c79565b91506134d68261415a565b604082019050919050565b60006134ee602083613c79565b91506134f9826141a9565b602082019050919050565b6000613511601c83613c79565b915061351c826141d2565b602082019050919050565b6000613534602883613c79565b915061353f826141fb565b604082019050919050565b6000613557602483613c79565b91506135628261424a565b604082019050919050565b600061357a601983613c79565b915061358582614299565b602082019050919050565b600061359d602c83613c79565b91506135a8826142c2565b604082019050919050565b60006135c0601a83613c79565b91506135cb82614311565b602082019050919050565b60006135e3601083613c79565b91506135ee8261433a565b602082019050919050565b6000613606602d83613c79565b915061361182614363565b604082019050919050565b6000613629603883613c79565b9150613634826143b2565b604082019050919050565b600061364c602a83613c79565b915061365782614401565b604082019050919050565b600061366f602983613c79565b915061367a82614450565b604082019050919050565b6000613692602083613c79565b915061369d8261449f565b602082019050919050565b60006136b5602c83613c79565b91506136c0826144c8565b604082019050919050565b60006136d8602083613c79565b91506136e382614517565b602082019050919050565b60006136fb602983613c79565b915061370682614540565b604082019050919050565b600061371e602f83613c79565b91506137298261458f565b604082019050919050565b6000613741602183613c79565b915061374c826145de565b604082019050919050565b6000613764602583613c79565b915061376f8261462d565b604082019050919050565b6000613787603183613c79565b91506137928261467c565b604082019050919050565b60006137aa602c83613c79565b91506137b5826146cb565b604082019050919050565b6137c981613e14565b82525050565b6137d881613e1e565b82525050565b60006137ea8285613424565b91506137f68284613424565b91508190509392505050565b60006020820190506138176000830184613394565b92915050565b60006080820190506138326000830187613394565b61383f6020830186613394565b61384c60408301856137c0565b818103606083015261385e81846133b2565b905095945050505050565b600060208201905061387e60008301846133a3565b92915050565b6000602082019050818103600083015261389e81846133eb565b905092915050565b600060208201905081810360008301526138bf81613455565b9050919050565b600060208201905081810360008301526138df81613478565b9050919050565b600060208201905081810360008301526138ff8161349b565b9050919050565b6000602082019050818103600083015261391f816134be565b9050919050565b6000602082019050818103600083015261393f816134e1565b9050919050565b6000602082019050818103600083015261395f81613504565b9050919050565b6000602082019050818103600083015261397f81613527565b9050919050565b6000602082019050818103600083015261399f8161354a565b9050919050565b600060208201905081810360008301526139bf8161356d565b9050919050565b600060208201905081810360008301526139df81613590565b9050919050565b600060208201905081810360008301526139ff816135b3565b9050919050565b60006020820190508181036000830152613a1f816135d6565b9050919050565b60006020820190508181036000830152613a3f816135f9565b9050919050565b60006020820190508181036000830152613a5f8161361c565b9050919050565b60006020820190508181036000830152613a7f8161363f565b9050919050565b60006020820190508181036000830152613a9f81613662565b9050919050565b60006020820190508181036000830152613abf81613685565b9050919050565b60006020820190508181036000830152613adf816136a8565b9050919050565b60006020820190508181036000830152613aff816136cb565b9050919050565b60006020820190508181036000830152613b1f816136ee565b9050919050565b60006020820190508181036000830152613b3f81613711565b9050919050565b60006020820190508181036000830152613b5f81613734565b9050919050565b60006020820190508181036000830152613b7f81613757565b9050919050565b60006020820190508181036000830152613b9f8161377a565b9050919050565b60006020820190508181036000830152613bbf8161379d565b9050919050565b6000602082019050613bdb60008301846137c0565b92915050565b6000602082019050613bf660008301846137cf565b92915050565b6000613c06613c17565b9050613c128282613e9f565b919050565b6000604051905090565b600067ffffffffffffffff821115613c3c57613c3b614035565b5b613c4582614082565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613ca082613e14565b9150613cab83613e14565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ce057613cdf613f4a565b5b828201905092915050565b6000613cf682613e14565b9150613d0183613e14565b925082613d1157613d10613f79565b5b828204905092915050565b6000613d2782613e14565b9150613d3283613e14565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d6b57613d6a613f4a565b5b828202905092915050565b6000613d8182613e14565b9150613d8c83613e14565b925082821015613d9f57613d9e613f4a565b5b828203905092915050565b6000613db582613df4565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613e58578082015181840152602081019050613e3d565b83811115613e67576000848401525b50505050565b60006002820490506001821680613e8557607f821691505b60208210811415613e9957613e98613fa8565b5b50919050565b613ea882614082565b810181811067ffffffffffffffff82111715613ec757613ec6614035565b5b80604052505050565b6000613edb82613e14565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f0e57613f0d613f4a565b5b600182019050919050565b6000613f2482613e14565b9150613f2f83613e14565b925082613f3f57613f3e613f79565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f427277734e46543a204e6f7420656e6f756768206c65667420746f206d696e74600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f427277734e46543a20596f7520616c726561647920636c61696d65642061206660008201527f726565206d696e74000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f427277734e46543a2056616c75652062656c6f77207072696365000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f427277734e46543a20596f7520617265206e6f7420656c696769626c6520666f60008201527f7220612066726565206d696e7400000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f427277734e46543a204578636565647320746865206d617820796f752063616e60008201527f206d696e74000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61472381613daa565b811461472e57600080fd5b50565b61473a81613dbc565b811461474557600080fd5b50565b61475181613dc8565b811461475c57600080fd5b50565b61476881613e14565b811461477357600080fd5b50565b61477f81613e1e565b811461478a57600080fd5b5056fea26469706673582212203108711a0a2b6a63bc08b88cdc1620728e75ba94131f8b6aaf74de27d3ace79364736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101f95760003560e01c80636352211e1161010d578063a0712d68116100a0578063c87b56dd1161006f578063c87b56dd146106e1578063dc0e50071461071e578063e985e9c514610747578063f2fde38b14610784578063fb053e81146107ad576101f9565b8063a0712d6814610648578063a22cb46514610664578063aa592f251461068d578063b88d4fde146106b8576101f9565b8063853828b6116100dc578063853828b6146105bd5780638da5cb5b146105c757806395d89b41146105f25780639753eac01461061d576101f9565b80636352211e1461051557806370a0823114610552578063715018a61461058f5780638456cb59146105a6576101f9565b806326a49e371161019057806342842e0e1161015f57806342842e0e146104305780634e71d92d146104595780634f6ccce7146104705780635a4c6210146104ad5780635c975abb146104ea576101f9565b806326a49e37146103745780632f745c59146103b157806332cb6b0c146103ee5780633f4ba83a14610419576101f9565b80630902f1ac116101cc5780630902f1ac146102e0578063095ea7b3146102f757806318160ddd1461032057806323b872dd1461034b576101f9565b806301ffc9a7146101fe57806306815dcf1461023b57806306fdde0314610278578063081812fc146102a3575b600080fd5b34801561020a57600080fd5b50610225600480360381019061022091906132e0565b6107d6565b6040516102329190613869565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d919061304f565b6107e8565b60405161026f9190613869565b60405180910390f35b34801561028457600080fd5b5061028d61083e565b60405161029a9190613884565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c5919061333a565b6108d0565b6040516102d79190613802565b60405180910390f35b3480156102ec57600080fd5b506102f5610955565b005b34801561030357600080fd5b5061031e600480360381019061031991906131d2565b610a68565b005b34801561032c57600080fd5b50610335610b80565b6040516103429190613bc6565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d91906130bc565b610b8d565b005b34801561038057600080fd5b5061039b6004803603810190610396919061333a565b610bed565b6040516103a89190613bc6565b60405180910390f35b3480156103bd57600080fd5b506103d860048036038101906103d391906131d2565b610c04565b6040516103e59190613bc6565b60405180910390f35b3480156103fa57600080fd5b50610403610ca9565b6040516104109190613bc6565b60405180910390f35b34801561042557600080fd5b5061042e610caf565b005b34801561043c57600080fd5b50610457600480360381019061045291906130bc565b610d35565b005b34801561046557600080fd5b5061046e610d55565b005b34801561047c57600080fd5b506104976004803603810190610492919061333a565b610edb565b6040516104a49190613bc6565b60405180910390f35b3480156104b957600080fd5b506104d460048036038101906104cf919061304f565b610f4c565b6040516104e19190613be1565b60405180910390f35b3480156104f657600080fd5b506104ff610fa2565b60405161050c9190613869565b60405180910390f35b34801561052157600080fd5b5061053c6004803603810190610537919061333a565b610fb9565b6040516105499190613802565b60405180910390f35b34801561055e57600080fd5b506105796004803603810190610574919061304f565b61106b565b6040516105869190613bc6565b60405180910390f35b34801561059b57600080fd5b506105a4611123565b005b3480156105b257600080fd5b506105bb6111ab565b005b6105c5611231565b005b3480156105d357600080fd5b506105dc6112f4565b6040516105e99190613802565b60405180910390f35b3480156105fe57600080fd5b5061060761131e565b6040516106149190613884565b60405180910390f35b34801561062957600080fd5b506106326113b0565b60405161063f9190613bc6565b60405180910390f35b610662600480360381019061065d919061333a565b6113b6565b005b34801561067057600080fd5b5061068b60048036038101906106869190613192565b61156e565b005b34801561069957600080fd5b506106a2611584565b6040516106af9190613bc6565b60405180910390f35b3480156106c457600080fd5b506106df60048036038101906106da919061310f565b611589565b005b3480156106ed57600080fd5b506107086004803603810190610703919061333a565b6115eb565b6040516107159190613884565b60405180910390f35b34801561072a57600080fd5b506107456004803603810190610740919061325f565b611692565b005b34801561075357600080fd5b5061076e6004803603810190610769919061307c565b6117dc565b60405161077b9190613869565b60405180910390f35b34801561079057600080fd5b506107ab60048036038101906107a6919061304f565b611870565b005b3480156107b957600080fd5b506107d460048036038101906107cf9190613212565b611968565b005b60006107e182611a8a565b9050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60606000805461084d90613e6d565b80601f016020809104026020016040519081016040528092919081815260200182805461087990613e6d565b80156108c65780601f1061089b576101008083540402835291602001916108c6565b820191906000526020600020905b8154815290600101906020018083116108a957829003601f168201915b5050505050905090565b60006108db82611b04565b61091a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091190613ac6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61095d611b70565b73ffffffffffffffffffffffffffffffffffffffff1661097b6112f4565b73ffffffffffffffffffffffffffffffffffffffff16146109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c890613ae6565b60405180910390fd5b6115b360236109de610b80565b6109e89190613c95565b1115610a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2090613926565b60405180910390fd5b60005b6023811015610a6557610a3f600e611b78565b610a5233610a4d600e611b8e565b611b9c565b8080610a5d90613ed0565b915050610a2c565b50565b6000610a7382610fb9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adb90613b46565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b03611b70565b73ffffffffffffffffffffffffffffffffffffffff161480610b325750610b3181610b2c611b70565b6117dc565b5b610b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6890613a46565b60405180910390fd5b610b7b8383611bba565b505050565b6000600880549050905090565b610b9e610b98611b70565b82611c73565b610bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd490613b86565b60405180910390fd5b610be8838383611d51565b505050565b600081600b54610bfd9190613d1c565b9050919050565b6000610c0f8361106b565b8210610c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c47906138c6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6115b381565b610cb7611b70565b73ffffffffffffffffffffffffffffffffffffffff16610cd56112f4565b73ffffffffffffffffffffffffffffffffffffffff1614610d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2290613ae6565b60405180910390fd5b610d33611fad565b565b610d5083838360405180602001604052806000815250611589565b505050565b610d5d610fa2565b15610d9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9490613a06565b60405180910390fd5b6000610da833610f4c565b60ff1611610deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de290613a26565b60405180910390fd5b60001515610df8336107e8565b151514610e3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3190613966565b60405180910390fd5b60005b610e4633610f4c565b60ff16811015610e8057610e5a600e611b78565b610e6d33610e68600e611b8e565b611b9c565b8080610e7890613ed0565b915050610e3d565b506001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550565b6000610ee5610b80565b8210610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d90613ba6565b60405180910390fd5b60088281548110610f3a57610f39614006565b5b90600052602060002001549050919050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600a60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611062576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105990613a86565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d390613a66565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61112b611b70565b73ffffffffffffffffffffffffffffffffffffffff166111496112f4565b73ffffffffffffffffffffffffffffffffffffffff161461119f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119690613ae6565b60405180910390fd5b6111a9600061204f565b565b6111b3611b70565b73ffffffffffffffffffffffffffffffffffffffff166111d16112f4565b73ffffffffffffffffffffffffffffffffffffffff1614611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121e90613ae6565b60405180910390fd5b61122f612115565b565b611239611b70565b73ffffffffffffffffffffffffffffffffffffffff166112576112f4565b73ffffffffffffffffffffffffffffffffffffffff16146112ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a490613ae6565b60405180910390fd5b6112b5611b70565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506112f257600080fd5b565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461132d90613e6d565b80601f016020809104026020016040519081016040528092919081815260200182805461135990613e6d565b80156113a65780601f1061137b576101008083540402835291602001916113a6565b820191906000526020600020905b81548152906001019060200180831161138957829003601f168201915b5050505050905090565b6114b981565b6113be610fa2565b156113fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f590613a06565b60405180910390fd5b6114b98161140a610b80565b6114149190613c95565b1115611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c90613926565b60405180910390fd5b6114b9611460610b80565b106114a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149790613926565b60405180910390fd5b60038111156114e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114db90613b66565b60405180910390fd5b6114ed81610bed565b34101561152f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611526906139e6565b60405180910390fd5b60005b8181101561156a57611544600e611b78565b61155733611552600e611b8e565b611b9c565b808061156290613ed0565b915050611532565b5050565b611580611579611b70565b83836121b8565b5050565b60fa81565b61159a611594611b70565b83611c73565b6115d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d090613b86565b60405180910390fd5b6115e584848484612325565b50505050565b60606115f682611b04565b611635576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162c90613b26565b60405180910390fd5b600061163f612381565b9050600081511161165f576040518060200160405280600081525061168a565b80611669846123be565b60405160200161167a9291906137de565b6040516020818303038152906040525b915050919050565b61169a611b70565b73ffffffffffffffffffffffffffffffffffffffff166116b86112f4565b73ffffffffffffffffffffffffffffffffffffffff161461170e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170590613ae6565b60405180910390fd5b60005b848490508110156117d55782828281811061172f5761172e614006565b5b90506020020160208101906117449190613367565b600c600087878581811061175b5761175a614006565b5b9050602002016020810190611770919061304f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555080806117cd90613ed0565b915050611711565b5050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611878611b70565b73ffffffffffffffffffffffffffffffffffffffff166118966112f4565b73ffffffffffffffffffffffffffffffffffffffff16146118ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e390613ae6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561195c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195390613906565b60405180910390fd5b6119658161204f565b50565b611970611b70565b73ffffffffffffffffffffffffffffffffffffffff1661198e6112f4565b73ffffffffffffffffffffffffffffffffffffffff16146119e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119db90613ae6565b60405180910390fd5b60005b82829050811015611a85576000600c6000858585818110611a0b57611a0a614006565b5b9050602002016020810190611a20919061304f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080611a7d90613ed0565b9150506119e7565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611afd5750611afc8261251f565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b6001816000016000828254019250508190555050565b600081600001549050919050565b611bb6828260405180602001604052806000815250612601565b5050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611c2d83610fb9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c7e82611b04565b611cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb4906139c6565b60405180910390fd5b6000611cc883610fb9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d3757508373ffffffffffffffffffffffffffffffffffffffff16611d1f846108d0565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d485750611d4781856117dc565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d7182610fb9565b73ffffffffffffffffffffffffffffffffffffffff1614611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90613b06565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2e90613986565b60405180910390fd5b611e4283838361265c565b611e4d600082611bba565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e9d9190613d76565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ef49190613c95565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611fb5610fa2565b611ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611feb906138a6565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612038611b70565b6040516120459190613802565b60405180910390a1565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61211d610fa2565b1561215d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215490613a06565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586121a1611b70565b6040516121ae9190613802565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221e906139a6565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123189190613869565b60405180910390a3505050565b612330848484611d51565b61233c848484846126b4565b61237b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612372906138e6565b60405180910390fd5b50505050565b60606040518060400160405280601c81526020017f68747470733a2f2f63796265726d6f6c652e636c75622f6d6574612f00000000815250905090565b60606000821415612406576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061251a565b600082905060005b6000821461243857808061242190613ed0565b915050600a826124319190613ceb565b915061240e565b60008167ffffffffffffffff81111561245457612453614035565b5b6040519080825280601f01601f1916602001820160405280156124865781602001600182028036833780820191505090505b5090505b600085146125135760018261249f9190613d76565b9150600a856124ae9190613f19565b60306124ba9190613c95565b60f81b8183815181106124d0576124cf614006565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561250c9190613ceb565b945061248a565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125ea57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806125fa57506125f98261284b565b5b9050919050565b61260b83836128b5565b61261860008484846126b4565b612657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264e906138e6565b60405180910390fd5b505050565b612664610fa2565b156126a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269b90613a06565b60405180910390fd5b6126af838383612a83565b505050565b60006126d58473ffffffffffffffffffffffffffffffffffffffff16612b97565b1561283e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126fe611b70565b8786866040518563ffffffff1660e01b8152600401612720949392919061381d565b602060405180830381600087803b15801561273a57600080fd5b505af192505050801561276b57506040513d601f19601f82011682018060405250810190612768919061330d565b60015b6127ee573d806000811461279b576040519150601f19603f3d011682016040523d82523d6000602084013e6127a0565b606091505b506000815114156127e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127dd906138e6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612843565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291c90613aa6565b60405180910390fd5b61292e81611b04565b1561296e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296590613946565b60405180910390fd5b61297a6000838361265c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129ca9190613c95565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612a8e838383612baa565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ad157612acc81612baf565b612b10565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612b0f57612b0e8382612bf8565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b5357612b4e81612d65565b612b92565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612b9157612b908282612e36565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c058461106b565b612c0f9190613d76565b9050600060076000848152602001908152602001600020549050818114612cf4576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612d799190613d76565b9050600060096000848152602001908152602001600020549050600060088381548110612da957612da8614006565b5b906000526020600020015490508060088381548110612dcb57612dca614006565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e1a57612e19613fd7565b5b6001900381819060005260206000200160009055905550505050565b6000612e418361106b565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000612ec8612ec384613c21565b613bfc565b905082815260208101848484011115612ee457612ee3614073565b5b612eef848285613e2b565b509392505050565b600081359050612f068161471a565b92915050565b60008083601f840112612f2257612f21614069565b5b8235905067ffffffffffffffff811115612f3f57612f3e614064565b5b602083019150836020820283011115612f5b57612f5a61406e565b5b9250929050565b60008083601f840112612f7857612f77614069565b5b8235905067ffffffffffffffff811115612f9557612f94614064565b5b602083019150836020820283011115612fb157612fb061406e565b5b9250929050565b600081359050612fc781614731565b92915050565b600081359050612fdc81614748565b92915050565b600081519050612ff181614748565b92915050565b600082601f83011261300c5761300b614069565b5b813561301c848260208601612eb5565b91505092915050565b6000813590506130348161475f565b92915050565b60008135905061304981614776565b92915050565b6000602082840312156130655761306461407d565b5b600061307384828501612ef7565b91505092915050565b600080604083850312156130935761309261407d565b5b60006130a185828601612ef7565b92505060206130b285828601612ef7565b9150509250929050565b6000806000606084860312156130d5576130d461407d565b5b60006130e386828701612ef7565b93505060206130f486828701612ef7565b925050604061310586828701613025565b9150509250925092565b600080600080608085870312156131295761312861407d565b5b600061313787828801612ef7565b945050602061314887828801612ef7565b935050604061315987828801613025565b925050606085013567ffffffffffffffff81111561317a57613179614078565b5b61318687828801612ff7565b91505092959194509250565b600080604083850312156131a9576131a861407d565b5b60006131b785828601612ef7565b92505060206131c885828601612fb8565b9150509250929050565b600080604083850312156131e9576131e861407d565b5b60006131f785828601612ef7565b925050602061320885828601613025565b9150509250929050565b600080602083850312156132295761322861407d565b5b600083013567ffffffffffffffff81111561324757613246614078565b5b61325385828601612f0c565b92509250509250929050565b600080600080604085870312156132795761327861407d565b5b600085013567ffffffffffffffff81111561329757613296614078565b5b6132a387828801612f0c565b9450945050602085013567ffffffffffffffff8111156132c6576132c5614078565b5b6132d287828801612f62565b925092505092959194509250565b6000602082840312156132f6576132f561407d565b5b600061330484828501612fcd565b91505092915050565b6000602082840312156133235761332261407d565b5b600061333184828501612fe2565b91505092915050565b6000602082840312156133505761334f61407d565b5b600061335e84828501613025565b91505092915050565b60006020828403121561337d5761337c61407d565b5b600061338b8482850161303a565b91505092915050565b61339d81613daa565b82525050565b6133ac81613dbc565b82525050565b60006133bd82613c52565b6133c78185613c68565b93506133d7818560208601613e3a565b6133e081614082565b840191505092915050565b60006133f682613c5d565b6134008185613c79565b9350613410818560208601613e3a565b61341981614082565b840191505092915050565b600061342f82613c5d565b6134398185613c8a565b9350613449818560208601613e3a565b80840191505092915050565b6000613462601483613c79565b915061346d82614093565b602082019050919050565b6000613485602b83613c79565b9150613490826140bc565b604082019050919050565b60006134a8603283613c79565b91506134b38261410b565b604082019050919050565b60006134cb602683613c79565b91506134d68261415a565b604082019050919050565b60006134ee602083613c79565b91506134f9826141a9565b602082019050919050565b6000613511601c83613c79565b915061351c826141d2565b602082019050919050565b6000613534602883613c79565b915061353f826141fb565b604082019050919050565b6000613557602483613c79565b91506135628261424a565b604082019050919050565b600061357a601983613c79565b915061358582614299565b602082019050919050565b600061359d602c83613c79565b91506135a8826142c2565b604082019050919050565b60006135c0601a83613c79565b91506135cb82614311565b602082019050919050565b60006135e3601083613c79565b91506135ee8261433a565b602082019050919050565b6000613606602d83613c79565b915061361182614363565b604082019050919050565b6000613629603883613c79565b9150613634826143b2565b604082019050919050565b600061364c602a83613c79565b915061365782614401565b604082019050919050565b600061366f602983613c79565b915061367a82614450565b604082019050919050565b6000613692602083613c79565b915061369d8261449f565b602082019050919050565b60006136b5602c83613c79565b91506136c0826144c8565b604082019050919050565b60006136d8602083613c79565b91506136e382614517565b602082019050919050565b60006136fb602983613c79565b915061370682614540565b604082019050919050565b600061371e602f83613c79565b91506137298261458f565b604082019050919050565b6000613741602183613c79565b915061374c826145de565b604082019050919050565b6000613764602583613c79565b915061376f8261462d565b604082019050919050565b6000613787603183613c79565b91506137928261467c565b604082019050919050565b60006137aa602c83613c79565b91506137b5826146cb565b604082019050919050565b6137c981613e14565b82525050565b6137d881613e1e565b82525050565b60006137ea8285613424565b91506137f68284613424565b91508190509392505050565b60006020820190506138176000830184613394565b92915050565b60006080820190506138326000830187613394565b61383f6020830186613394565b61384c60408301856137c0565b818103606083015261385e81846133b2565b905095945050505050565b600060208201905061387e60008301846133a3565b92915050565b6000602082019050818103600083015261389e81846133eb565b905092915050565b600060208201905081810360008301526138bf81613455565b9050919050565b600060208201905081810360008301526138df81613478565b9050919050565b600060208201905081810360008301526138ff8161349b565b9050919050565b6000602082019050818103600083015261391f816134be565b9050919050565b6000602082019050818103600083015261393f816134e1565b9050919050565b6000602082019050818103600083015261395f81613504565b9050919050565b6000602082019050818103600083015261397f81613527565b9050919050565b6000602082019050818103600083015261399f8161354a565b9050919050565b600060208201905081810360008301526139bf8161356d565b9050919050565b600060208201905081810360008301526139df81613590565b9050919050565b600060208201905081810360008301526139ff816135b3565b9050919050565b60006020820190508181036000830152613a1f816135d6565b9050919050565b60006020820190508181036000830152613a3f816135f9565b9050919050565b60006020820190508181036000830152613a5f8161361c565b9050919050565b60006020820190508181036000830152613a7f8161363f565b9050919050565b60006020820190508181036000830152613a9f81613662565b9050919050565b60006020820190508181036000830152613abf81613685565b9050919050565b60006020820190508181036000830152613adf816136a8565b9050919050565b60006020820190508181036000830152613aff816136cb565b9050919050565b60006020820190508181036000830152613b1f816136ee565b9050919050565b60006020820190508181036000830152613b3f81613711565b9050919050565b60006020820190508181036000830152613b5f81613734565b9050919050565b60006020820190508181036000830152613b7f81613757565b9050919050565b60006020820190508181036000830152613b9f8161377a565b9050919050565b60006020820190508181036000830152613bbf8161379d565b9050919050565b6000602082019050613bdb60008301846137c0565b92915050565b6000602082019050613bf660008301846137cf565b92915050565b6000613c06613c17565b9050613c128282613e9f565b919050565b6000604051905090565b600067ffffffffffffffff821115613c3c57613c3b614035565b5b613c4582614082565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613ca082613e14565b9150613cab83613e14565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ce057613cdf613f4a565b5b828201905092915050565b6000613cf682613e14565b9150613d0183613e14565b925082613d1157613d10613f79565b5b828204905092915050565b6000613d2782613e14565b9150613d3283613e14565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d6b57613d6a613f4a565b5b828202905092915050565b6000613d8182613e14565b9150613d8c83613e14565b925082821015613d9f57613d9e613f4a565b5b828203905092915050565b6000613db582613df4565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613e58578082015181840152602081019050613e3d565b83811115613e67576000848401525b50505050565b60006002820490506001821680613e8557607f821691505b60208210811415613e9957613e98613fa8565b5b50919050565b613ea882614082565b810181811067ffffffffffffffff82111715613ec757613ec6614035565b5b80604052505050565b6000613edb82613e14565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f0e57613f0d613f4a565b5b600182019050919050565b6000613f2482613e14565b9150613f2f83613e14565b925082613f3f57613f3e613f79565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f427277734e46543a204e6f7420656e6f756768206c65667420746f206d696e74600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f427277734e46543a20596f7520616c726561647920636c61696d65642061206660008201527f726565206d696e74000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f427277734e46543a2056616c75652062656c6f77207072696365000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f427277734e46543a20596f7520617265206e6f7420656c696769626c6520666f60008201527f7220612066726565206d696e7400000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f427277734e46543a204578636565647320746865206d617820796f752063616e60008201527f206d696e74000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61472381613daa565b811461472e57600080fd5b50565b61473a81613dbc565b811461474557600080fd5b50565b61475181613dc8565b811461475c57600080fd5b50565b61476881613e14565b811461477357600080fd5b50565b61477f81613e1e565b811461478a57600080fd5b5056fea26469706673582212203108711a0a2b6a63bc08b88cdc1620728e75ba94131f8b6aaf74de27d3ace79364736f6c63430008070033
Deployed Bytecode Sourcemap
48260:3629:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51236:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51023:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29543:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31102:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51460:293;;;;;;;;;;;;;:::i;:::-;;30625:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42689:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31852:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50085:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42357:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48331:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48968:65;;;;;;;;;;;;;:::i;:::-;;32262:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49596:481;;;;;;;;;;;;;:::i;:::-;;42879:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50893:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8144:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29237:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28967:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6195:103;;;;;;;;;;;;;:::i;:::-;;48899:61;;;;;;;;;;;;;:::i;:::-;;51761:125;;;:::i;:::-;;5544:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29712:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48376:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49041:547;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31395:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48421:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32518:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29887:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50427:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31621:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6453:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50677:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51236:212;51375:4;51404:36;51428:11;51404:23;:36::i;:::-;51397:43;;51236:212;;;:::o;51023:135::-;51091:4;51115:25;:35;51141:8;51115:35;;;;;;;;;;;;;;;;;;;;;;;;;51108:42;;51023:135;;;:::o;29543:100::-;29597:13;29630:5;29623:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29543:100;:::o;31102:221::-;31178:7;31206:16;31214:7;31206;:16::i;:::-;31198:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31291:15;:24;31307:7;31291:24;;;;;;;;;;;;;;;;;;;;;31284:31;;31102:221;;;:::o;51460:293::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48365:4:::1;51535:2;51519:13;:11;:13::i;:::-;:18;;;;:::i;:::-;:32;;51511:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;51604:6;51599:147;51620:2;51616:1;:6;51599:147;;;51644:27;:15;:25;:27::i;:::-;51686:48;51696:10;51708:25;:15;:23;:25::i;:::-;51686:9;:48::i;:::-;51624:3;;;;;:::i;:::-;;;;51599:147;;;;51460:293::o:0;30625:411::-;30706:13;30722:23;30737:7;30722:14;:23::i;:::-;30706:39;;30770:5;30764:11;;:2;:11;;;;30756:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;30864:5;30848:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;30873:37;30890:5;30897:12;:10;:12::i;:::-;30873:16;:37::i;:::-;30848:62;30826:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;31007:21;31016:2;31020:7;31007:8;:21::i;:::-;30695:341;30625:411;;:::o;42689:113::-;42750:7;42777:10;:17;;;;42770:24;;42689:113;:::o;31852:339::-;32047:41;32066:12;:10;:12::i;:::-;32080:7;32047:18;:41::i;:::-;32039:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32155:28;32165:4;32171:2;32175:7;32155:9;:28::i;:::-;31852:339;;;:::o;50085:99::-;50134:7;50170:6;50161;;:15;;;;:::i;:::-;50154:22;;50085:99;;;:::o;42357:256::-;42454:7;42490:23;42507:5;42490:16;:23::i;:::-;42482:5;:31;42474:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;42579:12;:19;42592:5;42579:19;;;;;;;;;;;;;;;:26;42599:5;42579:26;;;;;;;;;;;;42572:33;;42357:256;;;;:::o;48331:38::-;48365:4;48331:38;:::o;48968:65::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49015:10:::1;:8;:10::i;:::-;48968:65::o:0;32262:185::-;32400:39;32417:4;32423:2;32427:7;32400:39;;;;;;;;;;;;:16;:39::i;:::-;32262:185;;;:::o;49596:481::-;8470:8;:6;:8::i;:::-;8469:9;8461:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;49680:1:::1;49653:24;49666:10;49653:12;:24::i;:::-;:28;;;49645:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;49785:5;49750:40;;:31;49770:10;49750:19;:31::i;:::-;:40;;;49742:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;49851:6;49846:169;49867:24;49880:10;49867:12;:24::i;:::-;49863:28;;:1;:28;49846:169;;;49913:27;:15;:25;:27::i;:::-;49955:48;49965:10;49977:25;:15;:23;:25::i;:::-;49955:9;:48::i;:::-;49893:3;;;;;:::i;:::-;;;;49846:169;;;;50065:4;50025:25;:37;50051:10;50025:37;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;49596:481::o:0;42879:233::-;42954:7;42990:30;:28;:30::i;:::-;42982:5;:38;42974:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;43087:10;43098:5;43087:17;;;;;;;;:::i;:::-;;;;;;;;;;43080:24;;42879:233;;;:::o;50893:122::-;50954:5;50979:18;:28;50998:8;50979:28;;;;;;;;;;;;;;;;;;;;;;;;;50972:35;;50893:122;;;:::o;8144:86::-;8191:4;8215:7;;;;;;;;;;;8208:14;;8144:86;:::o;29237:239::-;29309:7;29329:13;29345:7;:16;29353:7;29345:16;;;;;;;;;;;;;;;;;;;;;29329:32;;29397:1;29380:19;;:5;:19;;;;29372:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29463:5;29456:12;;;29237:239;;;:::o;28967:208::-;29039:7;29084:1;29067:19;;:5;:19;;;;29059:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;29151:9;:16;29161:5;29151:16;;;;;;;;;;;;;;;;29144:23;;28967:208;;;:::o;6195:103::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6260:30:::1;6287:1;6260:18;:30::i;:::-;6195:103::o:0;48899:61::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48944:8:::1;:6;:8::i;:::-;48899:61::o:0;51761:125::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51836:12:::1;:10;:12::i;:::-;51828:26;;:49;51855:21;51828:49;;;;;;;;;;;;;;;;;;;;;;;51820:58;;;::::0;::::1;;51761:125::o:0;5544:87::-;5590:7;5617:6;;;;;;;;;;;5610:13;;5544:87;:::o;29712:104::-;29768:13;29801:7;29794:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29712:104;:::o;48376:38::-;48410:4;48376:38;:::o;49041:547::-;8470:8;:6;:8::i;:::-;8469:9;8461:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;48410:4:::1;49132:6;49116:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;49108:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;48410:4;49208:13;:11;:13::i;:::-;:26;49200:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;49300:1;49290:6;:11;;49282:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;49375:13;49381:6;49375:5;:13::i;:::-;49362:9;:26;;49354:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;49435:6;49430:151;49451:6;49447:1;:10;49430:151;;;49479:27;:15;:25;:27::i;:::-;49521:48;49531:10;49543:25;:15;:23;:25::i;:::-;49521:9;:48::i;:::-;49459:3;;;;;:::i;:::-;;;;49430:151;;;;49041:547:::0;:::o;31395:155::-;31490:52;31509:12;:10;:12::i;:::-;31523:8;31533;31490:18;:52::i;:::-;31395:155;;:::o;48421:35::-;48453:3;48421:35;:::o;32518:328::-;32693:41;32712:12;:10;:12::i;:::-;32726:7;32693:18;:41::i;:::-;32685:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32799:39;32813:4;32819:2;32823:7;32832:5;32799:13;:39::i;:::-;32518:328;;;;:::o;29887:334::-;29960:13;29994:16;30002:7;29994;:16::i;:::-;29986:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;30075:21;30099:10;:8;:10::i;:::-;30075:34;;30151:1;30133:7;30127:21;:25;:86;;;;;;;;;;;;;;;;;30179:7;30188:18;:7;:16;:18::i;:::-;30162:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30127:86;30120:93;;;29887:334;;;:::o;50427:242::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50548:6:::1;50543:119;50564:10;;:17;;50560:1;:21;50543:119;;;50639:8;;50648:1;50639:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;50603:18;:33;50622:10;;50633:1;50622:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;50603:33;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;50583:3;;;;;:::i;:::-;;;;50543:119;;;;50427:242:::0;;;;:::o;31621:164::-;31718:4;31742:18;:25;31761:5;31742:25;;;;;;;;;;;;;;;:35;31768:8;31742:35;;;;;;;;;;;;;;;;;;;;;;;;;31735:42;;31621:164;;;;:::o;6453:201::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6562:1:::1;6542:22;;:8;:22;;;;6534:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6618:28;6637:8;6618:18;:28::i;:::-;6453:201:::0;:::o;50677:208::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50774:6:::1;50769:109;50790:10;;:17;;50786:1;:21;50769:109;;;50865:1;50829:18;:33;50848:10;;50859:1;50848:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;50829:33;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;50809:3;;;;;:::i;:::-;;;;50769:109;;;;50677:208:::0;;:::o;42049:224::-;42151:4;42190:35;42175:50;;;:11;:50;;;;:90;;;;42229:36;42253:11;42229:23;:36::i;:::-;42175:90;42168:97;;42049:224;;;:::o;34356:127::-;34421:4;34473:1;34445:30;;:7;:16;34453:7;34445:16;;;;;;;;;;;;;;;;;;;;;:30;;;;34438:37;;34356:127;;;:::o;4268:98::-;4321:7;4348:10;4341:17;;4268:98;:::o;994:127::-;1101:1;1083:7;:14;;;:19;;;;;;;;;;;994:127;:::o;872:114::-;937:7;964;:14;;;957:21;;872:114;;;:::o;35340:110::-;35416:26;35426:2;35430:7;35416:26;;;;;;;;;;;;:9;:26::i;:::-;35340:110;;:::o;38338:174::-;38440:2;38413:15;:24;38429:7;38413:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;38496:7;38492:2;38458:46;;38467:23;38482:7;38467:14;:23::i;:::-;38458:46;;;;;;;;;;;;38338:174;;:::o;34650:348::-;34743:4;34768:16;34776:7;34768;:16::i;:::-;34760:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34844:13;34860:23;34875:7;34860:14;:23::i;:::-;34844:39;;34913:5;34902:16;;:7;:16;;;:51;;;;34946:7;34922:31;;:20;34934:7;34922:11;:20::i;:::-;:31;;;34902:51;:87;;;;34957:32;34974:5;34981:7;34957:16;:32::i;:::-;34902:87;34894:96;;;34650:348;;;;:::o;37642:578::-;37801:4;37774:31;;:23;37789:7;37774:14;:23::i;:::-;:31;;;37766:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;37884:1;37870:16;;:2;:16;;;;37862:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37940:39;37961:4;37967:2;37971:7;37940:20;:39::i;:::-;38044:29;38061:1;38065:7;38044:8;:29::i;:::-;38105:1;38086:9;:15;38096:4;38086:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;38134:1;38117:9;:13;38127:2;38117:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38165:2;38146:7;:16;38154:7;38146:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38204:7;38200:2;38185:27;;38194:4;38185:27;;;;;;;;;;;;37642:578;;;:::o;9203:120::-;8747:8;:6;:8::i;:::-;8739:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;9272:5:::1;9262:7;;:15;;;;;;;;;;;;;;;;;;9293:22;9302:12;:10;:12::i;:::-;9293:22;;;;;;:::i;:::-;;;;;;;;9203:120::o:0;6814:191::-;6888:16;6907:6;;;;;;;;;;;6888:25;;6933:8;6924:6;;:17;;;;;;;;;;;;;;;;;;6988:8;6957:40;;6978:8;6957:40;;;;;;;;;;;;6877:128;6814:191;:::o;8944:118::-;8470:8;:6;:8::i;:::-;8469:9;8461:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;9014:4:::1;9004:7;;:14;;;;;;;;;;;;;;;;;;9034:20;9041:12;:10;:12::i;:::-;9034:20;;;;;;:::i;:::-;;;;;;;;8944:118::o:0;38654:315::-;38809:8;38800:17;;:5;:17;;;;38792:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;38896:8;38858:18;:25;38877:5;38858:25;;;;;;;;;;;;;;;:35;38884:8;38858:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;38942:8;38920:41;;38935:5;38920:41;;;38952:8;38920:41;;;;;;:::i;:::-;;;;;;;;38654:315;;;:::o;33728:::-;33885:28;33895:4;33901:2;33905:7;33885:9;:28::i;:::-;33932:48;33955:4;33961:2;33965:7;33974:5;33932:22;:48::i;:::-;33924:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;33728:315;;;;:::o;48768:123::-;48820:13;48846:37;;;;;;;;;;;;;;;;;;;48768:123;:::o;1830:723::-;1886:13;2116:1;2107:5;:10;2103:53;;;2134:10;;;;;;;;;;;;;;;;;;;;;2103:53;2166:12;2181:5;2166:20;;2197:14;2222:78;2237:1;2229:4;:9;2222:78;;2255:8;;;;;:::i;:::-;;;;2286:2;2278:10;;;;;:::i;:::-;;;2222:78;;;2310:19;2342:6;2332:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2310:39;;2360:154;2376:1;2367:5;:10;2360:154;;2404:1;2394:11;;;;;:::i;:::-;;;2471:2;2463:5;:10;;;;:::i;:::-;2450:2;:24;;;;:::i;:::-;2437:39;;2420:6;2427;2420:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2500:2;2491:11;;;;;:::i;:::-;;;2360:154;;;2538:6;2524:21;;;;;1830:723;;;;:::o;28598:305::-;28700:4;28752:25;28737:40;;;:11;:40;;;;:105;;;;28809:33;28794:48;;;:11;:48;;;;28737:105;:158;;;;28859:36;28883:11;28859:23;:36::i;:::-;28737:158;28717:178;;28598:305;;;:::o;35677:321::-;35807:18;35813:2;35817:7;35807:5;:18::i;:::-;35858:54;35889:1;35893:2;35897:7;35906:5;35858:22;:54::i;:::-;35836:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;35677:321;;;:::o;50192:227::-;8470:8;:6;:8::i;:::-;8469:9;8461:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;50366:45:::1;50393:4;50399:2;50403:7;50366:26;:45::i;:::-;50192:227:::0;;;:::o;39534:799::-;39689:4;39710:15;:2;:13;;;:15::i;:::-;39706:620;;;39762:2;39746:36;;;39783:12;:10;:12::i;:::-;39797:4;39803:7;39812:5;39746:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39742:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40005:1;39988:6;:13;:18;39984:272;;;40031:60;;;;;;;;;;:::i;:::-;;;;;;;;39984:272;40206:6;40200:13;40191:6;40187:2;40183:15;40176:38;39742:529;39879:41;;;39869:51;;;:6;:51;;;;39862:58;;;;;39706:620;40310:4;40303:11;;39534:799;;;;;;;:::o;20294:157::-;20379:4;20418:25;20403:40;;;:11;:40;;;;20396:47;;20294:157;;;:::o;36334:382::-;36428:1;36414:16;;:2;:16;;;;36406:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;36487:16;36495:7;36487;:16::i;:::-;36486:17;36478:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;36549:45;36578:1;36582:2;36586:7;36549:20;:45::i;:::-;36624:1;36607:9;:13;36617:2;36607:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36655:2;36636:7;:16;36644:7;36636:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36700:7;36696:2;36675:33;;36692:1;36675:33;;;;;;;;;;;;36334:382;;:::o;43725:589::-;43869:45;43896:4;43902:2;43906:7;43869:26;:45::i;:::-;43947:1;43931:18;;:4;:18;;;43927:187;;;43966:40;43998:7;43966:31;:40::i;:::-;43927:187;;;44036:2;44028:10;;:4;:10;;;44024:90;;44055:47;44088:4;44094:7;44055:32;:47::i;:::-;44024:90;43927:187;44142:1;44128:16;;:2;:16;;;44124:183;;;44161:45;44198:7;44161:36;:45::i;:::-;44124:183;;;44234:4;44228:10;;:2;:10;;;44224:83;;44255:40;44283:2;44287:7;44255:27;:40::i;:::-;44224:83;44124:183;43725:589;;;:::o;10150:387::-;10210:4;10418:12;10485:7;10473:20;10465:28;;10528:1;10521:4;:8;10514:15;;;10150:387;;;:::o;40905:126::-;;;;:::o;45037:164::-;45141:10;:17;;;;45114:15;:24;45130:7;45114:24;;;;;;;;;;;:44;;;;45169:10;45185:7;45169:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45037:164;:::o;45828:988::-;46094:22;46144:1;46119:22;46136:4;46119:16;:22::i;:::-;:26;;;;:::i;:::-;46094:51;;46156:18;46177:17;:26;46195:7;46177:26;;;;;;;;;;;;46156:47;;46324:14;46310:10;:28;46306:328;;46355:19;46377:12;:18;46390:4;46377:18;;;;;;;;;;;;;;;:34;46396:14;46377:34;;;;;;;;;;;;46355:56;;46461:11;46428:12;:18;46441:4;46428:18;;;;;;;;;;;;;;;:30;46447:10;46428:30;;;;;;;;;;;:44;;;;46578:10;46545:17;:30;46563:11;46545:30;;;;;;;;;;;:43;;;;46340:294;46306:328;46730:17;:26;46748:7;46730:26;;;;;;;;;;;46723:33;;;46774:12;:18;46787:4;46774:18;;;;;;;;;;;;;;;:34;46793:14;46774:34;;;;;;;;;;;46767:41;;;45909:907;;45828:988;;:::o;47111:1079::-;47364:22;47409:1;47389:10;:17;;;;:21;;;;:::i;:::-;47364:46;;47421:18;47442:15;:24;47458:7;47442:24;;;;;;;;;;;;47421:45;;47793:19;47815:10;47826:14;47815:26;;;;;;;;:::i;:::-;;;;;;;;;;47793:48;;47879:11;47854:10;47865;47854:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;47990:10;47959:15;:28;47975:11;47959:28;;;;;;;;;;;:41;;;;48131:15;:24;48147:7;48131:24;;;;;;;;;;;48124:31;;;48166:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47182:1008;;;47111:1079;:::o;44615:221::-;44700:14;44717:20;44734:2;44717:16;:20::i;:::-;44700:37;;44775:7;44748:12;:16;44761:2;44748:16;;;;;;;;;;;;;;;:24;44765:6;44748:24;;;;;;;;;;;:34;;;;44822:6;44793:17;:26;44811:7;44793:26;;;;;;;;;;;:35;;;;44689:147;44615:221;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;585:568::-;658:8;668:6;718:3;711:4;703:6;699:17;695:27;685:122;;726:79;;:::i;:::-;685:122;839:6;826:20;816:30;;869:18;861:6;858:30;855:117;;;891:79;;:::i;:::-;855:117;1005:4;997:6;993:17;981:29;;1059:3;1051:4;1043:6;1039:17;1029:8;1025:32;1022:41;1019:128;;;1066:79;;:::i;:::-;1019:128;585:568;;;;;:::o;1174:566::-;1245:8;1255:6;1305:3;1298:4;1290:6;1286:17;1282:27;1272:122;;1313:79;;:::i;:::-;1272:122;1426:6;1413:20;1403:30;;1456:18;1448:6;1445:30;1442:117;;;1478:79;;:::i;:::-;1442:117;1592:4;1584:6;1580:17;1568:29;;1646:3;1638:4;1630:6;1626:17;1616:8;1612:32;1609:41;1606:128;;;1653:79;;:::i;:::-;1606:128;1174:566;;;;;:::o;1746:133::-;1789:5;1827:6;1814:20;1805:29;;1843:30;1867:5;1843:30;:::i;:::-;1746:133;;;;:::o;1885:137::-;1930:5;1968:6;1955:20;1946:29;;1984:32;2010:5;1984:32;:::i;:::-;1885:137;;;;:::o;2028:141::-;2084:5;2115:6;2109:13;2100:22;;2131:32;2157:5;2131:32;:::i;:::-;2028:141;;;;:::o;2188:338::-;2243:5;2292:3;2285:4;2277:6;2273:17;2269:27;2259:122;;2300:79;;:::i;:::-;2259:122;2417:6;2404:20;2442:78;2516:3;2508:6;2501:4;2493:6;2489:17;2442:78;:::i;:::-;2433:87;;2249:277;2188:338;;;;:::o;2532:139::-;2578:5;2616:6;2603:20;2594:29;;2632:33;2659:5;2632:33;:::i;:::-;2532:139;;;;:::o;2677:135::-;2721:5;2759:6;2746:20;2737:29;;2775:31;2800:5;2775:31;:::i;:::-;2677:135;;;;:::o;2818:329::-;2877:6;2926:2;2914:9;2905:7;2901:23;2897:32;2894:119;;;2932:79;;:::i;:::-;2894:119;3052:1;3077:53;3122:7;3113:6;3102:9;3098:22;3077:53;:::i;:::-;3067:63;;3023:117;2818:329;;;;:::o;3153:474::-;3221:6;3229;3278:2;3266:9;3257:7;3253:23;3249:32;3246:119;;;3284:79;;:::i;:::-;3246:119;3404:1;3429:53;3474:7;3465:6;3454:9;3450:22;3429:53;:::i;:::-;3419:63;;3375:117;3531:2;3557:53;3602:7;3593:6;3582:9;3578:22;3557:53;:::i;:::-;3547:63;;3502:118;3153:474;;;;;:::o;3633:619::-;3710:6;3718;3726;3775:2;3763:9;3754:7;3750:23;3746:32;3743:119;;;3781:79;;:::i;:::-;3743:119;3901:1;3926:53;3971:7;3962:6;3951:9;3947:22;3926:53;:::i;:::-;3916:63;;3872:117;4028:2;4054:53;4099:7;4090:6;4079:9;4075:22;4054:53;:::i;:::-;4044:63;;3999:118;4156:2;4182:53;4227:7;4218:6;4207:9;4203:22;4182:53;:::i;:::-;4172:63;;4127:118;3633:619;;;;;:::o;4258:943::-;4353:6;4361;4369;4377;4426:3;4414:9;4405:7;4401:23;4397:33;4394:120;;;4433:79;;:::i;:::-;4394:120;4553:1;4578:53;4623:7;4614:6;4603:9;4599:22;4578:53;:::i;:::-;4568:63;;4524:117;4680:2;4706:53;4751:7;4742:6;4731:9;4727:22;4706:53;:::i;:::-;4696:63;;4651:118;4808:2;4834:53;4879:7;4870:6;4859:9;4855:22;4834:53;:::i;:::-;4824:63;;4779:118;4964:2;4953:9;4949:18;4936:32;4995:18;4987:6;4984:30;4981:117;;;5017:79;;:::i;:::-;4981:117;5122:62;5176:7;5167:6;5156:9;5152:22;5122:62;:::i;:::-;5112:72;;4907:287;4258:943;;;;;;;:::o;5207:468::-;5272:6;5280;5329:2;5317:9;5308:7;5304:23;5300:32;5297:119;;;5335:79;;:::i;:::-;5297:119;5455:1;5480:53;5525:7;5516:6;5505:9;5501:22;5480:53;:::i;:::-;5470:63;;5426:117;5582:2;5608:50;5650:7;5641:6;5630:9;5626:22;5608:50;:::i;:::-;5598:60;;5553:115;5207:468;;;;;:::o;5681:474::-;5749:6;5757;5806:2;5794:9;5785:7;5781:23;5777:32;5774:119;;;5812:79;;:::i;:::-;5774:119;5932:1;5957:53;6002:7;5993:6;5982:9;5978:22;5957:53;:::i;:::-;5947:63;;5903:117;6059:2;6085:53;6130:7;6121:6;6110:9;6106:22;6085:53;:::i;:::-;6075:63;;6030:118;5681:474;;;;;:::o;6161:559::-;6247:6;6255;6304:2;6292:9;6283:7;6279:23;6275:32;6272:119;;;6310:79;;:::i;:::-;6272:119;6458:1;6447:9;6443:17;6430:31;6488:18;6480:6;6477:30;6474:117;;;6510:79;;:::i;:::-;6474:117;6623:80;6695:7;6686:6;6675:9;6671:22;6623:80;:::i;:::-;6605:98;;;;6401:312;6161:559;;;;;:::o;6726:930::-;6846:6;6854;6862;6870;6919:2;6907:9;6898:7;6894:23;6890:32;6887:119;;;6925:79;;:::i;:::-;6887:119;7073:1;7062:9;7058:17;7045:31;7103:18;7095:6;7092:30;7089:117;;;7125:79;;:::i;:::-;7089:117;7238:80;7310:7;7301:6;7290:9;7286:22;7238:80;:::i;:::-;7220:98;;;;7016:312;7395:2;7384:9;7380:18;7367:32;7426:18;7418:6;7415:30;7412:117;;;7448:79;;:::i;:::-;7412:117;7561:78;7631:7;7622:6;7611:9;7607:22;7561:78;:::i;:::-;7543:96;;;;7338:311;6726:930;;;;;;;:::o;7662:327::-;7720:6;7769:2;7757:9;7748:7;7744:23;7740:32;7737:119;;;7775:79;;:::i;:::-;7737:119;7895:1;7920:52;7964:7;7955:6;7944:9;7940:22;7920:52;:::i;:::-;7910:62;;7866:116;7662:327;;;;:::o;7995:349::-;8064:6;8113:2;8101:9;8092:7;8088:23;8084:32;8081:119;;;8119:79;;:::i;:::-;8081:119;8239:1;8264:63;8319:7;8310:6;8299:9;8295:22;8264:63;:::i;:::-;8254:73;;8210:127;7995:349;;;;:::o;8350:329::-;8409:6;8458:2;8446:9;8437:7;8433:23;8429:32;8426:119;;;8464:79;;:::i;:::-;8426:119;8584:1;8609:53;8654:7;8645:6;8634:9;8630:22;8609:53;:::i;:::-;8599:63;;8555:117;8350:329;;;;:::o;8685:325::-;8742:6;8791:2;8779:9;8770:7;8766:23;8762:32;8759:119;;;8797:79;;:::i;:::-;8759:119;8917:1;8942:51;8985:7;8976:6;8965:9;8961:22;8942:51;:::i;:::-;8932:61;;8888:115;8685:325;;;;:::o;9016:118::-;9103:24;9121:5;9103:24;:::i;:::-;9098:3;9091:37;9016:118;;:::o;9140:109::-;9221:21;9236:5;9221:21;:::i;:::-;9216:3;9209:34;9140:109;;:::o;9255:360::-;9341:3;9369:38;9401:5;9369:38;:::i;:::-;9423:70;9486:6;9481:3;9423:70;:::i;:::-;9416:77;;9502:52;9547:6;9542:3;9535:4;9528:5;9524:16;9502:52;:::i;:::-;9579:29;9601:6;9579:29;:::i;:::-;9574:3;9570:39;9563:46;;9345:270;9255:360;;;;:::o;9621:364::-;9709:3;9737:39;9770:5;9737:39;:::i;:::-;9792:71;9856:6;9851:3;9792:71;:::i;:::-;9785:78;;9872:52;9917:6;9912:3;9905:4;9898:5;9894:16;9872:52;:::i;:::-;9949:29;9971:6;9949:29;:::i;:::-;9944:3;9940:39;9933:46;;9713:272;9621:364;;;;:::o;9991:377::-;10097:3;10125:39;10158:5;10125:39;:::i;:::-;10180:89;10262:6;10257:3;10180:89;:::i;:::-;10173:96;;10278:52;10323:6;10318:3;10311:4;10304:5;10300:16;10278:52;:::i;:::-;10355:6;10350:3;10346:16;10339:23;;10101:267;9991:377;;;;:::o;10374:366::-;10516:3;10537:67;10601:2;10596:3;10537:67;:::i;:::-;10530:74;;10613:93;10702:3;10613:93;:::i;:::-;10731:2;10726:3;10722:12;10715:19;;10374:366;;;:::o;10746:::-;10888:3;10909:67;10973:2;10968:3;10909:67;:::i;:::-;10902:74;;10985:93;11074:3;10985:93;:::i;:::-;11103:2;11098:3;11094:12;11087:19;;10746:366;;;:::o;11118:::-;11260:3;11281:67;11345:2;11340:3;11281:67;:::i;:::-;11274:74;;11357:93;11446:3;11357:93;:::i;:::-;11475:2;11470:3;11466:12;11459:19;;11118:366;;;:::o;11490:::-;11632:3;11653:67;11717:2;11712:3;11653:67;:::i;:::-;11646:74;;11729:93;11818:3;11729:93;:::i;:::-;11847:2;11842:3;11838:12;11831:19;;11490:366;;;:::o;11862:::-;12004:3;12025:67;12089:2;12084:3;12025:67;:::i;:::-;12018:74;;12101:93;12190:3;12101:93;:::i;:::-;12219:2;12214:3;12210:12;12203:19;;11862:366;;;:::o;12234:::-;12376:3;12397:67;12461:2;12456:3;12397:67;:::i;:::-;12390:74;;12473:93;12562:3;12473:93;:::i;:::-;12591:2;12586:3;12582:12;12575:19;;12234:366;;;:::o;12606:::-;12748:3;12769:67;12833:2;12828:3;12769:67;:::i;:::-;12762:74;;12845:93;12934:3;12845:93;:::i;:::-;12963:2;12958:3;12954:12;12947:19;;12606:366;;;:::o;12978:::-;13120:3;13141:67;13205:2;13200:3;13141:67;:::i;:::-;13134:74;;13217:93;13306:3;13217:93;:::i;:::-;13335:2;13330:3;13326:12;13319:19;;12978:366;;;:::o;13350:::-;13492:3;13513:67;13577:2;13572:3;13513:67;:::i;:::-;13506:74;;13589:93;13678:3;13589:93;:::i;:::-;13707:2;13702:3;13698:12;13691:19;;13350:366;;;:::o;13722:::-;13864:3;13885:67;13949:2;13944:3;13885:67;:::i;:::-;13878:74;;13961:93;14050:3;13961:93;:::i;:::-;14079:2;14074:3;14070:12;14063:19;;13722:366;;;:::o;14094:::-;14236:3;14257:67;14321:2;14316:3;14257:67;:::i;:::-;14250:74;;14333:93;14422:3;14333:93;:::i;:::-;14451:2;14446:3;14442:12;14435:19;;14094:366;;;:::o;14466:::-;14608:3;14629:67;14693:2;14688:3;14629:67;:::i;:::-;14622:74;;14705:93;14794:3;14705:93;:::i;:::-;14823:2;14818:3;14814:12;14807:19;;14466:366;;;:::o;14838:::-;14980:3;15001:67;15065:2;15060:3;15001:67;:::i;:::-;14994:74;;15077:93;15166:3;15077:93;:::i;:::-;15195:2;15190:3;15186:12;15179:19;;14838:366;;;:::o;15210:::-;15352:3;15373:67;15437:2;15432:3;15373:67;:::i;:::-;15366:74;;15449:93;15538:3;15449:93;:::i;:::-;15567:2;15562:3;15558:12;15551:19;;15210:366;;;:::o;15582:::-;15724:3;15745:67;15809:2;15804:3;15745:67;:::i;:::-;15738:74;;15821:93;15910:3;15821:93;:::i;:::-;15939:2;15934:3;15930:12;15923:19;;15582:366;;;:::o;15954:::-;16096:3;16117:67;16181:2;16176:3;16117:67;:::i;:::-;16110:74;;16193:93;16282:3;16193:93;:::i;:::-;16311:2;16306:3;16302:12;16295:19;;15954:366;;;:::o;16326:::-;16468:3;16489:67;16553:2;16548:3;16489:67;:::i;:::-;16482:74;;16565:93;16654:3;16565:93;:::i;:::-;16683:2;16678:3;16674:12;16667:19;;16326:366;;;:::o;16698:::-;16840:3;16861:67;16925:2;16920:3;16861:67;:::i;:::-;16854:74;;16937:93;17026:3;16937:93;:::i;:::-;17055:2;17050:3;17046:12;17039:19;;16698:366;;;:::o;17070:::-;17212:3;17233:67;17297:2;17292:3;17233:67;:::i;:::-;17226:74;;17309:93;17398:3;17309:93;:::i;:::-;17427:2;17422:3;17418:12;17411:19;;17070:366;;;:::o;17442:::-;17584:3;17605:67;17669:2;17664:3;17605:67;:::i;:::-;17598:74;;17681:93;17770:3;17681:93;:::i;:::-;17799:2;17794:3;17790:12;17783:19;;17442:366;;;:::o;17814:::-;17956:3;17977:67;18041:2;18036:3;17977:67;:::i;:::-;17970:74;;18053:93;18142:3;18053:93;:::i;:::-;18171:2;18166:3;18162:12;18155:19;;17814:366;;;:::o;18186:::-;18328:3;18349:67;18413:2;18408:3;18349:67;:::i;:::-;18342:74;;18425:93;18514:3;18425:93;:::i;:::-;18543:2;18538:3;18534:12;18527:19;;18186:366;;;:::o;18558:::-;18700:3;18721:67;18785:2;18780:3;18721:67;:::i;:::-;18714:74;;18797:93;18886:3;18797:93;:::i;:::-;18915:2;18910:3;18906:12;18899:19;;18558:366;;;:::o;18930:::-;19072:3;19093:67;19157:2;19152:3;19093:67;:::i;:::-;19086:74;;19169:93;19258:3;19169:93;:::i;:::-;19287:2;19282:3;19278:12;19271:19;;18930:366;;;:::o;19302:::-;19444:3;19465:67;19529:2;19524:3;19465:67;:::i;:::-;19458:74;;19541:93;19630:3;19541:93;:::i;:::-;19659:2;19654:3;19650:12;19643:19;;19302:366;;;:::o;19674:118::-;19761:24;19779:5;19761:24;:::i;:::-;19756:3;19749:37;19674:118;;:::o;19798:112::-;19881:22;19897:5;19881:22;:::i;:::-;19876:3;19869:35;19798:112;;:::o;19916:435::-;20096:3;20118:95;20209:3;20200:6;20118:95;:::i;:::-;20111:102;;20230:95;20321:3;20312:6;20230:95;:::i;:::-;20223:102;;20342:3;20335:10;;19916:435;;;;;:::o;20357:222::-;20450:4;20488:2;20477:9;20473:18;20465:26;;20501:71;20569:1;20558:9;20554:17;20545:6;20501:71;:::i;:::-;20357:222;;;;:::o;20585:640::-;20780:4;20818:3;20807:9;20803:19;20795:27;;20832:71;20900:1;20889:9;20885:17;20876:6;20832:71;:::i;:::-;20913:72;20981:2;20970:9;20966:18;20957:6;20913:72;:::i;:::-;20995;21063:2;21052:9;21048:18;21039:6;20995:72;:::i;:::-;21114:9;21108:4;21104:20;21099:2;21088:9;21084:18;21077:48;21142:76;21213:4;21204:6;21142:76;:::i;:::-;21134:84;;20585:640;;;;;;;:::o;21231:210::-;21318:4;21356:2;21345:9;21341:18;21333:26;;21369:65;21431:1;21420:9;21416:17;21407:6;21369:65;:::i;:::-;21231:210;;;;:::o;21447:313::-;21560:4;21598:2;21587:9;21583:18;21575:26;;21647:9;21641:4;21637:20;21633:1;21622:9;21618:17;21611:47;21675:78;21748:4;21739:6;21675:78;:::i;:::-;21667:86;;21447:313;;;;:::o;21766:419::-;21932:4;21970:2;21959:9;21955:18;21947:26;;22019:9;22013:4;22009:20;22005:1;21994:9;21990:17;21983:47;22047:131;22173:4;22047:131;:::i;:::-;22039:139;;21766:419;;;:::o;22191:::-;22357:4;22395:2;22384:9;22380:18;22372:26;;22444:9;22438:4;22434:20;22430:1;22419:9;22415:17;22408:47;22472:131;22598:4;22472:131;:::i;:::-;22464:139;;22191:419;;;:::o;22616:::-;22782:4;22820:2;22809:9;22805:18;22797:26;;22869:9;22863:4;22859:20;22855:1;22844:9;22840:17;22833:47;22897:131;23023:4;22897:131;:::i;:::-;22889:139;;22616:419;;;:::o;23041:::-;23207:4;23245:2;23234:9;23230:18;23222:26;;23294:9;23288:4;23284:20;23280:1;23269:9;23265:17;23258:47;23322:131;23448:4;23322:131;:::i;:::-;23314:139;;23041:419;;;:::o;23466:::-;23632:4;23670:2;23659:9;23655:18;23647:26;;23719:9;23713:4;23709:20;23705:1;23694:9;23690:17;23683:47;23747:131;23873:4;23747:131;:::i;:::-;23739:139;;23466:419;;;:::o;23891:::-;24057:4;24095:2;24084:9;24080:18;24072:26;;24144:9;24138:4;24134:20;24130:1;24119:9;24115:17;24108:47;24172:131;24298:4;24172:131;:::i;:::-;24164:139;;23891:419;;;:::o;24316:::-;24482:4;24520:2;24509:9;24505:18;24497:26;;24569:9;24563:4;24559:20;24555:1;24544:9;24540:17;24533:47;24597:131;24723:4;24597:131;:::i;:::-;24589:139;;24316:419;;;:::o;24741:::-;24907:4;24945:2;24934:9;24930:18;24922:26;;24994:9;24988:4;24984:20;24980:1;24969:9;24965:17;24958:47;25022:131;25148:4;25022:131;:::i;:::-;25014:139;;24741:419;;;:::o;25166:::-;25332:4;25370:2;25359:9;25355:18;25347:26;;25419:9;25413:4;25409:20;25405:1;25394:9;25390:17;25383:47;25447:131;25573:4;25447:131;:::i;:::-;25439:139;;25166:419;;;:::o;25591:::-;25757:4;25795:2;25784:9;25780:18;25772:26;;25844:9;25838:4;25834:20;25830:1;25819:9;25815:17;25808:47;25872:131;25998:4;25872:131;:::i;:::-;25864:139;;25591:419;;;:::o;26016:::-;26182:4;26220:2;26209:9;26205:18;26197:26;;26269:9;26263:4;26259:20;26255:1;26244:9;26240:17;26233:47;26297:131;26423:4;26297:131;:::i;:::-;26289:139;;26016:419;;;:::o;26441:::-;26607:4;26645:2;26634:9;26630:18;26622:26;;26694:9;26688:4;26684:20;26680:1;26669:9;26665:17;26658:47;26722:131;26848:4;26722:131;:::i;:::-;26714:139;;26441:419;;;:::o;26866:::-;27032:4;27070:2;27059:9;27055:18;27047:26;;27119:9;27113:4;27109:20;27105:1;27094:9;27090:17;27083:47;27147:131;27273:4;27147:131;:::i;:::-;27139:139;;26866:419;;;:::o;27291:::-;27457:4;27495:2;27484:9;27480:18;27472:26;;27544:9;27538:4;27534:20;27530:1;27519:9;27515:17;27508:47;27572:131;27698:4;27572:131;:::i;:::-;27564:139;;27291:419;;;:::o;27716:::-;27882:4;27920:2;27909:9;27905:18;27897:26;;27969:9;27963:4;27959:20;27955:1;27944:9;27940:17;27933:47;27997:131;28123:4;27997:131;:::i;:::-;27989:139;;27716:419;;;:::o;28141:::-;28307:4;28345:2;28334:9;28330:18;28322:26;;28394:9;28388:4;28384:20;28380:1;28369:9;28365:17;28358:47;28422:131;28548:4;28422:131;:::i;:::-;28414:139;;28141:419;;;:::o;28566:::-;28732:4;28770:2;28759:9;28755:18;28747:26;;28819:9;28813:4;28809:20;28805:1;28794:9;28790:17;28783:47;28847:131;28973:4;28847:131;:::i;:::-;28839:139;;28566:419;;;:::o;28991:::-;29157:4;29195:2;29184:9;29180:18;29172:26;;29244:9;29238:4;29234:20;29230:1;29219:9;29215:17;29208:47;29272:131;29398:4;29272:131;:::i;:::-;29264:139;;28991:419;;;:::o;29416:::-;29582:4;29620:2;29609:9;29605:18;29597:26;;29669:9;29663:4;29659:20;29655:1;29644:9;29640:17;29633:47;29697:131;29823:4;29697:131;:::i;:::-;29689:139;;29416:419;;;:::o;29841:::-;30007:4;30045:2;30034:9;30030:18;30022:26;;30094:9;30088:4;30084:20;30080:1;30069:9;30065:17;30058:47;30122:131;30248:4;30122:131;:::i;:::-;30114:139;;29841:419;;;:::o;30266:::-;30432:4;30470:2;30459:9;30455:18;30447:26;;30519:9;30513:4;30509:20;30505:1;30494:9;30490:17;30483:47;30547:131;30673:4;30547:131;:::i;:::-;30539:139;;30266:419;;;:::o;30691:::-;30857:4;30895:2;30884:9;30880:18;30872:26;;30944:9;30938:4;30934:20;30930:1;30919:9;30915:17;30908:47;30972:131;31098:4;30972:131;:::i;:::-;30964:139;;30691:419;;;:::o;31116:::-;31282:4;31320:2;31309:9;31305:18;31297:26;;31369:9;31363:4;31359:20;31355:1;31344:9;31340:17;31333:47;31397:131;31523:4;31397:131;:::i;:::-;31389:139;;31116:419;;;:::o;31541:::-;31707:4;31745:2;31734:9;31730:18;31722:26;;31794:9;31788:4;31784:20;31780:1;31769:9;31765:17;31758:47;31822:131;31948:4;31822:131;:::i;:::-;31814:139;;31541:419;;;:::o;31966:::-;32132:4;32170:2;32159:9;32155:18;32147:26;;32219:9;32213:4;32209:20;32205:1;32194:9;32190:17;32183:47;32247:131;32373:4;32247:131;:::i;:::-;32239:139;;31966:419;;;:::o;32391:222::-;32484:4;32522:2;32511:9;32507:18;32499:26;;32535:71;32603:1;32592:9;32588:17;32579:6;32535:71;:::i;:::-;32391:222;;;;:::o;32619:214::-;32708:4;32746:2;32735:9;32731:18;32723:26;;32759:67;32823:1;32812:9;32808:17;32799:6;32759:67;:::i;:::-;32619:214;;;;:::o;32839:129::-;32873:6;32900:20;;:::i;:::-;32890:30;;32929:33;32957:4;32949:6;32929:33;:::i;:::-;32839:129;;;:::o;32974:75::-;33007:6;33040:2;33034:9;33024:19;;32974:75;:::o;33055:307::-;33116:4;33206:18;33198:6;33195:30;33192:56;;;33228:18;;:::i;:::-;33192:56;33266:29;33288:6;33266:29;:::i;:::-;33258:37;;33350:4;33344;33340:15;33332:23;;33055:307;;;:::o;33368:98::-;33419:6;33453:5;33447:12;33437:22;;33368:98;;;:::o;33472:99::-;33524:6;33558:5;33552:12;33542:22;;33472:99;;;:::o;33577:168::-;33660:11;33694:6;33689:3;33682:19;33734:4;33729:3;33725:14;33710:29;;33577:168;;;;:::o;33751:169::-;33835:11;33869:6;33864:3;33857:19;33909:4;33904:3;33900:14;33885:29;;33751:169;;;;:::o;33926:148::-;34028:11;34065:3;34050:18;;33926:148;;;;:::o;34080:305::-;34120:3;34139:20;34157:1;34139:20;:::i;:::-;34134:25;;34173:20;34191:1;34173:20;:::i;:::-;34168:25;;34327:1;34259:66;34255:74;34252:1;34249:81;34246:107;;;34333:18;;:::i;:::-;34246:107;34377:1;34374;34370:9;34363:16;;34080:305;;;;:::o;34391:185::-;34431:1;34448:20;34466:1;34448:20;:::i;:::-;34443:25;;34482:20;34500:1;34482:20;:::i;:::-;34477:25;;34521:1;34511:35;;34526:18;;:::i;:::-;34511:35;34568:1;34565;34561:9;34556:14;;34391:185;;;;:::o;34582:348::-;34622:7;34645:20;34663:1;34645:20;:::i;:::-;34640:25;;34679:20;34697:1;34679:20;:::i;:::-;34674:25;;34867:1;34799:66;34795:74;34792:1;34789:81;34784:1;34777:9;34770:17;34766:105;34763:131;;;34874:18;;:::i;:::-;34763:131;34922:1;34919;34915:9;34904:20;;34582:348;;;;:::o;34936:191::-;34976:4;34996:20;35014:1;34996:20;:::i;:::-;34991:25;;35030:20;35048:1;35030:20;:::i;:::-;35025:25;;35069:1;35066;35063:8;35060:34;;;35074:18;;:::i;:::-;35060:34;35119:1;35116;35112:9;35104:17;;34936:191;;;;:::o;35133:96::-;35170:7;35199:24;35217:5;35199:24;:::i;:::-;35188:35;;35133:96;;;:::o;35235:90::-;35269:7;35312:5;35305:13;35298:21;35287:32;;35235:90;;;:::o;35331:149::-;35367:7;35407:66;35400:5;35396:78;35385:89;;35331:149;;;:::o;35486:126::-;35523:7;35563:42;35556:5;35552:54;35541:65;;35486:126;;;:::o;35618:77::-;35655:7;35684:5;35673:16;;35618:77;;;:::o;35701:86::-;35736:7;35776:4;35769:5;35765:16;35754:27;;35701:86;;;:::o;35793:154::-;35877:6;35872:3;35867;35854:30;35939:1;35930:6;35925:3;35921:16;35914:27;35793:154;;;:::o;35953:307::-;36021:1;36031:113;36045:6;36042:1;36039:13;36031:113;;;36130:1;36125:3;36121:11;36115:18;36111:1;36106:3;36102:11;36095:39;36067:2;36064:1;36060:10;36055:15;;36031:113;;;36162:6;36159:1;36156:13;36153:101;;;36242:1;36233:6;36228:3;36224:16;36217:27;36153:101;36002:258;35953:307;;;:::o;36266:320::-;36310:6;36347:1;36341:4;36337:12;36327:22;;36394:1;36388:4;36384:12;36415:18;36405:81;;36471:4;36463:6;36459:17;36449:27;;36405:81;36533:2;36525:6;36522:14;36502:18;36499:38;36496:84;;;36552:18;;:::i;:::-;36496:84;36317:269;36266:320;;;:::o;36592:281::-;36675:27;36697:4;36675:27;:::i;:::-;36667:6;36663:40;36805:6;36793:10;36790:22;36769:18;36757:10;36754:34;36751:62;36748:88;;;36816:18;;:::i;:::-;36748:88;36856:10;36852:2;36845:22;36635:238;36592:281;;:::o;36879:233::-;36918:3;36941:24;36959:5;36941:24;:::i;:::-;36932:33;;36987:66;36980:5;36977:77;36974:103;;;37057:18;;:::i;:::-;36974:103;37104:1;37097:5;37093:13;37086:20;;36879:233;;;:::o;37118:176::-;37150:1;37167:20;37185:1;37167:20;:::i;:::-;37162:25;;37201:20;37219:1;37201:20;:::i;:::-;37196:25;;37240:1;37230:35;;37245:18;;:::i;:::-;37230:35;37286:1;37283;37279:9;37274:14;;37118:176;;;;:::o;37300:180::-;37348:77;37345:1;37338:88;37445:4;37442:1;37435:15;37469:4;37466:1;37459:15;37486:180;37534:77;37531:1;37524:88;37631:4;37628:1;37621:15;37655:4;37652:1;37645:15;37672:180;37720:77;37717:1;37710:88;37817:4;37814:1;37807:15;37841:4;37838:1;37831:15;37858:180;37906:77;37903:1;37896:88;38003:4;38000:1;37993:15;38027:4;38024:1;38017:15;38044:180;38092:77;38089:1;38082:88;38189:4;38186:1;38179:15;38213:4;38210:1;38203:15;38230:180;38278:77;38275:1;38268:88;38375:4;38372:1;38365:15;38399:4;38396:1;38389:15;38416:117;38525:1;38522;38515:12;38539:117;38648:1;38645;38638:12;38662:117;38771:1;38768;38761:12;38785:117;38894:1;38891;38884:12;38908:117;39017:1;39014;39007:12;39031:117;39140:1;39137;39130:12;39154:102;39195:6;39246:2;39242:7;39237:2;39230:5;39226:14;39222:28;39212:38;;39154:102;;;:::o;39262:170::-;39402:22;39398:1;39390:6;39386:14;39379:46;39262:170;:::o;39438:230::-;39578:34;39574:1;39566:6;39562:14;39555:58;39647:13;39642:2;39634:6;39630:15;39623:38;39438:230;:::o;39674:237::-;39814:34;39810:1;39802:6;39798:14;39791:58;39883:20;39878:2;39870:6;39866:15;39859:45;39674:237;:::o;39917:225::-;40057:34;40053:1;40045:6;40041:14;40034:58;40126:8;40121:2;40113:6;40109:15;40102:33;39917:225;:::o;40148:182::-;40288:34;40284:1;40276:6;40272:14;40265:58;40148:182;:::o;40336:178::-;40476:30;40472:1;40464:6;40460:14;40453:54;40336:178;:::o;40520:227::-;40660:34;40656:1;40648:6;40644:14;40637:58;40729:10;40724:2;40716:6;40712:15;40705:35;40520:227;:::o;40753:223::-;40893:34;40889:1;40881:6;40877:14;40870:58;40962:6;40957:2;40949:6;40945:15;40938:31;40753:223;:::o;40982:175::-;41122:27;41118:1;41110:6;41106:14;41099:51;40982:175;:::o;41163:231::-;41303:34;41299:1;41291:6;41287:14;41280:58;41372:14;41367:2;41359:6;41355:15;41348:39;41163:231;:::o;41400:176::-;41540:28;41536:1;41528:6;41524:14;41517:52;41400:176;:::o;41582:166::-;41722:18;41718:1;41710:6;41706:14;41699:42;41582:166;:::o;41754:232::-;41894:34;41890:1;41882:6;41878:14;41871:58;41963:15;41958:2;41950:6;41946:15;41939:40;41754:232;:::o;41992:243::-;42132:34;42128:1;42120:6;42116:14;42109:58;42201:26;42196:2;42188:6;42184:15;42177:51;41992:243;:::o;42241:229::-;42381:34;42377:1;42369:6;42365:14;42358:58;42450:12;42445:2;42437:6;42433:15;42426:37;42241:229;:::o;42476:228::-;42616:34;42612:1;42604:6;42600:14;42593:58;42685:11;42680:2;42672:6;42668:15;42661:36;42476:228;:::o;42710:182::-;42850:34;42846:1;42838:6;42834:14;42827:58;42710:182;:::o;42898:231::-;43038:34;43034:1;43026:6;43022:14;43015:58;43107:14;43102:2;43094:6;43090:15;43083:39;42898:231;:::o;43135:182::-;43275:34;43271:1;43263:6;43259:14;43252:58;43135:182;:::o;43323:228::-;43463:34;43459:1;43451:6;43447:14;43440:58;43532:11;43527:2;43519:6;43515:15;43508:36;43323:228;:::o;43557:234::-;43697:34;43693:1;43685:6;43681:14;43674:58;43766:17;43761:2;43753:6;43749:15;43742:42;43557:234;:::o;43797:220::-;43937:34;43933:1;43925:6;43921:14;43914:58;44006:3;44001:2;43993:6;43989:15;43982:28;43797:220;:::o;44023:224::-;44163:34;44159:1;44151:6;44147:14;44140:58;44232:7;44227:2;44219:6;44215:15;44208:32;44023:224;:::o;44253:236::-;44393:34;44389:1;44381:6;44377:14;44370:58;44462:19;44457:2;44449:6;44445:15;44438:44;44253:236;:::o;44495:231::-;44635:34;44631:1;44623:6;44619:14;44612:58;44704:14;44699:2;44691:6;44687:15;44680:39;44495:231;:::o;44732:122::-;44805:24;44823:5;44805:24;:::i;:::-;44798:5;44795:35;44785:63;;44844:1;44841;44834:12;44785:63;44732:122;:::o;44860:116::-;44930:21;44945:5;44930:21;:::i;:::-;44923:5;44920:32;44910:60;;44966:1;44963;44956:12;44910:60;44860:116;:::o;44982:120::-;45054:23;45071:5;45054:23;:::i;:::-;45047:5;45044:34;45034:62;;45092:1;45089;45082:12;45034:62;44982:120;:::o;45108:122::-;45181:24;45199:5;45181:24;:::i;:::-;45174:5;45171:35;45161:63;;45220:1;45217;45210:12;45161:63;45108:122;:::o;45236:118::-;45307:22;45323:5;45307:22;:::i;:::-;45300:5;45297:33;45287:61;;45344:1;45341;45334:12;45287:61;45236:118;:::o
Swarm Source
ipfs://3108711a0a2b6a63bc08b88cdc1620728e75ba94131f8b6aaf74de27d3ace793
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.