NFT
Overview
TokenID
7660
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BullsOnTheBlock
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-06-27 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } 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); } 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); } 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; } } 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; } 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); } 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); } pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } 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 () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } 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}. 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 { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || 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 Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } } 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(); } } pragma solidity ^0.8.0; contract BullsOnTheBlock is ERC721Enumerable, Ownable{ using SafeMath for uint256; using Address for address; using Strings for uint256; string public BOTB_PROVENANCE = "2b999cc660cc93fb08e2efcef4f0de598164cc2e6bfce71fddadaf38a3621ecd"; uint256 public constant NFT_PRICE = 80000000000000000; // 0.08 ETH uint public constant MAX_NFT_PURCHASE = 10; uint256 public MAX_SUPPLY = 10000; bool public saleIsActive = false; uint256 public startingIndex; uint256 public startingIndexBlock; string private _baseURIExtended; mapping (uint256 => string) _tokenURIs; constructor() ERC721("BullsOnTheBlock","BOTB"){ } function flipSaleState() public onlyOwner { saleIsActive = !saleIsActive; } function withdraw() public onlyOwner { uint balance = address(this).balance; payable(msg.sender).transfer(balance); } function reserveTokens() public onlyOwner { uint supply = totalSupply(); uint i; for (i = 0; i < 30; i++) { _safeMint(msg.sender, supply + i); } if (startingIndexBlock == 0) { startingIndexBlock = block.number; } } function mintBull(uint numberOfTokens) public payable { require(saleIsActive, "Sale is not active at the moment"); require(numberOfTokens > 0, "Number of tokens can not be less than or equal to 0"); require(totalSupply().add(numberOfTokens) <= MAX_SUPPLY, "Purchase would exceed max supply of Bulls"); require(numberOfTokens <= MAX_NFT_PURCHASE,"Can only mint up to 10 per purchase"); require(NFT_PRICE.mul(numberOfTokens) == msg.value, "Sent ether value is incorrect"); for (uint i = 0; i < numberOfTokens; i++) { _safeMint(msg.sender, totalSupply()); } } function calcStartingIndex() public onlyOwner { require(startingIndex == 0, "Starting index has already been set"); require(startingIndexBlock != 0, "Starting index has not been set yet"); startingIndex = uint(blockhash(startingIndexBlock)) % MAX_SUPPLY; // Just a sanity case in the worst case if this function is called late (EVM only stores last 256 block hashes) if(block.number.sub(startingIndexBlock) > 255) { startingIndex = uint(blockhash(block.number - 1)) % MAX_SUPPLY; } // To prevent original sequence if (startingIndex == 0) { startingIndex = startingIndex.add(1); } } function emergencySetStartingIndexBlock() public onlyOwner { require(startingIndex == 0, "Starting index is already set"); startingIndexBlock = block.number; } function _baseURI() internal view virtual override returns (string memory) { return _baseURIExtended; } // Sets base URI for all tokens, only able to be called by contract owner function setBaseURI(string memory baseURI_) external onlyOwner { _baseURIExtended = baseURI_; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(base, tokenId.toString())); } }
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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BOTB_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFT_PURCHASE","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":"NFT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"calcStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencySetStartingIndexBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintBull","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveTokens","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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndexBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060600160405280604081526020016200485d60409139600b908051906020019062000035929190620001cd565b50612710600c556000600d60006101000a81548160ff0219169083151502179055503480156200006457600080fd5b506040518060400160405280600f81526020017f42756c6c734f6e546865426c6f636b00000000000000000000000000000000008152506040518060400160405280600481526020017f424f5442000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000e9929190620001cd565b50806001908051906020019062000102929190620001cd565b505050600062000120620001c5640100000000026401000000009004565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002e2565b600033905090565b828054620001db906200027d565b90600052602060002090601f016020900481019282620001ff57600085556200024b565b82601f106200021a57805160ff19168380011785556200024b565b828001600101855582156200024b579182015b828111156200024a5782518255916020019190600101906200022d565b5b5090506200025a91906200025e565b5090565b5b80821115620002795760008160009055506001016200025f565b5090565b600060028204905060018216806200029657607f821691505b60208210811415620002ad57620002ac620002b3565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61456b80620002f26000396000f3fe60806040526004361061020b576000357c01000000000000000000000000000000000000000000000000000000009004806355f804b31161012a578063a22cb465116100bd578063e13f351a1161008c578063e13f351a146106c3578063e36d6498146106da578063e985e9c514610705578063eb8d244414610742578063f2fde38b1461076d5761020b565b8063a22cb46514610609578063b88d4fde14610632578063c87b56dd1461065b578063cb774d47146106985761020b565b8063715018a6116100f9578063715018a6146105855780637d17fcbe1461059c5780638da5cb5b146105b357806395d89b41146105de5761020b565b806355f804b3146104b75780636352211e146104e0578063676dd5631461051d57806370a08231146105485761020b565b806327ac36c4116101a257806334918dfd1161017157806334918dfd146104235780633ccfd60b1461043a57806342842e0e146104515780634f6ccce71461047a5761020b565b806327ac36c4146103795780632f745c591461039057806332cb6b0c146103cd57806334141c3b146103f85761020b565b8063081812fc116101de578063081812fc146102bf578063095ea7b3146102fc57806318160ddd1461032557806323b872dd146103505761020b565b806301ffc9a714610210578063020b39cc1461024d57806303ff8e9b1461027857806306fdde0314610294575b600080fd5b34801561021c57600080fd5b50610237600480360381019061023291906131c0565b610796565b6040516102449190613d29565b60405180910390f35b34801561025957600080fd5b50610262610810565b60405161026f91906140a6565b60405180910390f35b610292600480360381019061028d9190613253565b610815565b005b3480156102a057600080fd5b506102a96109d8565b6040516102b69190613d44565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190613253565b610a6a565b6040516102f39190613cc2565b60405180910390f35b34801561030857600080fd5b50610323600480360381019061031e9190613184565b610aef565b005b34801561033157600080fd5b5061033a610c07565b60405161034791906140a6565b60405180910390f35b34801561035c57600080fd5b506103776004803603810190610372919061307e565b610c14565b005b34801561038557600080fd5b5061038e610c74565b005b34801561039c57600080fd5b506103b760048036038101906103b29190613184565b610d47565b6040516103c491906140a6565b60405180910390f35b3480156103d957600080fd5b506103e2610dec565b6040516103ef91906140a6565b60405180910390f35b34801561040457600080fd5b5061040d610df2565b60405161041a9190613d44565b60405180910390f35b34801561042f57600080fd5b50610438610e80565b005b34801561044657600080fd5b5061044f610f28565b005b34801561045d57600080fd5b506104786004803603810190610473919061307e565b61100a565b005b34801561048657600080fd5b506104a1600480360381019061049c9190613253565b61102a565b6040516104ae91906140a6565b60405180910390f35b3480156104c357600080fd5b506104de60048036038101906104d99190613212565b6110c1565b005b3480156104ec57600080fd5b5061050760048036038101906105029190613253565b611157565b6040516105149190613cc2565b60405180910390f35b34801561052957600080fd5b50610532611209565b60405161053f91906140a6565b60405180910390f35b34801561055457600080fd5b5061056f600480360381019061056a9190613019565b611215565b60405161057c91906140a6565b60405180910390f35b34801561059157600080fd5b5061059a6112cd565b005b3480156105a857600080fd5b506105b161140a565b005b3480156105bf57600080fd5b506105c86114d4565b6040516105d59190613cc2565b60405180910390f35b3480156105ea57600080fd5b506105f36114fe565b6040516106009190613d44565b60405180910390f35b34801561061557600080fd5b50610630600480360381019061062b9190613148565b611590565b005b34801561063e57600080fd5b50610659600480360381019061065491906130cd565b611711565b005b34801561066757600080fd5b50610682600480360381019061067d9190613253565b611773565b60405161068f9190613d44565b60405180910390f35b3480156106a457600080fd5b506106ad6118e6565b6040516106ba91906140a6565b60405180910390f35b3480156106cf57600080fd5b506106d86118ec565b005b3480156106e657600080fd5b506106ef611a7b565b6040516106fc91906140a6565b60405180910390f35b34801561071157600080fd5b5061072c60048036038101906107279190613042565b611a81565b6040516107399190613d29565b60405180910390f35b34801561074e57600080fd5b50610757611b15565b6040516107649190613d29565b60405180910390f35b34801561077957600080fd5b50610794600480360381019061078f9190613019565b611b28565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610809575061080882611cd4565b5b9050919050565b600a81565b600d60009054906101000a900460ff16610864576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085b90614086565b60405180910390fd5b600081116108a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089e90613d86565b60405180910390fd5b600c546108c4826108b6610c07565b611db690919063ffffffff16565b1115610905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fc90614066565b60405180910390fd5b600a811115610949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094090613e26565b60405180910390fd5b346109658267011c37937e080000611dcc90919063ffffffff16565b146109a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099c90613f26565b60405180910390fd5b60005b818110156109d4576109c1336109bc610c07565b611de2565b80806109cc90614392565b9150506109a8565b5050565b6060600080546109e790614360565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1390614360565b8015610a605780601f10610a3557610100808354040283529160200191610a60565b820191906000526020600020905b815481529060010190602001808311610a4357829003601f168201915b5050505050905090565b6000610a7582611e00565b610ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aab90613f66565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610afa82611157565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6290613fe6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b8a611e6c565b73ffffffffffffffffffffffffffffffffffffffff161480610bb95750610bb881610bb3611e6c565b611a81565b5b610bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bef90613ec6565b60405180910390fd5b610c028383611e74565b505050565b6000600880549050905090565b610c25610c1f611e6c565b82611f2d565b610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b90614006565b60405180910390fd5b610c6f83838361200b565b505050565b610c7c611e6c565b73ffffffffffffffffffffffffffffffffffffffff16610c9a6114d4565b73ffffffffffffffffffffffffffffffffffffffff1614610cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce790613f86565b60405180910390fd5b6000610cfa610c07565b905060005b601e811015610d3057610d1d338284610d189190614195565b611de2565b8080610d2890614392565b915050610cff565b6000600f541415610d435743600f819055505b5050565b6000610d5283611215565b8210610d93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8a90613da6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600c5481565b600b8054610dff90614360565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2b90614360565b8015610e785780601f10610e4d57610100808354040283529160200191610e78565b820191906000526020600020905b815481529060010190602001808311610e5b57829003601f168201915b505050505081565b610e88611e6c565b73ffffffffffffffffffffffffffffffffffffffff16610ea66114d4565b73ffffffffffffffffffffffffffffffffffffffff1614610efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef390613f86565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b610f30611e6c565b73ffffffffffffffffffffffffffffffffffffffff16610f4e6114d4565b73ffffffffffffffffffffffffffffffffffffffff1614610fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9b90613f86565b60405180910390fd5b60003073ffffffffffffffffffffffffffffffffffffffff163190503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611006573d6000803e3d6000fd5b5050565b61102583838360405180602001604052806000815250611711565b505050565b6000611034610c07565b8210611075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106c90614026565b60405180910390fd5b600882815481106110af577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6110c9611e6c565b73ffffffffffffffffffffffffffffffffffffffff166110e76114d4565b73ffffffffffffffffffffffffffffffffffffffff161461113d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113490613f86565b60405180910390fd5b8060109080519060200190611153929190612e3d565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f790613f06565b60405180910390fd5b80915050919050565b67011c37937e08000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127d90613ee6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112d5611e6c565b73ffffffffffffffffffffffffffffffffffffffff166112f36114d4565b73ffffffffffffffffffffffffffffffffffffffff1614611349576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134090613f86565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611412611e6c565b73ffffffffffffffffffffffffffffffffffffffff166114306114d4565b73ffffffffffffffffffffffffffffffffffffffff1614611486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147d90613f86565b60405180910390fd5b6000600e54146114cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c290613ea6565b60405180910390fd5b43600f81905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461150d90614360565b80601f016020809104026020016040519081016040528092919081815260200182805461153990614360565b80156115865780601f1061155b57610100808354040283529160200191611586565b820191906000526020600020905b81548152906001019060200180831161156957829003601f168201915b5050505050905090565b611598611e6c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fd90613e66565b60405180910390fd5b8060056000611613611e6c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116c0611e6c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117059190613d29565b60405180910390a35050565b61172261171c611e6c565b83611f2d565b611761576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175890614006565b60405180910390fd5b61176d84848484612267565b50505050565b606061177e82611e00565b6117bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b490613fc6565b60405180910390fd5b60006011600084815260200190815260200160002080546117dd90614360565b80601f016020809104026020016040519081016040528092919081815260200182805461180990614360565b80156118565780601f1061182b57610100808354040283529160200191611856565b820191906000526020600020905b81548152906001019060200180831161183957829003601f168201915b5050505050905060006118676122c3565b905060008151141561187d5781925050506118e1565b6000825111156118b257808260405160200161189a929190613c9e565b604051602081830303815290604052925050506118e1565b806118bc85612355565b6040516020016118cd929190613c9e565b604051602081830303815290604052925050505b919050565b600e5481565b6118f4611e6c565b73ffffffffffffffffffffffffffffffffffffffff166119126114d4565b73ffffffffffffffffffffffffffffffffffffffff1614611968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195f90613f86565b60405180910390fd5b6000600e54146119ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a490614046565b60405180910390fd5b6000600f5414156119f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ea90613d66565b60405180910390fd5b600c54600f544060019004611a0891906143db565b600e8190555060ff611a25600f544361252190919063ffffffff16565b1115611a5157600c54600143611a3b9190614276565b4060019004611a4a91906143db565b600e819055505b6000600e541415611a7957611a726001600e54611db690919063ffffffff16565b600e819055505b565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b611b30611e6c565b73ffffffffffffffffffffffffffffffffffffffff16611b4e6114d4565b73ffffffffffffffffffffffffffffffffffffffff1614611ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9b90613f86565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0b90613de6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d9f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611daf5750611dae82612537565b5b9050919050565b60008183611dc49190614195565b905092915050565b60008183611dda919061421c565b905092915050565b611dfc8282604051806020016040528060008152506125a1565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ee783611157565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f3882611e00565b611f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6e90613e86565b60405180910390fd5b6000611f8283611157565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ff157508373ffffffffffffffffffffffffffffffffffffffff16611fd984610a6a565b73ffffffffffffffffffffffffffffffffffffffff16145b8061200257506120018185611a81565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661202b82611157565b73ffffffffffffffffffffffffffffffffffffffff1614612081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207890613fa6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e890613e46565b60405180910390fd5b6120fc8383836125fc565b612107600082611e74565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121579190614276565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121ae9190614195565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61227284848461200b565b61227e84848484612710565b6122bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b490613dc6565b60405180910390fd5b50505050565b6060601080546122d290614360565b80601f01602080910402602001604051908101604052809291908181526020018280546122fe90614360565b801561234b5780601f106123205761010080835404028352916020019161234b565b820191906000526020600020905b81548152906001019060200180831161232e57829003601f168201915b5050505050905090565b6060600082141561239d576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061251c565b600082905060005b600082146123cf5780806123b890614392565b915050600a826123c891906141eb565b91506123a5565b60008167ffffffffffffffff811115612411577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124435781602001600182028036833780820191505090505b5090505b600085146125155760018261245c9190614276565b9150600a8561246b91906143db565b60306124779190614195565b7f0100000000000000000000000000000000000000000000000000000000000000028183815181106124d2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561250e91906141eb565b9450612447565b8093505050505b919050565b6000818361252f9190614276565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6125ab83836128df565b6125b86000848484612710565b6125f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ee90613dc6565b60405180910390fd5b505050565b612607838383612aad565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561264a5761264581612ab2565b612689565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612688576126878382612afb565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126cc576126c781612c68565b61270b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461270a576127098282612dab565b5b5b505050565b60006127318473ffffffffffffffffffffffffffffffffffffffff16612e2a565b156128d2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261275a611e6c565b8786866040518563ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016127989493929190613cdd565b602060405180830381600087803b1580156127b257600080fd5b505af19250505080156127e357506040513d601f19601f820116820180604052508101906127e091906131e9565b60015b612866573d8060008114612813576040519150601f19603f3d011682016040523d82523d6000602084013e612818565b606091505b5060008151141561285e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285590613dc6565b60405180910390fd5b805181602001fd5b63150b7a027c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128d7565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561294f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294690613f46565b60405180910390fd5b61295881611e00565b15612998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298f90613e06565b60405180910390fd5b6129a4600083836125fc565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129f49190614195565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612b0884611215565b612b129190614276565b9050600060076000848152602001908152602001600020549050818114612bf7576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612c7c9190614276565b9050600060096000848152602001908152602001600020549050600060088381548110612cd2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612d1a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612d8f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612db683611215565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054612e4990614360565b90600052602060002090601f016020900481019282612e6b5760008555612eb2565b82601f10612e8457805160ff1916838001178555612eb2565b82800160010185558215612eb2579182015b82811115612eb1578251825591602001919060010190612e96565b5b509050612ebf9190612ec3565b5090565b5b80821115612edc576000816000905550600101612ec4565b5090565b6000612ef3612eee846140f2565b6140c1565b905082815260208101848484011115612f0b57600080fd5b612f1684828561431e565b509392505050565b6000612f31612f2c84614122565b6140c1565b905082815260208101848484011115612f4957600080fd5b612f5484828561431e565b509392505050565b600081359050612f6b816144d9565b92915050565b600081359050612f80816144f0565b92915050565b600081359050612f9581614507565b92915050565b600081519050612faa81614507565b92915050565b600082601f830112612fc157600080fd5b8135612fd1848260208601612ee0565b91505092915050565b600082601f830112612feb57600080fd5b8135612ffb848260208601612f1e565b91505092915050565b6000813590506130138161451e565b92915050565b60006020828403121561302b57600080fd5b600061303984828501612f5c565b91505092915050565b6000806040838503121561305557600080fd5b600061306385828601612f5c565b925050602061307485828601612f5c565b9150509250929050565b60008060006060848603121561309357600080fd5b60006130a186828701612f5c565b93505060206130b286828701612f5c565b92505060406130c386828701613004565b9150509250925092565b600080600080608085870312156130e357600080fd5b60006130f187828801612f5c565b945050602061310287828801612f5c565b935050604061311387828801613004565b925050606085013567ffffffffffffffff81111561313057600080fd5b61313c87828801612fb0565b91505092959194509250565b6000806040838503121561315b57600080fd5b600061316985828601612f5c565b925050602061317a85828601612f71565b9150509250929050565b6000806040838503121561319757600080fd5b60006131a585828601612f5c565b92505060206131b685828601613004565b9150509250929050565b6000602082840312156131d257600080fd5b60006131e084828501612f86565b91505092915050565b6000602082840312156131fb57600080fd5b600061320984828501612f9b565b91505092915050565b60006020828403121561322457600080fd5b600082013567ffffffffffffffff81111561323e57600080fd5b61324a84828501612fda565b91505092915050565b60006020828403121561326557600080fd5b600061327384828501613004565b91505092915050565b613285816142aa565b82525050565b613294816142bc565b82525050565b60006132a582614152565b6132af8185614168565b93506132bf81856020860161432d565b6132c8816144c8565b840191505092915050565b60006132de8261415d565b6132e88185614179565b93506132f881856020860161432d565b613301816144c8565b840191505092915050565b60006133178261415d565b613321818561418a565b935061333181856020860161432d565b80840191505092915050565b600061334a602383614179565b91507f5374617274696e6720696e64657820686173206e6f74206265656e207365742060008301527f79657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133b0603383614179565b91507f4e756d626572206f6620746f6b656e732063616e206e6f74206265206c65737360008301527f207468616e206f7220657175616c20746f2030000000000000000000000000006020830152604082019050919050565b6000613416602b83614179565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061347c603283614179565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006134e2602683614179565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613548601c83614179565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613588602383614179565b91507f43616e206f6e6c79206d696e7420757020746f2031302070657220707572636860008301527f61736500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006135ee602483614179565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613654601983614179565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613694602c83614179565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006136fa601d83614179565b91507f5374617274696e6720696e64657820697320616c7265616479207365740000006000830152602082019050919050565b600061373a603883614179565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006137a0602a83614179565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613806602983614179565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061386c601d83614179565b91507f53656e742065746865722076616c756520697320696e636f72726563740000006000830152602082019050919050565b60006138ac602083614179565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006138ec602c83614179565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613952602083614179565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613992602983614179565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006139f8602f83614179565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613a5e602183614179565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ac4603183614179565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613b2a602c83614179565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613b90602383614179565b91507f5374617274696e6720696e6465782068617320616c7265616479206265656e2060008301527f73657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613bf6602983614179565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f662042756c6c7300000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c5c602083614179565b91507f53616c65206973206e6f742061637469766520617420746865206d6f6d656e746000830152602082019050919050565b613c9881614314565b82525050565b6000613caa828561330c565b9150613cb6828461330c565b91508190509392505050565b6000602082019050613cd7600083018461327c565b92915050565b6000608082019050613cf2600083018761327c565b613cff602083018661327c565b613d0c6040830185613c8f565b8181036060830152613d1e818461329a565b905095945050505050565b6000602082019050613d3e600083018461328b565b92915050565b60006020820190508181036000830152613d5e81846132d3565b905092915050565b60006020820190508181036000830152613d7f8161333d565b9050919050565b60006020820190508181036000830152613d9f816133a3565b9050919050565b60006020820190508181036000830152613dbf81613409565b9050919050565b60006020820190508181036000830152613ddf8161346f565b9050919050565b60006020820190508181036000830152613dff816134d5565b9050919050565b60006020820190508181036000830152613e1f8161353b565b9050919050565b60006020820190508181036000830152613e3f8161357b565b9050919050565b60006020820190508181036000830152613e5f816135e1565b9050919050565b60006020820190508181036000830152613e7f81613647565b9050919050565b60006020820190508181036000830152613e9f81613687565b9050919050565b60006020820190508181036000830152613ebf816136ed565b9050919050565b60006020820190508181036000830152613edf8161372d565b9050919050565b60006020820190508181036000830152613eff81613793565b9050919050565b60006020820190508181036000830152613f1f816137f9565b9050919050565b60006020820190508181036000830152613f3f8161385f565b9050919050565b60006020820190508181036000830152613f5f8161389f565b9050919050565b60006020820190508181036000830152613f7f816138df565b9050919050565b60006020820190508181036000830152613f9f81613945565b9050919050565b60006020820190508181036000830152613fbf81613985565b9050919050565b60006020820190508181036000830152613fdf816139eb565b9050919050565b60006020820190508181036000830152613fff81613a51565b9050919050565b6000602082019050818103600083015261401f81613ab7565b9050919050565b6000602082019050818103600083015261403f81613b1d565b9050919050565b6000602082019050818103600083015261405f81613b83565b9050919050565b6000602082019050818103600083015261407f81613be9565b9050919050565b6000602082019050818103600083015261409f81613c4f565b9050919050565b60006020820190506140bb6000830184613c8f565b92915050565b6000604051905081810181811067ffffffffffffffff821117156140e8576140e7614499565b5b8060405250919050565b600067ffffffffffffffff82111561410d5761410c614499565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561413d5761413c614499565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006141a082614314565b91506141ab83614314565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141e0576141df61440c565b5b828201905092915050565b60006141f682614314565b915061420183614314565b9250826142115761421061443b565b5b828204905092915050565b600061422782614314565b915061423283614314565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561426b5761426a61440c565b5b828202905092915050565b600061428182614314565b915061428c83614314565b92508282101561429f5761429e61440c565b5b828203905092915050565b60006142b5826142f4565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561434b578082015181840152602081019050614330565b8381111561435a576000848401525b50505050565b6000600282049050600182168061437857607f821691505b6020821081141561438c5761438b61446a565b5b50919050565b600061439d82614314565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143d0576143cf61440c565b5b600182019050919050565b60006143e682614314565b91506143f183614314565b9250826144015761440061443b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6144e2816142aa565b81146144ed57600080fd5b50565b6144f9816142bc565b811461450457600080fd5b50565b614510816142c8565b811461451b57600080fd5b50565b61452781614314565b811461453257600080fd5b5056fea2646970667358221220400f8bc7f0dbbc24f225e6543c11ea45a550f9f4c7cc09f6f6ea77a0a706f19064736f6c6343000800003332623939396363363630636339336662303865326566636566346630646535393831363463633265366266636537316664646164616633386133363231656364
Deployed Bytecode
0x60806040526004361061020b576000357c01000000000000000000000000000000000000000000000000000000009004806355f804b31161012a578063a22cb465116100bd578063e13f351a1161008c578063e13f351a146106c3578063e36d6498146106da578063e985e9c514610705578063eb8d244414610742578063f2fde38b1461076d5761020b565b8063a22cb46514610609578063b88d4fde14610632578063c87b56dd1461065b578063cb774d47146106985761020b565b8063715018a6116100f9578063715018a6146105855780637d17fcbe1461059c5780638da5cb5b146105b357806395d89b41146105de5761020b565b806355f804b3146104b75780636352211e146104e0578063676dd5631461051d57806370a08231146105485761020b565b806327ac36c4116101a257806334918dfd1161017157806334918dfd146104235780633ccfd60b1461043a57806342842e0e146104515780634f6ccce71461047a5761020b565b806327ac36c4146103795780632f745c591461039057806332cb6b0c146103cd57806334141c3b146103f85761020b565b8063081812fc116101de578063081812fc146102bf578063095ea7b3146102fc57806318160ddd1461032557806323b872dd146103505761020b565b806301ffc9a714610210578063020b39cc1461024d57806303ff8e9b1461027857806306fdde0314610294575b600080fd5b34801561021c57600080fd5b50610237600480360381019061023291906131c0565b610796565b6040516102449190613d29565b60405180910390f35b34801561025957600080fd5b50610262610810565b60405161026f91906140a6565b60405180910390f35b610292600480360381019061028d9190613253565b610815565b005b3480156102a057600080fd5b506102a96109d8565b6040516102b69190613d44565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190613253565b610a6a565b6040516102f39190613cc2565b60405180910390f35b34801561030857600080fd5b50610323600480360381019061031e9190613184565b610aef565b005b34801561033157600080fd5b5061033a610c07565b60405161034791906140a6565b60405180910390f35b34801561035c57600080fd5b506103776004803603810190610372919061307e565b610c14565b005b34801561038557600080fd5b5061038e610c74565b005b34801561039c57600080fd5b506103b760048036038101906103b29190613184565b610d47565b6040516103c491906140a6565b60405180910390f35b3480156103d957600080fd5b506103e2610dec565b6040516103ef91906140a6565b60405180910390f35b34801561040457600080fd5b5061040d610df2565b60405161041a9190613d44565b60405180910390f35b34801561042f57600080fd5b50610438610e80565b005b34801561044657600080fd5b5061044f610f28565b005b34801561045d57600080fd5b506104786004803603810190610473919061307e565b61100a565b005b34801561048657600080fd5b506104a1600480360381019061049c9190613253565b61102a565b6040516104ae91906140a6565b60405180910390f35b3480156104c357600080fd5b506104de60048036038101906104d99190613212565b6110c1565b005b3480156104ec57600080fd5b5061050760048036038101906105029190613253565b611157565b6040516105149190613cc2565b60405180910390f35b34801561052957600080fd5b50610532611209565b60405161053f91906140a6565b60405180910390f35b34801561055457600080fd5b5061056f600480360381019061056a9190613019565b611215565b60405161057c91906140a6565b60405180910390f35b34801561059157600080fd5b5061059a6112cd565b005b3480156105a857600080fd5b506105b161140a565b005b3480156105bf57600080fd5b506105c86114d4565b6040516105d59190613cc2565b60405180910390f35b3480156105ea57600080fd5b506105f36114fe565b6040516106009190613d44565b60405180910390f35b34801561061557600080fd5b50610630600480360381019061062b9190613148565b611590565b005b34801561063e57600080fd5b50610659600480360381019061065491906130cd565b611711565b005b34801561066757600080fd5b50610682600480360381019061067d9190613253565b611773565b60405161068f9190613d44565b60405180910390f35b3480156106a457600080fd5b506106ad6118e6565b6040516106ba91906140a6565b60405180910390f35b3480156106cf57600080fd5b506106d86118ec565b005b3480156106e657600080fd5b506106ef611a7b565b6040516106fc91906140a6565b60405180910390f35b34801561071157600080fd5b5061072c60048036038101906107279190613042565b611a81565b6040516107399190613d29565b60405180910390f35b34801561074e57600080fd5b50610757611b15565b6040516107649190613d29565b60405180910390f35b34801561077957600080fd5b50610794600480360381019061078f9190613019565b611b28565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610809575061080882611cd4565b5b9050919050565b600a81565b600d60009054906101000a900460ff16610864576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085b90614086565b60405180910390fd5b600081116108a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089e90613d86565b60405180910390fd5b600c546108c4826108b6610c07565b611db690919063ffffffff16565b1115610905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fc90614066565b60405180910390fd5b600a811115610949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094090613e26565b60405180910390fd5b346109658267011c37937e080000611dcc90919063ffffffff16565b146109a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099c90613f26565b60405180910390fd5b60005b818110156109d4576109c1336109bc610c07565b611de2565b80806109cc90614392565b9150506109a8565b5050565b6060600080546109e790614360565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1390614360565b8015610a605780601f10610a3557610100808354040283529160200191610a60565b820191906000526020600020905b815481529060010190602001808311610a4357829003601f168201915b5050505050905090565b6000610a7582611e00565b610ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aab90613f66565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610afa82611157565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6290613fe6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b8a611e6c565b73ffffffffffffffffffffffffffffffffffffffff161480610bb95750610bb881610bb3611e6c565b611a81565b5b610bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bef90613ec6565b60405180910390fd5b610c028383611e74565b505050565b6000600880549050905090565b610c25610c1f611e6c565b82611f2d565b610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b90614006565b60405180910390fd5b610c6f83838361200b565b505050565b610c7c611e6c565b73ffffffffffffffffffffffffffffffffffffffff16610c9a6114d4565b73ffffffffffffffffffffffffffffffffffffffff1614610cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce790613f86565b60405180910390fd5b6000610cfa610c07565b905060005b601e811015610d3057610d1d338284610d189190614195565b611de2565b8080610d2890614392565b915050610cff565b6000600f541415610d435743600f819055505b5050565b6000610d5283611215565b8210610d93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8a90613da6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600c5481565b600b8054610dff90614360565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2b90614360565b8015610e785780601f10610e4d57610100808354040283529160200191610e78565b820191906000526020600020905b815481529060010190602001808311610e5b57829003601f168201915b505050505081565b610e88611e6c565b73ffffffffffffffffffffffffffffffffffffffff16610ea66114d4565b73ffffffffffffffffffffffffffffffffffffffff1614610efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef390613f86565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b610f30611e6c565b73ffffffffffffffffffffffffffffffffffffffff16610f4e6114d4565b73ffffffffffffffffffffffffffffffffffffffff1614610fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9b90613f86565b60405180910390fd5b60003073ffffffffffffffffffffffffffffffffffffffff163190503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611006573d6000803e3d6000fd5b5050565b61102583838360405180602001604052806000815250611711565b505050565b6000611034610c07565b8210611075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106c90614026565b60405180910390fd5b600882815481106110af577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6110c9611e6c565b73ffffffffffffffffffffffffffffffffffffffff166110e76114d4565b73ffffffffffffffffffffffffffffffffffffffff161461113d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113490613f86565b60405180910390fd5b8060109080519060200190611153929190612e3d565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f790613f06565b60405180910390fd5b80915050919050565b67011c37937e08000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127d90613ee6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112d5611e6c565b73ffffffffffffffffffffffffffffffffffffffff166112f36114d4565b73ffffffffffffffffffffffffffffffffffffffff1614611349576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134090613f86565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611412611e6c565b73ffffffffffffffffffffffffffffffffffffffff166114306114d4565b73ffffffffffffffffffffffffffffffffffffffff1614611486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147d90613f86565b60405180910390fd5b6000600e54146114cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c290613ea6565b60405180910390fd5b43600f81905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461150d90614360565b80601f016020809104026020016040519081016040528092919081815260200182805461153990614360565b80156115865780601f1061155b57610100808354040283529160200191611586565b820191906000526020600020905b81548152906001019060200180831161156957829003601f168201915b5050505050905090565b611598611e6c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fd90613e66565b60405180910390fd5b8060056000611613611e6c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116c0611e6c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117059190613d29565b60405180910390a35050565b61172261171c611e6c565b83611f2d565b611761576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175890614006565b60405180910390fd5b61176d84848484612267565b50505050565b606061177e82611e00565b6117bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b490613fc6565b60405180910390fd5b60006011600084815260200190815260200160002080546117dd90614360565b80601f016020809104026020016040519081016040528092919081815260200182805461180990614360565b80156118565780601f1061182b57610100808354040283529160200191611856565b820191906000526020600020905b81548152906001019060200180831161183957829003601f168201915b5050505050905060006118676122c3565b905060008151141561187d5781925050506118e1565b6000825111156118b257808260405160200161189a929190613c9e565b604051602081830303815290604052925050506118e1565b806118bc85612355565b6040516020016118cd929190613c9e565b604051602081830303815290604052925050505b919050565b600e5481565b6118f4611e6c565b73ffffffffffffffffffffffffffffffffffffffff166119126114d4565b73ffffffffffffffffffffffffffffffffffffffff1614611968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195f90613f86565b60405180910390fd5b6000600e54146119ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a490614046565b60405180910390fd5b6000600f5414156119f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ea90613d66565b60405180910390fd5b600c54600f544060019004611a0891906143db565b600e8190555060ff611a25600f544361252190919063ffffffff16565b1115611a5157600c54600143611a3b9190614276565b4060019004611a4a91906143db565b600e819055505b6000600e541415611a7957611a726001600e54611db690919063ffffffff16565b600e819055505b565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b611b30611e6c565b73ffffffffffffffffffffffffffffffffffffffff16611b4e6114d4565b73ffffffffffffffffffffffffffffffffffffffff1614611ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9b90613f86565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0b90613de6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d9f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611daf5750611dae82612537565b5b9050919050565b60008183611dc49190614195565b905092915050565b60008183611dda919061421c565b905092915050565b611dfc8282604051806020016040528060008152506125a1565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ee783611157565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f3882611e00565b611f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6e90613e86565b60405180910390fd5b6000611f8283611157565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ff157508373ffffffffffffffffffffffffffffffffffffffff16611fd984610a6a565b73ffffffffffffffffffffffffffffffffffffffff16145b8061200257506120018185611a81565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661202b82611157565b73ffffffffffffffffffffffffffffffffffffffff1614612081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207890613fa6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e890613e46565b60405180910390fd5b6120fc8383836125fc565b612107600082611e74565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121579190614276565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121ae9190614195565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61227284848461200b565b61227e84848484612710565b6122bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b490613dc6565b60405180910390fd5b50505050565b6060601080546122d290614360565b80601f01602080910402602001604051908101604052809291908181526020018280546122fe90614360565b801561234b5780601f106123205761010080835404028352916020019161234b565b820191906000526020600020905b81548152906001019060200180831161232e57829003601f168201915b5050505050905090565b6060600082141561239d576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061251c565b600082905060005b600082146123cf5780806123b890614392565b915050600a826123c891906141eb565b91506123a5565b60008167ffffffffffffffff811115612411577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124435781602001600182028036833780820191505090505b5090505b600085146125155760018261245c9190614276565b9150600a8561246b91906143db565b60306124779190614195565b7f0100000000000000000000000000000000000000000000000000000000000000028183815181106124d2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561250e91906141eb565b9450612447565b8093505050505b919050565b6000818361252f9190614276565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6125ab83836128df565b6125b86000848484612710565b6125f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ee90613dc6565b60405180910390fd5b505050565b612607838383612aad565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561264a5761264581612ab2565b612689565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612688576126878382612afb565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126cc576126c781612c68565b61270b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461270a576127098282612dab565b5b5b505050565b60006127318473ffffffffffffffffffffffffffffffffffffffff16612e2a565b156128d2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261275a611e6c565b8786866040518563ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016127989493929190613cdd565b602060405180830381600087803b1580156127b257600080fd5b505af19250505080156127e357506040513d601f19601f820116820180604052508101906127e091906131e9565b60015b612866573d8060008114612813576040519150601f19603f3d011682016040523d82523d6000602084013e612818565b606091505b5060008151141561285e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285590613dc6565b60405180910390fd5b805181602001fd5b63150b7a027c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128d7565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561294f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294690613f46565b60405180910390fd5b61295881611e00565b15612998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298f90613e06565b60405180910390fd5b6129a4600083836125fc565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129f49190614195565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612b0884611215565b612b129190614276565b9050600060076000848152602001908152602001600020549050818114612bf7576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612c7c9190614276565b9050600060096000848152602001908152602001600020549050600060088381548110612cd2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612d1a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612d8f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612db683611215565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054612e4990614360565b90600052602060002090601f016020900481019282612e6b5760008555612eb2565b82601f10612e8457805160ff1916838001178555612eb2565b82800160010185558215612eb2579182015b82811115612eb1578251825591602001919060010190612e96565b5b509050612ebf9190612ec3565b5090565b5b80821115612edc576000816000905550600101612ec4565b5090565b6000612ef3612eee846140f2565b6140c1565b905082815260208101848484011115612f0b57600080fd5b612f1684828561431e565b509392505050565b6000612f31612f2c84614122565b6140c1565b905082815260208101848484011115612f4957600080fd5b612f5484828561431e565b509392505050565b600081359050612f6b816144d9565b92915050565b600081359050612f80816144f0565b92915050565b600081359050612f9581614507565b92915050565b600081519050612faa81614507565b92915050565b600082601f830112612fc157600080fd5b8135612fd1848260208601612ee0565b91505092915050565b600082601f830112612feb57600080fd5b8135612ffb848260208601612f1e565b91505092915050565b6000813590506130138161451e565b92915050565b60006020828403121561302b57600080fd5b600061303984828501612f5c565b91505092915050565b6000806040838503121561305557600080fd5b600061306385828601612f5c565b925050602061307485828601612f5c565b9150509250929050565b60008060006060848603121561309357600080fd5b60006130a186828701612f5c565b93505060206130b286828701612f5c565b92505060406130c386828701613004565b9150509250925092565b600080600080608085870312156130e357600080fd5b60006130f187828801612f5c565b945050602061310287828801612f5c565b935050604061311387828801613004565b925050606085013567ffffffffffffffff81111561313057600080fd5b61313c87828801612fb0565b91505092959194509250565b6000806040838503121561315b57600080fd5b600061316985828601612f5c565b925050602061317a85828601612f71565b9150509250929050565b6000806040838503121561319757600080fd5b60006131a585828601612f5c565b92505060206131b685828601613004565b9150509250929050565b6000602082840312156131d257600080fd5b60006131e084828501612f86565b91505092915050565b6000602082840312156131fb57600080fd5b600061320984828501612f9b565b91505092915050565b60006020828403121561322457600080fd5b600082013567ffffffffffffffff81111561323e57600080fd5b61324a84828501612fda565b91505092915050565b60006020828403121561326557600080fd5b600061327384828501613004565b91505092915050565b613285816142aa565b82525050565b613294816142bc565b82525050565b60006132a582614152565b6132af8185614168565b93506132bf81856020860161432d565b6132c8816144c8565b840191505092915050565b60006132de8261415d565b6132e88185614179565b93506132f881856020860161432d565b613301816144c8565b840191505092915050565b60006133178261415d565b613321818561418a565b935061333181856020860161432d565b80840191505092915050565b600061334a602383614179565b91507f5374617274696e6720696e64657820686173206e6f74206265656e207365742060008301527f79657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133b0603383614179565b91507f4e756d626572206f6620746f6b656e732063616e206e6f74206265206c65737360008301527f207468616e206f7220657175616c20746f2030000000000000000000000000006020830152604082019050919050565b6000613416602b83614179565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061347c603283614179565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006134e2602683614179565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613548601c83614179565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613588602383614179565b91507f43616e206f6e6c79206d696e7420757020746f2031302070657220707572636860008301527f61736500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006135ee602483614179565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613654601983614179565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613694602c83614179565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006136fa601d83614179565b91507f5374617274696e6720696e64657820697320616c7265616479207365740000006000830152602082019050919050565b600061373a603883614179565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006137a0602a83614179565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613806602983614179565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061386c601d83614179565b91507f53656e742065746865722076616c756520697320696e636f72726563740000006000830152602082019050919050565b60006138ac602083614179565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006138ec602c83614179565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613952602083614179565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613992602983614179565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006139f8602f83614179565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613a5e602183614179565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ac4603183614179565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613b2a602c83614179565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613b90602383614179565b91507f5374617274696e6720696e6465782068617320616c7265616479206265656e2060008301527f73657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613bf6602983614179565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f662042756c6c7300000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c5c602083614179565b91507f53616c65206973206e6f742061637469766520617420746865206d6f6d656e746000830152602082019050919050565b613c9881614314565b82525050565b6000613caa828561330c565b9150613cb6828461330c565b91508190509392505050565b6000602082019050613cd7600083018461327c565b92915050565b6000608082019050613cf2600083018761327c565b613cff602083018661327c565b613d0c6040830185613c8f565b8181036060830152613d1e818461329a565b905095945050505050565b6000602082019050613d3e600083018461328b565b92915050565b60006020820190508181036000830152613d5e81846132d3565b905092915050565b60006020820190508181036000830152613d7f8161333d565b9050919050565b60006020820190508181036000830152613d9f816133a3565b9050919050565b60006020820190508181036000830152613dbf81613409565b9050919050565b60006020820190508181036000830152613ddf8161346f565b9050919050565b60006020820190508181036000830152613dff816134d5565b9050919050565b60006020820190508181036000830152613e1f8161353b565b9050919050565b60006020820190508181036000830152613e3f8161357b565b9050919050565b60006020820190508181036000830152613e5f816135e1565b9050919050565b60006020820190508181036000830152613e7f81613647565b9050919050565b60006020820190508181036000830152613e9f81613687565b9050919050565b60006020820190508181036000830152613ebf816136ed565b9050919050565b60006020820190508181036000830152613edf8161372d565b9050919050565b60006020820190508181036000830152613eff81613793565b9050919050565b60006020820190508181036000830152613f1f816137f9565b9050919050565b60006020820190508181036000830152613f3f8161385f565b9050919050565b60006020820190508181036000830152613f5f8161389f565b9050919050565b60006020820190508181036000830152613f7f816138df565b9050919050565b60006020820190508181036000830152613f9f81613945565b9050919050565b60006020820190508181036000830152613fbf81613985565b9050919050565b60006020820190508181036000830152613fdf816139eb565b9050919050565b60006020820190508181036000830152613fff81613a51565b9050919050565b6000602082019050818103600083015261401f81613ab7565b9050919050565b6000602082019050818103600083015261403f81613b1d565b9050919050565b6000602082019050818103600083015261405f81613b83565b9050919050565b6000602082019050818103600083015261407f81613be9565b9050919050565b6000602082019050818103600083015261409f81613c4f565b9050919050565b60006020820190506140bb6000830184613c8f565b92915050565b6000604051905081810181811067ffffffffffffffff821117156140e8576140e7614499565b5b8060405250919050565b600067ffffffffffffffff82111561410d5761410c614499565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561413d5761413c614499565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006141a082614314565b91506141ab83614314565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141e0576141df61440c565b5b828201905092915050565b60006141f682614314565b915061420183614314565b9250826142115761421061443b565b5b828204905092915050565b600061422782614314565b915061423283614314565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561426b5761426a61440c565b5b828202905092915050565b600061428182614314565b915061428c83614314565b92508282101561429f5761429e61440c565b5b828203905092915050565b60006142b5826142f4565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561434b578082015181840152602081019050614330565b8381111561435a576000848401525b50505050565b6000600282049050600182168061437857607f821691505b6020821081141561438c5761438b61446a565b5b50919050565b600061439d82614314565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143d0576143cf61440c565b5b600182019050919050565b60006143e682614314565b91506143f183614314565b9250826144015761440061443b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6144e2816142aa565b81146144ed57600080fd5b50565b6144f9816142bc565b811461450457600080fd5b50565b614510816142c8565b811461451b57600080fd5b50565b61452781614314565b811461453257600080fd5b5056fea2646970667358221220400f8bc7f0dbbc24f225e6543c11ea45a550f9f4c7cc09f6f6ea77a0a706f19064736f6c63430008000033
Deployed Bytecode Sourcemap
48956:3903:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42800:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49292:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50200:639;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31087:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32547:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32084:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43453:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33437:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49891:301;;;;;;;;;;;;;:::i;:::-;;43121:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49341:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49115:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49646:89;;;;;;;;;;;;;:::i;:::-;;49743:140;;;;;;;;;;;;;:::i;:::-;;33813:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43643:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51946:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30781:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49220:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30511:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28339:148;;;;;;;;;;;;;:::i;:::-;;51552:182;;;;;;;;;;;;;:::i;:::-;;27688:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31256:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32840:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34035:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52063:793;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49422:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50847:697;;;;;;;;;;;;;:::i;:::-;;49457:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33206:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49381:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28642:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42800:237;42902:4;42941:35;42926:50;;;:11;:50;;;;:103;;;;42993:36;43017:11;42993:23;:36::i;:::-;42926:103;42919:110;;42800:237;;;:::o;49292:42::-;49332:2;49292:42;:::o;50200:639::-;50273:12;;;;;;;;;;;50265:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50358:1;50341:14;:18;50333:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;50471:10;;50434:33;50452:14;50434:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:47;;50426:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;49332:2;50546:14;:34;;50538:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50671:9;50638:29;50652:14;49256:17;50638:13;;:29;;;;:::i;:::-;:42;50630:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;50732:6;50727:105;50748:14;50744:1;:18;50727:105;;;50784:36;50794:10;50806:13;:11;:13::i;:::-;50784:9;:36::i;:::-;50764:3;;;;;:::i;:::-;;;;50727:105;;;;50200:639;:::o;31087:100::-;31141:13;31174:5;31167:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31087:100;:::o;32547:221::-;32623:7;32651:16;32659:7;32651;:16::i;:::-;32643:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32736:15;:24;32752:7;32736:24;;;;;;;;;;;;;;;;;;;;;32729:31;;32547:221;;;:::o;32084:397::-;32165:13;32181:23;32196:7;32181:14;:23::i;:::-;32165:39;;32229:5;32223:11;;:2;:11;;;;32215:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32309:5;32293:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32318:37;32335:5;32342:12;:10;:12::i;:::-;32318:16;:37::i;:::-;32293:62;32285:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32452:21;32461:2;32465:7;32452:8;:21::i;:::-;32084:397;;;:::o;43453:113::-;43514:7;43541:10;:17;;;;43534:24;;43453:113;:::o;33437:305::-;33598:41;33617:12;:10;:12::i;:::-;33631:7;33598:18;:41::i;:::-;33590:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33706:28;33716:4;33722:2;33726:7;33706:9;:28::i;:::-;33437:305;;;:::o;49891:301::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49944:11:::1;49958:13;:11;:13::i;:::-;49944:27;;49982:6;49999:85;50015:2;50011:1;:6;49999:85;;;50039:33;50049:10;50070:1;50061:6;:10;;;;:::i;:::-;50039:9;:33::i;:::-;50019:3;;;;;:::i;:::-;;;;49999:85;;;50122:1;50100:18;;:23;50096:89;;;50161:12;50140:18;:33;;;;50096:89;27979:1;;49891:301::o:0;43121:256::-;43218:7;43254:23;43271:5;43254:16;:23::i;:::-;43246:5;:31;43238:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43343:12;:19;43356:5;43343:19;;;;;;;;;;;;;;;:26;43363:5;43343:26;;;;;;;;;;;;43336:33;;43121:256;;;;:::o;49341:33::-;;;;:::o;49115:98::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49646:89::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49715:12:::1;;;;;;;;;;;49714:13;49699:12;;:28;;;;;;;;;;;;;;;;;;49646:89::o:0;49743:140::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49791:12:::1;49814:4;49806:21;;;49791:36;;49846:10;49838:28;;:37;49867:7;49838:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;27979:1;49743:140::o:0;33813:151::-;33917:39;33934:4;33940:2;33944:7;33917:39;;;;;;;;;;;;:16;:39::i;:::-;33813:151;;;:::o;43643:233::-;43718:7;43754:30;:28;:30::i;:::-;43746:5;:38;43738:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;43851:10;43862:5;43851:17;;;;;;;;;;;;;;;;;;;;;;;;43844:24;;43643:233;;;:::o;51946:109::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52039:8:::1;52020:16;:27;;;;;;;;;;;;:::i;:::-;;51946:109:::0;:::o;30781:239::-;30853:7;30873:13;30889:7;:16;30897:7;30889:16;;;;;;;;;;;;;;;;;;;;;30873:32;;30941:1;30924:19;;:5;:19;;;;30916:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31007:5;31000:12;;;30781:239;;;:::o;49220:53::-;49256:17;49220:53;:::o;30511:208::-;30583:7;30628:1;30611:19;;:5;:19;;;;30603:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30695:9;:16;30705:5;30695:16;;;;;;;;;;;;;;;;30688:23;;30511:208;;;:::o;28339:148::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28446:1:::1;28409:40;;28430:6;;;;;;;;;;;28409:40;;;;;;;;;;;;28477:1;28460:6;;:19;;;;;;;;;;;;;;;;;;28339:148::o:0;51552:182::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51647:1:::1;51630:13;;:18;51622:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;51714:12;51693:18;:33;;;;51552:182::o:0;27688:87::-;27734:7;27761:6;;;;;;;;;;;27754:13;;27688:87;:::o;31256:104::-;31312:13;31345:7;31338:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31256:104;:::o;32840:295::-;32955:12;:10;:12::i;:::-;32943:24;;:8;:24;;;;32935:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;33055:8;33010:18;:32;33029:12;:10;:12::i;:::-;33010:32;;;;;;;;;;;;;;;:42;33043:8;33010:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;33108:8;33079:48;;33094:12;:10;:12::i;:::-;33079:48;;;33118:8;33079:48;;;;;;:::i;:::-;;;;;;;;32840:295;;:::o;34035:285::-;34167:41;34186:12;:10;:12::i;:::-;34200:7;34167:18;:41::i;:::-;34159:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34273:39;34287:4;34293:2;34297:7;34306:5;34273:13;:39::i;:::-;34035:285;;;;:::o;52063:793::-;52136:13;52170:16;52178:7;52170;:16::i;:::-;52162:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52251:23;52277:10;:19;52288:7;52277:19;;;;;;;;;;;52251:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52307:18;52328:10;:8;:10::i;:::-;52307:31;;52436:1;52420:4;52414:18;:23;52410:72;;;52461:9;52454:16;;;;;;52410:72;52612:1;52592:9;52586:23;:27;52582:108;;;52661:4;52667:9;52644:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52630:48;;;;;;52582:108;52822:4;52828:18;:7;:16;:18::i;:::-;52805:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52791:57;;;;52063:793;;;;:::o;49422:28::-;;;;:::o;50847:697::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50929:1:::1;50912:13;;:18;50904:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;51011:1;50989:18;;:23;;50981:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;51119:10;;51096:18;;51086:29;51081:35;;;:48;;;;:::i;:::-;51065:13;:64;;;;51303:3;51264:36;51281:18;;51264:12;:16;;:36;;;;:::i;:::-;:42;51261:136;;;51375:10;;51369:1;51354:12;:16;;;;:::i;:::-;51344:27;51339:33;;;:46;;;;:::i;:::-;51323:13;:62;;;;51261:136;51471:1;51454:13;;:18;51450:87;;;51505:20;51523:1;51505:13;;:17;;:20;;;;:::i;:::-;51489:13;:36;;;;51450:87;50847:697::o:0;49457:33::-;;;;:::o;33206:164::-;33303:4;33327:18;:25;33346:5;33327:25;;;;;;;;;;;;;;;:35;33353:8;33327:35;;;;;;;;;;;;;;;;;;;;;;;;;33320:42;;33206:164;;;;:::o;49381:32::-;;;;;;;;;;;;;:::o;28642:244::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28751:1:::1;28731:22;;:8;:22;;;;28723:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28841:8;28812:38;;28833:6;;;;;;;;;;;28812:38;;;;;;;;;;;;28870:8;28861:6;;:17;;;;;;;;;;;;;;;;;;28642:244:::0;:::o;30155:292::-;30257:4;30296:25;30281:40;;;:11;:40;;;;:105;;;;30353:33;30338:48;;;:11;:48;;;;30281:105;:158;;;;30403:36;30427:11;30403:23;:36::i;:::-;30281:158;30274:165;;30155:292;;;:::o;2763:98::-;2821:7;2852:1;2848;:5;;;;:::i;:::-;2841:12;;2763:98;;;;:::o;3501:::-;3559:7;3590:1;3586;:5;;;;:::i;:::-;3579:12;;3501:98;;;;:::o;36771:110::-;36847:26;36857:2;36861:7;36847:26;;;;;;;;;;;;:9;:26::i;:::-;36771:110;;:::o;35787:127::-;35852:4;35904:1;35876:30;;:7;:16;35884:7;35876:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35869:37;;35787:127;;;:::o;26305:98::-;26358:7;26385:10;26378:17;;26305:98;:::o;39664:174::-;39766:2;39739:15;:24;39755:7;39739:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39822:7;39818:2;39784:46;;39793:23;39808:7;39793:14;:23::i;:::-;39784:46;;;;;;;;;;;;39664:174;;:::o;36081:348::-;36174:4;36199:16;36207:7;36199;:16::i;:::-;36191:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36275:13;36291:23;36306:7;36291:14;:23::i;:::-;36275:39;;36344:5;36333:16;;:7;:16;;;:51;;;;36377:7;36353:31;;:20;36365:7;36353:11;:20::i;:::-;:31;;;36333:51;:87;;;;36388:32;36405:5;36412:7;36388:16;:32::i;:::-;36333:87;36325:96;;;36081:348;;;;:::o;39002:544::-;39127:4;39100:31;;:23;39115:7;39100:14;:23::i;:::-;:31;;;39092:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39210:1;39196:16;;:2;:16;;;;39188:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39266:39;39287:4;39293:2;39297:7;39266:20;:39::i;:::-;39370:29;39387:1;39391:7;39370:8;:29::i;:::-;39431:1;39412:9;:15;39422:4;39412:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39460:1;39443:9;:13;39453:2;39443:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39491:2;39472:7;:16;39480:7;39472:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39530:7;39526:2;39511:27;;39520:4;39511:27;;;;;;;;;;;;39002:544;;;:::o;35202:272::-;35316:28;35326:4;35332:2;35336:7;35316:9;:28::i;:::-;35363:48;35386:4;35392:2;35396:7;35405:5;35363:22;:48::i;:::-;35355:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35202:272;;;;:::o;51742:117::-;51802:13;51835:16;51828:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51742:117;:::o;7304:723::-;7360:13;7590:1;7581:5;:10;7577:53;;;7608:10;;;;;;;;;;;;;;;;;;;;;7577:53;7640:12;7655:5;7640:20;;7671:14;7696:78;7711:1;7703:4;:9;7696:78;;7729:8;;;;;:::i;:::-;;;;7760:2;7752:10;;;;;:::i;:::-;;;7696:78;;;7784:19;7816:6;7806:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7784:39;;7834:154;7850:1;7841:5;:10;7834:154;;7878:1;7868:11;;;;;:::i;:::-;;;7945:2;7937:5;:10;;;;:::i;:::-;7924:2;:24;;;;:::i;:::-;7911:39;;7894:6;7901;7894:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;7974:2;7965:11;;;;;:::i;:::-;;;7834:154;;;8012:6;7998:21;;;;;7304:723;;;;:::o;3144:98::-;3202:7;3233:1;3229;:5;;;;:::i;:::-;3222:12;;3144:98;;;;:::o;19378:157::-;19463:4;19502:25;19487:40;;;:11;:40;;;;19480:47;;19378:157;;;:::o;37108:250::-;37204:18;37210:2;37214:7;37204:5;:18::i;:::-;37241:54;37272:1;37276:2;37280:7;37289:5;37241:22;:54::i;:::-;37233:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;37108:250;;;:::o;44489:555::-;44599:45;44626:4;44632:2;44636:7;44599:26;:45::i;:::-;44677:1;44661:18;;:4;:18;;;44657:187;;;44696:40;44728:7;44696:31;:40::i;:::-;44657:187;;;44766:2;44758:10;;:4;:10;;;44754:90;;44785:47;44818:4;44824:7;44785:32;:47::i;:::-;44754:90;44657:187;44872:1;44858:16;;:2;:16;;;44854:183;;;44891:45;44928:7;44891:36;:45::i;:::-;44854:183;;;44964:4;44958:10;;:2;:10;;;44954:83;;44985:40;45013:2;45017:7;44985:27;:40::i;:::-;44954:83;44854:183;44489:555;;;:::o;40403:843::-;40524:4;40550:15;:2;:13;;;:15::i;:::-;40546:693;;;40602:2;40586:36;;;40623:12;:10;:12::i;:::-;40637:4;40643:7;40652:5;40586:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40582:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40849:1;40832:6;:13;:18;40828:341;;;40875:60;;;;;;;;;;:::i;:::-;;;;;;;;40828:341;41119:6;41113:13;41104:6;41100:2;41096:15;41089:38;40582:602;40719:45;;;40709:55;;;:6;:55;;;;40702:62;;;;;40546:693;41223:4;41216:11;;40403:843;;;;;;;:::o;37694:382::-;37788:1;37774:16;;:2;:16;;;;37766:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37847:16;37855:7;37847;:16::i;:::-;37846:17;37838:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37909:45;37938:1;37942:2;37946:7;37909:20;:45::i;:::-;37984:1;37967:9;:13;37977:2;37967:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38015:2;37996:7;:16;38004:7;37996:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38060:7;38056:2;38035:33;;38052:1;38035:33;;;;;;;;;;;;37694:382;;:::o;41859:93::-;;;;:::o;45767:164::-;45871:10;:17;;;;45844:15;:24;45860:7;45844:24;;;;;;;;;;;:44;;;;45899:10;45915:7;45899:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45767:164;:::o;46558:988::-;46824:22;46874:1;46849:22;46866:4;46849:16;:22::i;:::-;:26;;;;:::i;:::-;46824:51;;46886:18;46907:17;:26;46925:7;46907:26;;;;;;;;;;;;46886:47;;47054:14;47040:10;:28;47036:328;;47085:19;47107:12;:18;47120:4;47107:18;;;;;;;;;;;;;;;:34;47126:14;47107:34;;;;;;;;;;;;47085:56;;47191:11;47158:12;:18;47171:4;47158:18;;;;;;;;;;;;;;;:30;47177:10;47158:30;;;;;;;;;;;:44;;;;47308:10;47275:17;:30;47293:11;47275:30;;;;;;;;;;;:43;;;;47036:328;;47460:17;:26;47478:7;47460:26;;;;;;;;;;;47453:33;;;47504:12;:18;47517:4;47504:18;;;;;;;;;;;;;;;:34;47523:14;47504:34;;;;;;;;;;;47497:41;;;46558:988;;;;:::o;47841:1079::-;48094:22;48139:1;48119:10;:17;;;;:21;;;;:::i;:::-;48094:46;;48151:18;48172:15;:24;48188:7;48172:24;;;;;;;;;;;;48151:45;;48523:19;48545:10;48556:14;48545:26;;;;;;;;;;;;;;;;;;;;;;;;48523:48;;48609:11;48584:10;48595;48584:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;48720:10;48689:15;:28;48705:11;48689:28;;;;;;;;;;;:41;;;;48861:15;:24;48877:7;48861:24;;;;;;;;;;;48854:31;;;48896:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47841:1079;;;;:::o;45345:221::-;45430:14;45447:20;45464:2;45447:16;:20::i;:::-;45430:37;;45505:7;45478:12;:16;45491:2;45478:16;;;;;;;;;;;;;;;:24;45495:6;45478:24;;;;;;;;;;;:34;;;;45552:6;45523:17;:26;45541:7;45523:26;;;;;;;;;;;:35;;;;45345:221;;;:::o;9769:422::-;9829:4;10037:12;10148:7;10136:20;10128:28;;10182:1;10175:4;:8;10168:15;;;9769:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:262::-;;5924:2;5912:9;5903:7;5899:23;5895:32;5892:2;;;5940:1;5937;5930:12;5892:2;5983:1;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5954:117;5882:196;;;;:::o;6084:118::-;6171:24;6189:5;6171:24;:::i;:::-;6166:3;6159:37;6149:53;;:::o;6208:109::-;6289:21;6304:5;6289:21;:::i;:::-;6284:3;6277:34;6267:50;;:::o;6323:360::-;;6437:38;6469:5;6437:38;:::i;:::-;6491:70;6554:6;6549:3;6491:70;:::i;:::-;6484:77;;6570:52;6615:6;6610:3;6603:4;6596:5;6592:16;6570:52;:::i;:::-;6647:29;6669:6;6647:29;:::i;:::-;6642:3;6638:39;6631:46;;6413:270;;;;;:::o;6689:364::-;;6805:39;6838:5;6805:39;:::i;:::-;6860:71;6924:6;6919:3;6860:71;:::i;:::-;6853:78;;6940:52;6985:6;6980:3;6973:4;6966:5;6962:16;6940:52;:::i;:::-;7017:29;7039:6;7017:29;:::i;:::-;7012:3;7008:39;7001:46;;6781:272;;;;;:::o;7059:377::-;;7193:39;7226:5;7193:39;:::i;:::-;7248:89;7330:6;7325:3;7248:89;:::i;:::-;7241:96;;7346:52;7391:6;7386:3;7379:4;7372:5;7368:16;7346:52;:::i;:::-;7423:6;7418:3;7414:16;7407:23;;7169:267;;;;;:::o;7442:367::-;;7605:67;7669:2;7664:3;7605:67;:::i;:::-;7598:74;;7702:34;7698:1;7693:3;7689:11;7682:55;7768:5;7763:2;7758:3;7754:12;7747:27;7800:2;7795:3;7791:12;7784:19;;7588:221;;;:::o;7815:383::-;;7978:67;8042:2;8037:3;7978:67;:::i;:::-;7971:74;;8075:34;8071:1;8066:3;8062:11;8055:55;8141:21;8136:2;8131:3;8127:12;8120:43;8189:2;8184:3;8180:12;8173:19;;7961:237;;;:::o;8204:375::-;;8367:67;8431:2;8426:3;8367:67;:::i;:::-;8360:74;;8464:34;8460:1;8455:3;8451:11;8444:55;8530:13;8525:2;8520:3;8516:12;8509:35;8570:2;8565:3;8561:12;8554:19;;8350:229;;;:::o;8585:382::-;;8748:67;8812:2;8807:3;8748:67;:::i;:::-;8741:74;;8845:34;8841:1;8836:3;8832:11;8825:55;8911:20;8906:2;8901:3;8897:12;8890:42;8958:2;8953:3;8949:12;8942:19;;8731:236;;;:::o;8973:370::-;;9136:67;9200:2;9195:3;9136:67;:::i;:::-;9129:74;;9233:34;9229:1;9224:3;9220:11;9213:55;9299:8;9294:2;9289:3;9285:12;9278:30;9334:2;9329:3;9325:12;9318:19;;9119:224;;;:::o;9349:326::-;;9512:67;9576:2;9571:3;9512:67;:::i;:::-;9505:74;;9609:30;9605:1;9600:3;9596:11;9589:51;9666:2;9661:3;9657:12;9650:19;;9495:180;;;:::o;9681:367::-;;9844:67;9908:2;9903:3;9844:67;:::i;:::-;9837:74;;9941:34;9937:1;9932:3;9928:11;9921:55;10007:5;10002:2;9997:3;9993:12;9986:27;10039:2;10034:3;10030:12;10023:19;;9827:221;;;:::o;10054:368::-;;10217:67;10281:2;10276:3;10217:67;:::i;:::-;10210:74;;10314:34;10310:1;10305:3;10301:11;10294:55;10380:6;10375:2;10370:3;10366:12;10359:28;10413:2;10408:3;10404:12;10397:19;;10200:222;;;:::o;10428:323::-;;10591:67;10655:2;10650:3;10591:67;:::i;:::-;10584:74;;10688:27;10684:1;10679:3;10675:11;10668:48;10742:2;10737:3;10733:12;10726:19;;10574:177;;;:::o;10757:376::-;;10920:67;10984:2;10979:3;10920:67;:::i;:::-;10913:74;;11017:34;11013:1;11008:3;11004:11;10997:55;11083:14;11078:2;11073:3;11069:12;11062:36;11124:2;11119:3;11115:12;11108:19;;10903:230;;;:::o;11139:327::-;;11302:67;11366:2;11361:3;11302:67;:::i;:::-;11295:74;;11399:31;11395:1;11390:3;11386:11;11379:52;11457:2;11452:3;11448:12;11441:19;;11285:181;;;:::o;11472:388::-;;11635:67;11699:2;11694:3;11635:67;:::i;:::-;11628:74;;11732:34;11728:1;11723:3;11719:11;11712:55;11798:26;11793:2;11788:3;11784:12;11777:48;11851:2;11846:3;11842:12;11835:19;;11618:242;;;:::o;11866:374::-;;12029:67;12093:2;12088:3;12029:67;:::i;:::-;12022:74;;12126:34;12122:1;12117:3;12113:11;12106:55;12192:12;12187:2;12182:3;12178:12;12171:34;12231:2;12226:3;12222:12;12215:19;;12012:228;;;:::o;12246:373::-;;12409:67;12473:2;12468:3;12409:67;:::i;:::-;12402:74;;12506:34;12502:1;12497:3;12493:11;12486:55;12572:11;12567:2;12562:3;12558:12;12551:33;12610:2;12605:3;12601:12;12594:19;;12392:227;;;:::o;12625:327::-;;12788:67;12852:2;12847:3;12788:67;:::i;:::-;12781:74;;12885:31;12881:1;12876:3;12872:11;12865:52;12943:2;12938:3;12934:12;12927:19;;12771:181;;;:::o;12958:330::-;;13121:67;13185:2;13180:3;13121:67;:::i;:::-;13114:74;;13218:34;13214:1;13209:3;13205:11;13198:55;13279:2;13274:3;13270:12;13263:19;;13104:184;;;:::o;13294:376::-;;13457:67;13521:2;13516:3;13457:67;:::i;:::-;13450:74;;13554:34;13550:1;13545:3;13541:11;13534:55;13620:14;13615:2;13610:3;13606:12;13599:36;13661:2;13656:3;13652:12;13645:19;;13440:230;;;:::o;13676:330::-;;13839:67;13903:2;13898:3;13839:67;:::i;:::-;13832:74;;13936:34;13932:1;13927:3;13923:11;13916:55;13997:2;13992:3;13988:12;13981:19;;13822:184;;;:::o;14012:373::-;;14175:67;14239:2;14234:3;14175:67;:::i;:::-;14168:74;;14272:34;14268:1;14263:3;14259:11;14252:55;14338:11;14333:2;14328:3;14324:12;14317:33;14376:2;14371:3;14367:12;14360:19;;14158:227;;;:::o;14391:379::-;;14554:67;14618:2;14613:3;14554:67;:::i;:::-;14547:74;;14651:34;14647:1;14642:3;14638:11;14631:55;14717:17;14712:2;14707:3;14703:12;14696:39;14761:2;14756:3;14752:12;14745:19;;14537:233;;;:::o;14776:365::-;;14939:67;15003:2;14998:3;14939:67;:::i;:::-;14932:74;;15036:34;15032:1;15027:3;15023:11;15016:55;15102:3;15097:2;15092:3;15088:12;15081:25;15132:2;15127:3;15123:12;15116:19;;14922:219;;;:::o;15147:381::-;;15310:67;15374:2;15369:3;15310:67;:::i;:::-;15303:74;;15407:34;15403:1;15398:3;15394:11;15387:55;15473:19;15468:2;15463:3;15459:12;15452:41;15519:2;15514:3;15510:12;15503:19;;15293:235;;;:::o;15534:376::-;;15697:67;15761:2;15756:3;15697:67;:::i;:::-;15690:74;;15794:34;15790:1;15785:3;15781:11;15774:55;15860:14;15855:2;15850:3;15846:12;15839:36;15901:2;15896:3;15892:12;15885:19;;15680:230;;;:::o;15916:367::-;;16079:67;16143:2;16138:3;16079:67;:::i;:::-;16072:74;;16176:34;16172:1;16167:3;16163:11;16156:55;16242:5;16237:2;16232:3;16228:12;16221:27;16274:2;16269:3;16265:12;16258:19;;16062:221;;;:::o;16289:373::-;;16452:67;16516:2;16511:3;16452:67;:::i;:::-;16445:74;;16549:34;16545:1;16540:3;16536:11;16529:55;16615:11;16610:2;16605:3;16601:12;16594:33;16653:2;16648:3;16644:12;16637:19;;16435:227;;;:::o;16668:330::-;;16831:67;16895:2;16890:3;16831:67;:::i;:::-;16824:74;;16928:34;16924:1;16919:3;16915:11;16908:55;16989:2;16984:3;16980:12;16973:19;;16814:184;;;:::o;17004:118::-;17091:24;17109:5;17091:24;:::i;:::-;17086:3;17079:37;17069:53;;:::o;17128:435::-;;17330:95;17421:3;17412:6;17330:95;:::i;:::-;17323:102;;17442:95;17533:3;17524:6;17442:95;:::i;:::-;17435:102;;17554:3;17547:10;;17312:251;;;;;:::o;17569:222::-;;17700:2;17689:9;17685:18;17677:26;;17713:71;17781:1;17770:9;17766:17;17757:6;17713:71;:::i;:::-;17667:124;;;;:::o;17797:640::-;;18030:3;18019:9;18015:19;18007:27;;18044:71;18112:1;18101:9;18097:17;18088:6;18044:71;:::i;:::-;18125:72;18193:2;18182:9;18178:18;18169:6;18125:72;:::i;:::-;18207;18275:2;18264:9;18260:18;18251:6;18207:72;:::i;:::-;18326:9;18320:4;18316:20;18311:2;18300:9;18296:18;18289:48;18354:76;18425:4;18416:6;18354:76;:::i;:::-;18346:84;;17997:440;;;;;;;:::o;18443:210::-;;18568:2;18557:9;18553:18;18545:26;;18581:65;18643:1;18632:9;18628:17;18619:6;18581:65;:::i;:::-;18535:118;;;;:::o;18659:313::-;;18810:2;18799:9;18795:18;18787:26;;18859:9;18853:4;18849:20;18845:1;18834:9;18830:17;18823:47;18887:78;18960:4;18951:6;18887:78;:::i;:::-;18879:86;;18777:195;;;;:::o;18978:419::-;;19182:2;19171:9;19167:18;19159:26;;19231:9;19225:4;19221:20;19217:1;19206:9;19202:17;19195:47;19259:131;19385:4;19259:131;:::i;:::-;19251:139;;19149:248;;;:::o;19403:419::-;;19607:2;19596:9;19592:18;19584:26;;19656:9;19650:4;19646:20;19642:1;19631:9;19627:17;19620:47;19684:131;19810:4;19684:131;:::i;:::-;19676:139;;19574:248;;;:::o;19828:419::-;;20032:2;20021:9;20017:18;20009:26;;20081:9;20075:4;20071:20;20067:1;20056:9;20052:17;20045:47;20109:131;20235:4;20109:131;:::i;:::-;20101:139;;19999:248;;;:::o;20253:419::-;;20457:2;20446:9;20442:18;20434:26;;20506:9;20500:4;20496:20;20492:1;20481:9;20477:17;20470:47;20534:131;20660:4;20534:131;:::i;:::-;20526:139;;20424:248;;;:::o;20678:419::-;;20882:2;20871:9;20867:18;20859:26;;20931:9;20925:4;20921:20;20917:1;20906:9;20902:17;20895:47;20959:131;21085:4;20959:131;:::i;:::-;20951:139;;20849:248;;;:::o;21103:419::-;;21307:2;21296:9;21292:18;21284:26;;21356:9;21350:4;21346:20;21342:1;21331:9;21327:17;21320:47;21384:131;21510:4;21384:131;:::i;:::-;21376:139;;21274:248;;;:::o;21528:419::-;;21732:2;21721:9;21717:18;21709:26;;21781:9;21775:4;21771:20;21767:1;21756:9;21752:17;21745:47;21809:131;21935:4;21809:131;:::i;:::-;21801:139;;21699:248;;;:::o;21953:419::-;;22157:2;22146:9;22142:18;22134:26;;22206:9;22200:4;22196:20;22192:1;22181:9;22177:17;22170:47;22234:131;22360:4;22234:131;:::i;:::-;22226:139;;22124:248;;;:::o;22378:419::-;;22582:2;22571:9;22567:18;22559:26;;22631:9;22625:4;22621:20;22617:1;22606:9;22602:17;22595:47;22659:131;22785:4;22659:131;:::i;:::-;22651:139;;22549:248;;;:::o;22803:419::-;;23007:2;22996:9;22992:18;22984:26;;23056:9;23050:4;23046:20;23042:1;23031:9;23027:17;23020:47;23084:131;23210:4;23084:131;:::i;:::-;23076:139;;22974:248;;;:::o;23228:419::-;;23432:2;23421:9;23417:18;23409:26;;23481:9;23475:4;23471:20;23467:1;23456:9;23452:17;23445:47;23509:131;23635:4;23509:131;:::i;:::-;23501:139;;23399:248;;;:::o;23653:419::-;;23857:2;23846:9;23842:18;23834:26;;23906:9;23900:4;23896:20;23892:1;23881:9;23877:17;23870:47;23934:131;24060:4;23934:131;:::i;:::-;23926:139;;23824:248;;;:::o;24078:419::-;;24282:2;24271:9;24267:18;24259:26;;24331:9;24325:4;24321:20;24317:1;24306:9;24302:17;24295:47;24359:131;24485:4;24359:131;:::i;:::-;24351:139;;24249:248;;;:::o;24503:419::-;;24707:2;24696:9;24692:18;24684:26;;24756:9;24750:4;24746:20;24742:1;24731:9;24727:17;24720:47;24784:131;24910:4;24784:131;:::i;:::-;24776:139;;24674:248;;;:::o;24928:419::-;;25132:2;25121:9;25117:18;25109:26;;25181:9;25175:4;25171:20;25167:1;25156:9;25152:17;25145:47;25209:131;25335:4;25209:131;:::i;:::-;25201:139;;25099:248;;;:::o;25353:419::-;;25557:2;25546:9;25542:18;25534:26;;25606:9;25600:4;25596:20;25592:1;25581:9;25577:17;25570:47;25634:131;25760:4;25634:131;:::i;:::-;25626:139;;25524:248;;;:::o;25778:419::-;;25982:2;25971:9;25967:18;25959:26;;26031:9;26025:4;26021:20;26017:1;26006:9;26002:17;25995:47;26059:131;26185:4;26059:131;:::i;:::-;26051:139;;25949:248;;;:::o;26203:419::-;;26407:2;26396:9;26392:18;26384:26;;26456:9;26450:4;26446:20;26442:1;26431:9;26427:17;26420:47;26484:131;26610:4;26484:131;:::i;:::-;26476:139;;26374:248;;;:::o;26628:419::-;;26832:2;26821:9;26817:18;26809:26;;26881:9;26875:4;26871:20;26867:1;26856:9;26852:17;26845:47;26909:131;27035:4;26909:131;:::i;:::-;26901:139;;26799:248;;;:::o;27053:419::-;;27257:2;27246:9;27242:18;27234:26;;27306:9;27300:4;27296:20;27292:1;27281:9;27277:17;27270:47;27334:131;27460:4;27334:131;:::i;:::-;27326:139;;27224:248;;;:::o;27478:419::-;;27682:2;27671:9;27667:18;27659:26;;27731:9;27725:4;27721:20;27717:1;27706:9;27702:17;27695:47;27759:131;27885:4;27759:131;:::i;:::-;27751:139;;27649:248;;;:::o;27903:419::-;;28107:2;28096:9;28092:18;28084:26;;28156:9;28150:4;28146:20;28142:1;28131:9;28127:17;28120:47;28184:131;28310:4;28184:131;:::i;:::-;28176:139;;28074:248;;;:::o;28328:419::-;;28532:2;28521:9;28517:18;28509:26;;28581:9;28575:4;28571:20;28567:1;28556:9;28552:17;28545:47;28609:131;28735:4;28609:131;:::i;:::-;28601:139;;28499:248;;;:::o;28753:419::-;;28957:2;28946:9;28942:18;28934:26;;29006:9;29000:4;28996:20;28992:1;28981:9;28977:17;28970:47;29034:131;29160:4;29034:131;:::i;:::-;29026:139;;28924:248;;;:::o;29178:419::-;;29382:2;29371:9;29367:18;29359:26;;29431:9;29425:4;29421:20;29417:1;29406:9;29402:17;29395:47;29459:131;29585:4;29459:131;:::i;:::-;29451:139;;29349:248;;;:::o;29603:419::-;;29807:2;29796:9;29792:18;29784:26;;29856:9;29850:4;29846:20;29842:1;29831:9;29827:17;29820:47;29884:131;30010:4;29884:131;:::i;:::-;29876:139;;29774:248;;;:::o;30028:222::-;;30159:2;30148:9;30144:18;30136:26;;30172:71;30240:1;30229:9;30225:17;30216:6;30172:71;:::i;:::-;30126:124;;;;:::o;30256:283::-;;30322:2;30316:9;30306:19;;30364:4;30356:6;30352:17;30471:6;30459:10;30456:22;30435:18;30423:10;30420:34;30417:62;30414:2;;;30482:18;;:::i;:::-;30414:2;30522:10;30518:2;30511:22;30296:243;;;;:::o;30545:331::-;;30696:18;30688:6;30685:30;30682:2;;;30718:18;;:::i;:::-;30682:2;30803:4;30799:9;30792:4;30784:6;30780:17;30776:33;30768:41;;30864:4;30858;30854:15;30846:23;;30611:265;;;:::o;30882:332::-;;31034:18;31026:6;31023:30;31020:2;;;31056:18;;:::i;:::-;31020:2;31141:4;31137:9;31130:4;31122:6;31118:17;31114:33;31106:41;;31202:4;31196;31192:15;31184:23;;30949:265;;;:::o;31220:98::-;;31305:5;31299:12;31289:22;;31278:40;;;:::o;31324:99::-;;31410:5;31404:12;31394:22;;31383:40;;;:::o;31429:168::-;;31546:6;31541:3;31534:19;31586:4;31581:3;31577:14;31562:29;;31524:73;;;;:::o;31603:169::-;;31721:6;31716:3;31709:19;31761:4;31756:3;31752:14;31737:29;;31699:73;;;;:::o;31778:148::-;;31917:3;31902:18;;31892:34;;;;:::o;31932:305::-;;31991:20;32009:1;31991:20;:::i;:::-;31986:25;;32025:20;32043:1;32025:20;:::i;:::-;32020:25;;32179:1;32111:66;32107:74;32104:1;32101:81;32098:2;;;32185:18;;:::i;:::-;32098:2;32229:1;32226;32222:9;32215:16;;31976:261;;;;:::o;32243:185::-;;32300:20;32318:1;32300:20;:::i;:::-;32295:25;;32334:20;32352:1;32334:20;:::i;:::-;32329:25;;32373:1;32363:2;;32378:18;;:::i;:::-;32363:2;32420:1;32417;32413:9;32408:14;;32285:143;;;;:::o;32434:348::-;;32497:20;32515:1;32497:20;:::i;:::-;32492:25;;32531:20;32549:1;32531:20;:::i;:::-;32526:25;;32719:1;32651:66;32647:74;32644:1;32641:81;32636:1;32629:9;32622:17;32618:105;32615:2;;;32726:18;;:::i;:::-;32615:2;32774:1;32771;32767:9;32756:20;;32482:300;;;;:::o;32788:191::-;;32848:20;32866:1;32848:20;:::i;:::-;32843:25;;32882:20;32900:1;32882:20;:::i;:::-;32877:25;;32921:1;32918;32915:8;32912:2;;;32926:18;;:::i;:::-;32912:2;32971:1;32968;32964:9;32956:17;;32833:146;;;;:::o;32985:96::-;;33051:24;33069:5;33051:24;:::i;:::-;33040:35;;33030:51;;;:::o;33087:90::-;;33164:5;33157:13;33150:21;33139:32;;33129:48;;;:::o;33183:149::-;;33259:66;33252:5;33248:78;33237:89;;33227:105;;;:::o;33338:126::-;;33415:42;33408:5;33404:54;33393:65;;33383:81;;;:::o;33470:77::-;;33536:5;33525:16;;33515:32;;;:::o;33553:154::-;33637:6;33632:3;33627;33614:30;33699:1;33690:6;33685:3;33681:16;33674:27;33604:103;;;:::o;33713:307::-;33781:1;33791:113;33805:6;33802:1;33799:13;33791:113;;;33890:1;33885:3;33881:11;33875:18;33871:1;33866:3;33862:11;33855:39;33827:2;33824:1;33820:10;33815:15;;33791:113;;;33922:6;33919:1;33916:13;33913:2;;;34002:1;33993:6;33988:3;33984:16;33977:27;33913:2;33762:258;;;;:::o;34026:320::-;;34107:1;34101:4;34097:12;34087:22;;34154:1;34148:4;34144:12;34175:18;34165:2;;34231:4;34223:6;34219:17;34209:27;;34165:2;34293;34285:6;34282:14;34262:18;34259:38;34256:2;;;34312:18;;:::i;:::-;34256:2;34077:269;;;;:::o;34352:233::-;;34414:24;34432:5;34414:24;:::i;:::-;34405:33;;34460:66;34453:5;34450:77;34447:2;;;34530:18;;:::i;:::-;34447:2;34577:1;34570:5;34566:13;34559:20;;34395:190;;;:::o;34591:176::-;;34640:20;34658:1;34640:20;:::i;:::-;34635:25;;34674:20;34692:1;34674:20;:::i;:::-;34669:25;;34713:1;34703:2;;34718:18;;:::i;:::-;34703:2;34759:1;34756;34752:9;34747:14;;34625:142;;;;:::o;34773:180::-;34821:77;34818:1;34811:88;34918:4;34915:1;34908:15;34942:4;34939:1;34932:15;34959:180;35007:77;35004:1;34997:88;35104:4;35101:1;35094:15;35128:4;35125:1;35118:15;35145:180;35193:77;35190:1;35183:88;35290:4;35287:1;35280:15;35314:4;35311:1;35304:15;35331:180;35379:77;35376:1;35369:88;35476:4;35473:1;35466:15;35500:4;35497:1;35490:15;35517:102;;35609:2;35605:7;35600:2;35593:5;35589:14;35585:28;35575:38;;35565:54;;;:::o;35625:122::-;35698:24;35716:5;35698:24;:::i;:::-;35691:5;35688:35;35678:2;;35737:1;35734;35727:12;35678:2;35668:79;:::o;35753:116::-;35823:21;35838:5;35823:21;:::i;:::-;35816:5;35813:32;35803:2;;35859:1;35856;35849:12;35803:2;35793:76;:::o;35875:120::-;35947:23;35964:5;35947:23;:::i;:::-;35940:5;35937:34;35927:2;;35985:1;35982;35975:12;35927:2;35917:78;:::o;36001:122::-;36074:24;36092:5;36074:24;:::i;:::-;36067:5;36064:35;36054:2;;36113:1;36110;36103:12;36054:2;36044:79;:::o
Swarm Source
ipfs://400f8bc7f0dbbc24f225e6543c11ea45a550f9f4c7cc09f6f6ea77a0a706f190
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.