Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
7,631 MEERKATS
Holders
2,040
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 MEERKATSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
AngryMeerkats
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-30 */ // 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 AngryMeerkats is ERC721Enumerable, Ownable { using SafeMath for uint256; using Address for address; using Strings for uint256; // Is claim active bool public claimIsActive = false; address public angryBoarsContractAddress = 0xA66CC78067fd1E6Aa3eEC4CcdFF88D81527F92c1; mapping(uint256 => bool) _claimedBoars; bool public isMetadataLocked = false; string private _baseURIExtended; mapping (uint256 => string) _tokenURIs; constructor() ERC721("Angry Meerkats","MEERKATS"){} function flipClaimState() public onlyOwner { claimIsActive = !claimIsActive; } function lockMetadata() public onlyOwner { isMetadataLocked = true; } function _baseURI() internal view virtual override returns (string memory) { return _baseURIExtended; } function setBaseURI(string memory baseURI_) external onlyOwner { require(!isMetadataLocked,"Metadata is locked"); _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, '.json')); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(base, tokenId.toString(), '.json')); } function isClaimed (uint256 boar) public view returns (bool) { return _claimedBoars[boar]; } function claim(uint256 angryBoarsTokensNumber) public { require(claimIsActive, "Claiming is not active at the moment"); claimMeerkat(angryBoarsTokensNumber); } function claimByIds(uint256[] memory angryBoarIds) public { require(claimIsActive, "Claiming is not active at the moment"); AngryBoarsContractInterface angryBoarsContractCaller = AngryBoarsContractInterface(angryBoarsContractAddress); for (uint256 i = 0; i < angryBoarIds.length; i++) { address angryBoarOwner = angryBoarsContractCaller.ownerOf(angryBoarIds[i]); require(angryBoarOwner == msg.sender, "You do not own the token with the provided id"); require(!isClaimed(angryBoarIds[i]), "The token has been already claimed"); } for (uint256 i = 0; i < angryBoarIds.length; i++) { _safeMint(msg.sender, totalSupply()); _claimedBoars[angryBoarIds[i]] = true; } } function claimUnrestricted(uint256 angryBoarsTokensNumber) public onlyOwner { claimMeerkat(angryBoarsTokensNumber); } function claimMeerkat(uint256 angryBoarsTokensNumber) internal { require(angryBoarsTokensNumber > 0, "Provided value is not pozitive"); AngryBoarsContractInterface angryBoarsContractCaller = AngryBoarsContractInterface(angryBoarsContractAddress); uint256 walletBalance = angryBoarsContractCaller.balanceOf(msg.sender); uint256[] memory userTokens = new uint256[](walletBalance); uint256 unclaimedTokensCounter = 0; for (uint256 i = 0; i < walletBalance; i++) { uint256 userTokenId = angryBoarsContractCaller.tokenOfOwnerByIndex(msg.sender, i); userTokens[i] = userTokenId; if (!isClaimed(userTokenId)) { unclaimedTokensCounter++; } } require(unclaimedTokensCounter >= angryBoarsTokensNumber, "You do not possess enough claimable tokens"); for (uint i = 0; i < walletBalance; i++) { if (!isClaimed(userTokens[i]) && angryBoarsTokensNumber > 0) { _safeMint(msg.sender, totalSupply()); _claimedBoars[userTokens[i]] = true; angryBoarsTokensNumber--; } } } } contract AngryBoarsContractInterface { function balanceOf(address owner) public returns (uint256) {} function ownerOf(uint256 tokenId) public returns (address) {} function tokenOfOwnerByIndex(address owner, uint256 index) public returns(uint256) {} }
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":"angryBoarsContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"uint256","name":"angryBoarsTokensNumber","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"angryBoarIds","type":"uint256[]"}],"name":"claimByIds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"angryBoarsTokensNumber","type":"uint256"}],"name":"claimUnrestricted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipClaimState","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":"boar","type":"uint256"}],"name":"isClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMetadataLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600a60146101000a81548160ff02191690831515021790555073a66cc78067fd1e6aa3eec4ccdff88d81527f92c1600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600d60006101000a81548160ff0219169083151502179055503480156200009c57600080fd5b506040518060400160405280600e81526020017f416e677279204d6565726b6174730000000000000000000000000000000000008152506040518060400160405280600881526020017f4d4545524b415453000000000000000000000000000000000000000000000000815250816000908051906020019062000121929190620001fc565b5080600190805190602001906200013a929190620001fc565b50505060006200014f620001f460201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35062000311565b600033905090565b8280546200020a90620002ac565b90600052602060002090601f0160209004810192826200022e57600085556200027a565b82601f106200024957805160ff19168380011785556200027a565b828001600101855582156200027a579182015b82811115620002795782518255916020019190600101906200025c565b5b5090506200028991906200028d565b5090565b5b80821115620002a85760008160009055506001016200028e565b5090565b60006002820490506001821680620002c557607f821691505b60208210811415620002dc57620002db620002e2565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61465480620003216000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80636352211e11610104578063989bdbb6116100a2578063c87b56dd11610071578063c87b56dd146104f2578063d7e45cd714610522578063e985e9c514610540578063f2fde38b14610570576101cf565b8063989bdbb6146104805780639e34070f1461048a578063a22cb465146104ba578063b88d4fde146104d6576101cf565b8063715018a6116100de578063715018a61461041c5780637fd9cc01146104265780638da5cb5b1461044457806395d89b4114610462576101cf565b80636352211e146103b25780636d60e6c1146103e257806370a08231146103ec576101cf565b80632f745c591161017157806342842e0e1161014b57806342842e0e1461032c5780634f6ccce7146103485780635303f68c1461037857806355f804b314610396576101cf565b80632f745c59146102c4578063379607f5146102f45780633b67cf1a14610310576101cf565b8063095ea7b3116101ad578063095ea7b314610252578063111d00761461026e57806318160ddd1461028a57806323b872dd146102a8576101cf565b806301ffc9a7146101d457806306fdde0314610204578063081812fc14610222575b600080fd5b6101ee60048036038101906101e99190613114565b61058c565b6040516101fb919061370b565b60405180910390f35b61020c610606565b6040516102199190613726565b60405180910390f35b61023c600480360381019061023791906131b7565b610698565b604051610249919061367b565b60405180910390f35b61026c6004803603810190610267919061308b565b61071d565b005b610288600480360381019061028391906131b7565b610835565b005b6102926108bd565b60405161029f9190613a48565b60405180910390f35b6102c260048036038101906102bd9190612f75565b6108ca565b005b6102de60048036038101906102d9919061308b565b61092a565b6040516102eb9190613a48565b60405180910390f35b61030e600480360381019061030991906131b7565b6109cf565b005b61032a600480360381019061032591906130cb565b610a2a565b005b61034660048036038101906103419190612f75565b610cb6565b005b610362600480360381019061035d91906131b7565b610cd6565b60405161036f9190613a48565b60405180910390f35b610380610d47565b60405161038d919061370b565b60405180910390f35b6103b060048036038101906103ab919061316e565b610d5a565b005b6103cc60048036038101906103c791906131b7565b610e40565b6040516103d9919061367b565b60405180910390f35b6103ea610ef2565b005b61040660048036038101906104019190612edb565b610f9a565b6040516104139190613a48565b60405180910390f35b610424611052565b005b61042e61118f565b60405161043b919061367b565b60405180910390f35b61044c6111b5565b604051610459919061367b565b60405180910390f35b61046a6111df565b6040516104779190613726565b60405180910390f35b610488611271565b005b6104a4600480360381019061049f91906131b7565b61130a565b6040516104b1919061370b565b60405180910390f35b6104d460048036038101906104cf919061304b565b611334565b005b6104f060048036038101906104eb9190612fc8565b6114b5565b005b61050c600480360381019061050791906131b7565b611517565b6040516105199190613726565b60405180910390f35b61052a61168a565b604051610537919061370b565b60405180910390f35b61055a60048036038101906105559190612f35565b61169d565b604051610567919061370b565b60405180910390f35b61058a60048036038101906105859190612edb565b611731565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105ff57506105fe826118dd565b5b9050919050565b60606000805461061590613cf4565b80601f016020809104026020016040519081016040528092919081815260200182805461064190613cf4565b801561068e5780601f106106635761010080835404028352916020019161068e565b820191906000526020600020905b81548152906001019060200180831161067157829003601f168201915b5050505050905090565b60006106a3826119bf565b6106e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d9906138e8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061072882610e40565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079090613988565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107b8611a2b565b73ffffffffffffffffffffffffffffffffffffffff1614806107e757506107e6816107e1611a2b565b61169d565b5b610826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081d90613848565b60405180910390fd5b6108308383611a33565b505050565b61083d611a2b565b73ffffffffffffffffffffffffffffffffffffffff1661085b6111b5565b73ffffffffffffffffffffffffffffffffffffffff16146108b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a890613908565b60405180910390fd5b6108ba81611aec565b50565b6000600880549050905090565b6108db6108d5611a2b565b82611e24565b61091a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610911906139a8565b60405180910390fd5b610925838383611f02565b505050565b600061093583610f9a565b8210610976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096d90613768565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600a60149054906101000a900460ff16610a1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a15906139e8565b60405180910390fd5b610a2781611aec565b50565b600a60149054906101000a900460ff16610a79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a70906139e8565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060005b8251811015610c3a5760008273ffffffffffffffffffffffffffffffffffffffff16636352211e858481518110610add57610adc613e8d565b5b60200260200101516040518263ffffffff1660e01b8152600401610b019190613a48565b602060405180830381600087803b158015610b1b57600080fd5b505af1158015610b2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b539190612f08565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bba90613a08565b60405180910390fd5b610be6848381518110610bd957610bd8613e8d565b5b602002602001015161130a565b15610c26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1d90613748565b60405180910390fd5b508080610c3290613d57565b915050610aa3565b5060005b8251811015610cb157610c5833610c536108bd565b61215e565b6001600c6000858481518110610c7157610c70613e8d565b5b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610ca990613d57565b915050610c3e565b505050565b610cd1838383604051806020016040528060008152506114b5565b505050565b6000610ce06108bd565b8210610d21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d18906139c8565b60405180910390fd5b60088281548110610d3557610d34613e8d565b5b90600052602060002001549050919050565b600a60149054906101000a900460ff1681565b610d62611a2b565b73ffffffffffffffffffffffffffffffffffffffff16610d806111b5565b73ffffffffffffffffffffffffffffffffffffffff1614610dd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcd90613908565b60405180910390fd5b600d60009054906101000a900460ff1615610e26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1d90613a28565b60405180910390fd5b80600e9080519060200190610e3c929190612c27565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee090613888565b60405180910390fd5b80915050919050565b610efa611a2b565b73ffffffffffffffffffffffffffffffffffffffff16610f186111b5565b73ffffffffffffffffffffffffffffffffffffffff1614610f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6590613908565b60405180910390fd5b600a60149054906101000a900460ff1615600a60146101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561100b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100290613868565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61105a611a2b565b73ffffffffffffffffffffffffffffffffffffffff166110786111b5565b73ffffffffffffffffffffffffffffffffffffffff16146110ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c590613908565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546111ee90613cf4565b80601f016020809104026020016040519081016040528092919081815260200182805461121a90613cf4565b80156112675780601f1061123c57610100808354040283529160200191611267565b820191906000526020600020905b81548152906001019060200180831161124a57829003601f168201915b5050505050905090565b611279611a2b565b73ffffffffffffffffffffffffffffffffffffffff166112976111b5565b73ffffffffffffffffffffffffffffffffffffffff16146112ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e490613908565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b6000600c600083815260200190815260200160002060009054906101000a900460ff169050919050565b61133c611a2b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a190613808565b60405180910390fd5b80600560006113b7611a2b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611464611a2b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114a9919061370b565b60405180910390a35050565b6114c66114c0611a2b565b83611e24565b611505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fc906139a8565b60405180910390fd5b6115118484848461217c565b50505050565b6060611522826119bf565b611561576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155890613948565b60405180910390fd5b6000600f6000848152602001908152602001600020805461158190613cf4565b80601f01602080910402602001604051908101604052809291908181526020018280546115ad90613cf4565b80156115fa5780601f106115cf576101008083540402835291602001916115fa565b820191906000526020600020905b8154815290600101906020018083116115dd57829003601f168201915b50505050509050600061160b6121d8565b9050600081511415611621578192505050611685565b60008251111561165657808260405160200161163e92919061364c565b60405160208183030381529060405292505050611685565b806116608561226a565b60405160200161167192919061364c565b604051602081830303815290604052925050505b919050565b600d60009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611739611a2b565b73ffffffffffffffffffffffffffffffffffffffff166117576111b5565b73ffffffffffffffffffffffffffffffffffffffff16146117ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a490613908565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561181d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611814906137a8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119a857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806119b857506119b7826123cb565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611aa683610e40565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008111611b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b26906138a8565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611b91919061367b565b602060405180830381600087803b158015611bab57600080fd5b505af1158015611bbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be391906131e4565b905060008167ffffffffffffffff811115611c0157611c00613ebc565b5b604051908082528060200260200182016040528015611c2f5781602001602082028036833780820191505090505b5090506000805b83811015611d1f5760008573ffffffffffffffffffffffffffffffffffffffff16632f745c5933846040518363ffffffff1660e01b8152600401611c7b9291906136e2565b602060405180830381600087803b158015611c9557600080fd5b505af1158015611ca9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ccd91906131e4565b905080848381518110611ce357611ce2613e8d565b5b602002602001018181525050611cf88161130a565b611d0b578280611d0790613d57565b9350505b508080611d1790613d57565b915050611c36565b5084811015611d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5a90613968565b60405180910390fd5b60005b83811015611e1c57611d91838281518110611d8457611d83613e8d565b5b602002602001015161130a565b158015611d9e5750600086115b15611e0957611db433611daf6108bd565b61215e565b6001600c6000858481518110611dcd57611dcc613e8d565b5b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508580611e0590613cca565b9650505b8080611e1490613d57565b915050611d66565b505050505050565b6000611e2f826119bf565b611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6590613828565b60405180910390fd5b6000611e7983610e40565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ee857508373ffffffffffffffffffffffffffffffffffffffff16611ed084610698565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ef95750611ef8818561169d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f2282610e40565b73ffffffffffffffffffffffffffffffffffffffff1614611f78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6f90613928565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fe8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdf906137e8565b60405180910390fd5b611ff3838383612435565b611ffe600082611a33565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461204e9190613be0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120a59190613b59565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612178828260405180602001604052806000815250612549565b5050565b612187848484611f02565b612193848484846125a4565b6121d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c990613788565b60405180910390fd5b50505050565b6060600e80546121e790613cf4565b80601f016020809104026020016040519081016040528092919081815260200182805461221390613cf4565b80156122605780601f1061223557610100808354040283529160200191612260565b820191906000526020600020905b81548152906001019060200180831161224357829003601f168201915b5050505050905090565b606060008214156122b2576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123c6565b600082905060005b600082146122e45780806122cd90613d57565b915050600a826122dd9190613baf565b91506122ba565b60008167ffffffffffffffff811115612300576122ff613ebc565b5b6040519080825280601f01601f1916602001820160405280156123325781602001600182028036833780820191505090505b5090505b600085146123bf5760018261234b9190613be0565b9150600a8561235a9190613da0565b60306123669190613b59565b60f81b81838151811061237c5761237b613e8d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123b89190613baf565b9450612336565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61244083838361273b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124835761247e81612740565b6124c2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124c1576124c08382612789565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561250557612500816128f6565b612544565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125435761254282826129c7565b5b5b505050565b6125538383612a46565b61256060008484846125a4565b61259f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259690613788565b60405180910390fd5b505050565b60006125c58473ffffffffffffffffffffffffffffffffffffffff16612c14565b1561272e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125ee611a2b565b8786866040518563ffffffff1660e01b81526004016126109493929190613696565b602060405180830381600087803b15801561262a57600080fd5b505af192505050801561265b57506040513d601f19601f820116820180604052508101906126589190613141565b60015b6126de573d806000811461268b576040519150601f19603f3d011682016040523d82523d6000602084013e612690565b606091505b506000815114156126d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126cd90613788565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612733565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161279684610f9a565b6127a09190613be0565b9050600060076000848152602001908152602001600020549050818114612885576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061290a9190613be0565b905060006009600084815260200190815260200160002054905060006008838154811061293a57612939613e8d565b5b90600052602060002001549050806008838154811061295c5761295b613e8d565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806129ab576129aa613e5e565b5b6001900381819060005260206000200160009055905550505050565b60006129d283610f9a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aad906138c8565b60405180910390fd5b612abf816119bf565b15612aff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af6906137c8565b60405180910390fd5b612b0b60008383612435565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b5b9190613b59565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612c3390613cf4565b90600052602060002090601f016020900481019282612c555760008555612c9c565b82601f10612c6e57805160ff1916838001178555612c9c565b82800160010185558215612c9c579182015b82811115612c9b578251825591602001919060010190612c80565b5b509050612ca99190612cad565b5090565b5b80821115612cc6576000816000905550600101612cae565b5090565b6000612cdd612cd884613a88565b613a63565b90508083825260208201905082856020860282011115612d0057612cff613ef0565b5b60005b85811015612d305781612d168882612eb1565b845260208401935060208301925050600181019050612d03565b5050509392505050565b6000612d4d612d4884613ab4565b613a63565b905082815260208101848484011115612d6957612d68613ef5565b5b612d74848285613c88565b509392505050565b6000612d8f612d8a84613ae5565b613a63565b905082815260208101848484011115612dab57612daa613ef5565b5b612db6848285613c88565b509392505050565b600081359050612dcd816145c2565b92915050565b600081519050612de2816145c2565b92915050565b600082601f830112612dfd57612dfc613eeb565b5b8135612e0d848260208601612cca565b91505092915050565b600081359050612e25816145d9565b92915050565b600081359050612e3a816145f0565b92915050565b600081519050612e4f816145f0565b92915050565b600082601f830112612e6a57612e69613eeb565b5b8135612e7a848260208601612d3a565b91505092915050565b600082601f830112612e9857612e97613eeb565b5b8135612ea8848260208601612d7c565b91505092915050565b600081359050612ec081614607565b92915050565b600081519050612ed581614607565b92915050565b600060208284031215612ef157612ef0613eff565b5b6000612eff84828501612dbe565b91505092915050565b600060208284031215612f1e57612f1d613eff565b5b6000612f2c84828501612dd3565b91505092915050565b60008060408385031215612f4c57612f4b613eff565b5b6000612f5a85828601612dbe565b9250506020612f6b85828601612dbe565b9150509250929050565b600080600060608486031215612f8e57612f8d613eff565b5b6000612f9c86828701612dbe565b9350506020612fad86828701612dbe565b9250506040612fbe86828701612eb1565b9150509250925092565b60008060008060808587031215612fe257612fe1613eff565b5b6000612ff087828801612dbe565b945050602061300187828801612dbe565b935050604061301287828801612eb1565b925050606085013567ffffffffffffffff81111561303357613032613efa565b5b61303f87828801612e55565b91505092959194509250565b6000806040838503121561306257613061613eff565b5b600061307085828601612dbe565b925050602061308185828601612e16565b9150509250929050565b600080604083850312156130a2576130a1613eff565b5b60006130b085828601612dbe565b92505060206130c185828601612eb1565b9150509250929050565b6000602082840312156130e1576130e0613eff565b5b600082013567ffffffffffffffff8111156130ff576130fe613efa565b5b61310b84828501612de8565b91505092915050565b60006020828403121561312a57613129613eff565b5b600061313884828501612e2b565b91505092915050565b60006020828403121561315757613156613eff565b5b600061316584828501612e40565b91505092915050565b60006020828403121561318457613183613eff565b5b600082013567ffffffffffffffff8111156131a2576131a1613efa565b5b6131ae84828501612e83565b91505092915050565b6000602082840312156131cd576131cc613eff565b5b60006131db84828501612eb1565b91505092915050565b6000602082840312156131fa576131f9613eff565b5b600061320884828501612ec6565b91505092915050565b61321a81613c14565b82525050565b61322981613c26565b82525050565b600061323a82613b16565b6132448185613b2c565b9350613254818560208601613c97565b61325d81613f04565b840191505092915050565b600061327382613b21565b61327d8185613b3d565b935061328d818560208601613c97565b61329681613f04565b840191505092915050565b60006132ac82613b21565b6132b68185613b4e565b93506132c6818560208601613c97565b80840191505092915050565b60006132df602283613b3d565b91506132ea82613f15565b604082019050919050565b6000613302602b83613b3d565b915061330d82613f64565b604082019050919050565b6000613325603283613b3d565b915061333082613fb3565b604082019050919050565b6000613348602683613b3d565b915061335382614002565b604082019050919050565b600061336b601c83613b3d565b915061337682614051565b602082019050919050565b600061338e602483613b3d565b91506133998261407a565b604082019050919050565b60006133b1601983613b3d565b91506133bc826140c9565b602082019050919050565b60006133d4602c83613b3d565b91506133df826140f2565b604082019050919050565b60006133f7603883613b3d565b915061340282614141565b604082019050919050565b600061341a602a83613b3d565b915061342582614190565b604082019050919050565b600061343d602983613b3d565b9150613448826141df565b604082019050919050565b6000613460601e83613b3d565b915061346b8261422e565b602082019050919050565b6000613483602083613b3d565b915061348e82614257565b602082019050919050565b60006134a6602c83613b3d565b91506134b182614280565b604082019050919050565b60006134c9600583613b4e565b91506134d4826142cf565b600582019050919050565b60006134ec602083613b3d565b91506134f7826142f8565b602082019050919050565b600061350f602983613b3d565b915061351a82614321565b604082019050919050565b6000613532602f83613b3d565b915061353d82614370565b604082019050919050565b6000613555602a83613b3d565b9150613560826143bf565b604082019050919050565b6000613578602183613b3d565b91506135838261440e565b604082019050919050565b600061359b603183613b3d565b91506135a68261445d565b604082019050919050565b60006135be602c83613b3d565b91506135c9826144ac565b604082019050919050565b60006135e1602483613b3d565b91506135ec826144fb565b604082019050919050565b6000613604602d83613b3d565b915061360f8261454a565b604082019050919050565b6000613627601283613b3d565b915061363282614599565b602082019050919050565b61364681613c7e565b82525050565b600061365882856132a1565b915061366482846132a1565b915061366f826134bc565b91508190509392505050565b60006020820190506136906000830184613211565b92915050565b60006080820190506136ab6000830187613211565b6136b86020830186613211565b6136c5604083018561363d565b81810360608301526136d7818461322f565b905095945050505050565b60006040820190506136f76000830185613211565b613704602083018461363d565b9392505050565b60006020820190506137206000830184613220565b92915050565b600060208201905081810360008301526137408184613268565b905092915050565b60006020820190508181036000830152613761816132d2565b9050919050565b60006020820190508181036000830152613781816132f5565b9050919050565b600060208201905081810360008301526137a181613318565b9050919050565b600060208201905081810360008301526137c18161333b565b9050919050565b600060208201905081810360008301526137e18161335e565b9050919050565b6000602082019050818103600083015261380181613381565b9050919050565b60006020820190508181036000830152613821816133a4565b9050919050565b60006020820190508181036000830152613841816133c7565b9050919050565b60006020820190508181036000830152613861816133ea565b9050919050565b600060208201905081810360008301526138818161340d565b9050919050565b600060208201905081810360008301526138a181613430565b9050919050565b600060208201905081810360008301526138c181613453565b9050919050565b600060208201905081810360008301526138e181613476565b9050919050565b6000602082019050818103600083015261390181613499565b9050919050565b60006020820190508181036000830152613921816134df565b9050919050565b6000602082019050818103600083015261394181613502565b9050919050565b6000602082019050818103600083015261396181613525565b9050919050565b6000602082019050818103600083015261398181613548565b9050919050565b600060208201905081810360008301526139a18161356b565b9050919050565b600060208201905081810360008301526139c18161358e565b9050919050565b600060208201905081810360008301526139e1816135b1565b9050919050565b60006020820190508181036000830152613a01816135d4565b9050919050565b60006020820190508181036000830152613a21816135f7565b9050919050565b60006020820190508181036000830152613a418161361a565b9050919050565b6000602082019050613a5d600083018461363d565b92915050565b6000613a6d613a7e565b9050613a798282613d26565b919050565b6000604051905090565b600067ffffffffffffffff821115613aa357613aa2613ebc565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613acf57613ace613ebc565b5b613ad882613f04565b9050602081019050919050565b600067ffffffffffffffff821115613b0057613aff613ebc565b5b613b0982613f04565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b6482613c7e565b9150613b6f83613c7e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ba457613ba3613dd1565b5b828201905092915050565b6000613bba82613c7e565b9150613bc583613c7e565b925082613bd557613bd4613e00565b5b828204905092915050565b6000613beb82613c7e565b9150613bf683613c7e565b925082821015613c0957613c08613dd1565b5b828203905092915050565b6000613c1f82613c5e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613cb5578082015181840152602081019050613c9a565b83811115613cc4576000848401525b50505050565b6000613cd582613c7e565b91506000821415613ce957613ce8613dd1565b5b600182039050919050565b60006002820490506001821680613d0c57607f821691505b60208210811415613d2057613d1f613e2f565b5b50919050565b613d2f82613f04565b810181811067ffffffffffffffff82111715613d4e57613d4d613ebc565b5b80604052505050565b6000613d6282613c7e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d9557613d94613dd1565b5b600182019050919050565b6000613dab82613c7e565b9150613db683613c7e565b925082613dc657613dc5613e00565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f54686520746f6b656e20686173206265656e20616c726561647920636c61696d60008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f50726f76696465642076616c7565206973206e6f7420706f7a69746976650000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f596f7520646f206e6f7420706f737365737320656e6f75676820636c61696d6160008201527f626c6520746f6b656e7300000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f436c61696d696e67206973206e6f742061637469766520617420746865206d6f60008201527f6d656e7400000000000000000000000000000000000000000000000000000000602082015250565b7f596f7520646f206e6f74206f776e2074686520746f6b656e207769746820746860008201527f652070726f766964656420696400000000000000000000000000000000000000602082015250565b7f4d65746164617461206973206c6f636b65640000000000000000000000000000600082015250565b6145cb81613c14565b81146145d657600080fd5b50565b6145e281613c26565b81146145ed57600080fd5b50565b6145f981613c32565b811461460457600080fd5b50565b61461081613c7e565b811461461b57600080fd5b5056fea2646970667358221220ab688a11cb216047f1311a53030c7109b0aea15c14728c890bf6dd766356113664736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c80636352211e11610104578063989bdbb6116100a2578063c87b56dd11610071578063c87b56dd146104f2578063d7e45cd714610522578063e985e9c514610540578063f2fde38b14610570576101cf565b8063989bdbb6146104805780639e34070f1461048a578063a22cb465146104ba578063b88d4fde146104d6576101cf565b8063715018a6116100de578063715018a61461041c5780637fd9cc01146104265780638da5cb5b1461044457806395d89b4114610462576101cf565b80636352211e146103b25780636d60e6c1146103e257806370a08231146103ec576101cf565b80632f745c591161017157806342842e0e1161014b57806342842e0e1461032c5780634f6ccce7146103485780635303f68c1461037857806355f804b314610396576101cf565b80632f745c59146102c4578063379607f5146102f45780633b67cf1a14610310576101cf565b8063095ea7b3116101ad578063095ea7b314610252578063111d00761461026e57806318160ddd1461028a57806323b872dd146102a8576101cf565b806301ffc9a7146101d457806306fdde0314610204578063081812fc14610222575b600080fd5b6101ee60048036038101906101e99190613114565b61058c565b6040516101fb919061370b565b60405180910390f35b61020c610606565b6040516102199190613726565b60405180910390f35b61023c600480360381019061023791906131b7565b610698565b604051610249919061367b565b60405180910390f35b61026c6004803603810190610267919061308b565b61071d565b005b610288600480360381019061028391906131b7565b610835565b005b6102926108bd565b60405161029f9190613a48565b60405180910390f35b6102c260048036038101906102bd9190612f75565b6108ca565b005b6102de60048036038101906102d9919061308b565b61092a565b6040516102eb9190613a48565b60405180910390f35b61030e600480360381019061030991906131b7565b6109cf565b005b61032a600480360381019061032591906130cb565b610a2a565b005b61034660048036038101906103419190612f75565b610cb6565b005b610362600480360381019061035d91906131b7565b610cd6565b60405161036f9190613a48565b60405180910390f35b610380610d47565b60405161038d919061370b565b60405180910390f35b6103b060048036038101906103ab919061316e565b610d5a565b005b6103cc60048036038101906103c791906131b7565b610e40565b6040516103d9919061367b565b60405180910390f35b6103ea610ef2565b005b61040660048036038101906104019190612edb565b610f9a565b6040516104139190613a48565b60405180910390f35b610424611052565b005b61042e61118f565b60405161043b919061367b565b60405180910390f35b61044c6111b5565b604051610459919061367b565b60405180910390f35b61046a6111df565b6040516104779190613726565b60405180910390f35b610488611271565b005b6104a4600480360381019061049f91906131b7565b61130a565b6040516104b1919061370b565b60405180910390f35b6104d460048036038101906104cf919061304b565b611334565b005b6104f060048036038101906104eb9190612fc8565b6114b5565b005b61050c600480360381019061050791906131b7565b611517565b6040516105199190613726565b60405180910390f35b61052a61168a565b604051610537919061370b565b60405180910390f35b61055a60048036038101906105559190612f35565b61169d565b604051610567919061370b565b60405180910390f35b61058a60048036038101906105859190612edb565b611731565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105ff57506105fe826118dd565b5b9050919050565b60606000805461061590613cf4565b80601f016020809104026020016040519081016040528092919081815260200182805461064190613cf4565b801561068e5780601f106106635761010080835404028352916020019161068e565b820191906000526020600020905b81548152906001019060200180831161067157829003601f168201915b5050505050905090565b60006106a3826119bf565b6106e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d9906138e8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061072882610e40565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079090613988565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107b8611a2b565b73ffffffffffffffffffffffffffffffffffffffff1614806107e757506107e6816107e1611a2b565b61169d565b5b610826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081d90613848565b60405180910390fd5b6108308383611a33565b505050565b61083d611a2b565b73ffffffffffffffffffffffffffffffffffffffff1661085b6111b5565b73ffffffffffffffffffffffffffffffffffffffff16146108b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a890613908565b60405180910390fd5b6108ba81611aec565b50565b6000600880549050905090565b6108db6108d5611a2b565b82611e24565b61091a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610911906139a8565b60405180910390fd5b610925838383611f02565b505050565b600061093583610f9a565b8210610976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096d90613768565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600a60149054906101000a900460ff16610a1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a15906139e8565b60405180910390fd5b610a2781611aec565b50565b600a60149054906101000a900460ff16610a79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a70906139e8565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060005b8251811015610c3a5760008273ffffffffffffffffffffffffffffffffffffffff16636352211e858481518110610add57610adc613e8d565b5b60200260200101516040518263ffffffff1660e01b8152600401610b019190613a48565b602060405180830381600087803b158015610b1b57600080fd5b505af1158015610b2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b539190612f08565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bba90613a08565b60405180910390fd5b610be6848381518110610bd957610bd8613e8d565b5b602002602001015161130a565b15610c26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1d90613748565b60405180910390fd5b508080610c3290613d57565b915050610aa3565b5060005b8251811015610cb157610c5833610c536108bd565b61215e565b6001600c6000858481518110610c7157610c70613e8d565b5b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610ca990613d57565b915050610c3e565b505050565b610cd1838383604051806020016040528060008152506114b5565b505050565b6000610ce06108bd565b8210610d21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d18906139c8565b60405180910390fd5b60088281548110610d3557610d34613e8d565b5b90600052602060002001549050919050565b600a60149054906101000a900460ff1681565b610d62611a2b565b73ffffffffffffffffffffffffffffffffffffffff16610d806111b5565b73ffffffffffffffffffffffffffffffffffffffff1614610dd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcd90613908565b60405180910390fd5b600d60009054906101000a900460ff1615610e26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1d90613a28565b60405180910390fd5b80600e9080519060200190610e3c929190612c27565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee090613888565b60405180910390fd5b80915050919050565b610efa611a2b565b73ffffffffffffffffffffffffffffffffffffffff16610f186111b5565b73ffffffffffffffffffffffffffffffffffffffff1614610f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6590613908565b60405180910390fd5b600a60149054906101000a900460ff1615600a60146101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561100b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100290613868565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61105a611a2b565b73ffffffffffffffffffffffffffffffffffffffff166110786111b5565b73ffffffffffffffffffffffffffffffffffffffff16146110ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c590613908565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546111ee90613cf4565b80601f016020809104026020016040519081016040528092919081815260200182805461121a90613cf4565b80156112675780601f1061123c57610100808354040283529160200191611267565b820191906000526020600020905b81548152906001019060200180831161124a57829003601f168201915b5050505050905090565b611279611a2b565b73ffffffffffffffffffffffffffffffffffffffff166112976111b5565b73ffffffffffffffffffffffffffffffffffffffff16146112ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e490613908565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b6000600c600083815260200190815260200160002060009054906101000a900460ff169050919050565b61133c611a2b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a190613808565b60405180910390fd5b80600560006113b7611a2b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611464611a2b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114a9919061370b565b60405180910390a35050565b6114c66114c0611a2b565b83611e24565b611505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fc906139a8565b60405180910390fd5b6115118484848461217c565b50505050565b6060611522826119bf565b611561576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155890613948565b60405180910390fd5b6000600f6000848152602001908152602001600020805461158190613cf4565b80601f01602080910402602001604051908101604052809291908181526020018280546115ad90613cf4565b80156115fa5780601f106115cf576101008083540402835291602001916115fa565b820191906000526020600020905b8154815290600101906020018083116115dd57829003601f168201915b50505050509050600061160b6121d8565b9050600081511415611621578192505050611685565b60008251111561165657808260405160200161163e92919061364c565b60405160208183030381529060405292505050611685565b806116608561226a565b60405160200161167192919061364c565b604051602081830303815290604052925050505b919050565b600d60009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611739611a2b565b73ffffffffffffffffffffffffffffffffffffffff166117576111b5565b73ffffffffffffffffffffffffffffffffffffffff16146117ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a490613908565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561181d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611814906137a8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119a857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806119b857506119b7826123cb565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611aa683610e40565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008111611b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b26906138a8565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611b91919061367b565b602060405180830381600087803b158015611bab57600080fd5b505af1158015611bbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be391906131e4565b905060008167ffffffffffffffff811115611c0157611c00613ebc565b5b604051908082528060200260200182016040528015611c2f5781602001602082028036833780820191505090505b5090506000805b83811015611d1f5760008573ffffffffffffffffffffffffffffffffffffffff16632f745c5933846040518363ffffffff1660e01b8152600401611c7b9291906136e2565b602060405180830381600087803b158015611c9557600080fd5b505af1158015611ca9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ccd91906131e4565b905080848381518110611ce357611ce2613e8d565b5b602002602001018181525050611cf88161130a565b611d0b578280611d0790613d57565b9350505b508080611d1790613d57565b915050611c36565b5084811015611d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5a90613968565b60405180910390fd5b60005b83811015611e1c57611d91838281518110611d8457611d83613e8d565b5b602002602001015161130a565b158015611d9e5750600086115b15611e0957611db433611daf6108bd565b61215e565b6001600c6000858481518110611dcd57611dcc613e8d565b5b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508580611e0590613cca565b9650505b8080611e1490613d57565b915050611d66565b505050505050565b6000611e2f826119bf565b611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6590613828565b60405180910390fd5b6000611e7983610e40565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ee857508373ffffffffffffffffffffffffffffffffffffffff16611ed084610698565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ef95750611ef8818561169d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f2282610e40565b73ffffffffffffffffffffffffffffffffffffffff1614611f78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6f90613928565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fe8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdf906137e8565b60405180910390fd5b611ff3838383612435565b611ffe600082611a33565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461204e9190613be0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120a59190613b59565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612178828260405180602001604052806000815250612549565b5050565b612187848484611f02565b612193848484846125a4565b6121d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c990613788565b60405180910390fd5b50505050565b6060600e80546121e790613cf4565b80601f016020809104026020016040519081016040528092919081815260200182805461221390613cf4565b80156122605780601f1061223557610100808354040283529160200191612260565b820191906000526020600020905b81548152906001019060200180831161224357829003601f168201915b5050505050905090565b606060008214156122b2576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123c6565b600082905060005b600082146122e45780806122cd90613d57565b915050600a826122dd9190613baf565b91506122ba565b60008167ffffffffffffffff811115612300576122ff613ebc565b5b6040519080825280601f01601f1916602001820160405280156123325781602001600182028036833780820191505090505b5090505b600085146123bf5760018261234b9190613be0565b9150600a8561235a9190613da0565b60306123669190613b59565b60f81b81838151811061237c5761237b613e8d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123b89190613baf565b9450612336565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61244083838361273b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124835761247e81612740565b6124c2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124c1576124c08382612789565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561250557612500816128f6565b612544565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125435761254282826129c7565b5b5b505050565b6125538383612a46565b61256060008484846125a4565b61259f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259690613788565b60405180910390fd5b505050565b60006125c58473ffffffffffffffffffffffffffffffffffffffff16612c14565b1561272e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125ee611a2b565b8786866040518563ffffffff1660e01b81526004016126109493929190613696565b602060405180830381600087803b15801561262a57600080fd5b505af192505050801561265b57506040513d601f19601f820116820180604052508101906126589190613141565b60015b6126de573d806000811461268b576040519150601f19603f3d011682016040523d82523d6000602084013e612690565b606091505b506000815114156126d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126cd90613788565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612733565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161279684610f9a565b6127a09190613be0565b9050600060076000848152602001908152602001600020549050818114612885576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061290a9190613be0565b905060006009600084815260200190815260200160002054905060006008838154811061293a57612939613e8d565b5b90600052602060002001549050806008838154811061295c5761295b613e8d565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806129ab576129aa613e5e565b5b6001900381819060005260206000200160009055905550505050565b60006129d283610f9a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aad906138c8565b60405180910390fd5b612abf816119bf565b15612aff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af6906137c8565b60405180910390fd5b612b0b60008383612435565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b5b9190613b59565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612c3390613cf4565b90600052602060002090601f016020900481019282612c555760008555612c9c565b82601f10612c6e57805160ff1916838001178555612c9c565b82800160010185558215612c9c579182015b82811115612c9b578251825591602001919060010190612c80565b5b509050612ca99190612cad565b5090565b5b80821115612cc6576000816000905550600101612cae565b5090565b6000612cdd612cd884613a88565b613a63565b90508083825260208201905082856020860282011115612d0057612cff613ef0565b5b60005b85811015612d305781612d168882612eb1565b845260208401935060208301925050600181019050612d03565b5050509392505050565b6000612d4d612d4884613ab4565b613a63565b905082815260208101848484011115612d6957612d68613ef5565b5b612d74848285613c88565b509392505050565b6000612d8f612d8a84613ae5565b613a63565b905082815260208101848484011115612dab57612daa613ef5565b5b612db6848285613c88565b509392505050565b600081359050612dcd816145c2565b92915050565b600081519050612de2816145c2565b92915050565b600082601f830112612dfd57612dfc613eeb565b5b8135612e0d848260208601612cca565b91505092915050565b600081359050612e25816145d9565b92915050565b600081359050612e3a816145f0565b92915050565b600081519050612e4f816145f0565b92915050565b600082601f830112612e6a57612e69613eeb565b5b8135612e7a848260208601612d3a565b91505092915050565b600082601f830112612e9857612e97613eeb565b5b8135612ea8848260208601612d7c565b91505092915050565b600081359050612ec081614607565b92915050565b600081519050612ed581614607565b92915050565b600060208284031215612ef157612ef0613eff565b5b6000612eff84828501612dbe565b91505092915050565b600060208284031215612f1e57612f1d613eff565b5b6000612f2c84828501612dd3565b91505092915050565b60008060408385031215612f4c57612f4b613eff565b5b6000612f5a85828601612dbe565b9250506020612f6b85828601612dbe565b9150509250929050565b600080600060608486031215612f8e57612f8d613eff565b5b6000612f9c86828701612dbe565b9350506020612fad86828701612dbe565b9250506040612fbe86828701612eb1565b9150509250925092565b60008060008060808587031215612fe257612fe1613eff565b5b6000612ff087828801612dbe565b945050602061300187828801612dbe565b935050604061301287828801612eb1565b925050606085013567ffffffffffffffff81111561303357613032613efa565b5b61303f87828801612e55565b91505092959194509250565b6000806040838503121561306257613061613eff565b5b600061307085828601612dbe565b925050602061308185828601612e16565b9150509250929050565b600080604083850312156130a2576130a1613eff565b5b60006130b085828601612dbe565b92505060206130c185828601612eb1565b9150509250929050565b6000602082840312156130e1576130e0613eff565b5b600082013567ffffffffffffffff8111156130ff576130fe613efa565b5b61310b84828501612de8565b91505092915050565b60006020828403121561312a57613129613eff565b5b600061313884828501612e2b565b91505092915050565b60006020828403121561315757613156613eff565b5b600061316584828501612e40565b91505092915050565b60006020828403121561318457613183613eff565b5b600082013567ffffffffffffffff8111156131a2576131a1613efa565b5b6131ae84828501612e83565b91505092915050565b6000602082840312156131cd576131cc613eff565b5b60006131db84828501612eb1565b91505092915050565b6000602082840312156131fa576131f9613eff565b5b600061320884828501612ec6565b91505092915050565b61321a81613c14565b82525050565b61322981613c26565b82525050565b600061323a82613b16565b6132448185613b2c565b9350613254818560208601613c97565b61325d81613f04565b840191505092915050565b600061327382613b21565b61327d8185613b3d565b935061328d818560208601613c97565b61329681613f04565b840191505092915050565b60006132ac82613b21565b6132b68185613b4e565b93506132c6818560208601613c97565b80840191505092915050565b60006132df602283613b3d565b91506132ea82613f15565b604082019050919050565b6000613302602b83613b3d565b915061330d82613f64565b604082019050919050565b6000613325603283613b3d565b915061333082613fb3565b604082019050919050565b6000613348602683613b3d565b915061335382614002565b604082019050919050565b600061336b601c83613b3d565b915061337682614051565b602082019050919050565b600061338e602483613b3d565b91506133998261407a565b604082019050919050565b60006133b1601983613b3d565b91506133bc826140c9565b602082019050919050565b60006133d4602c83613b3d565b91506133df826140f2565b604082019050919050565b60006133f7603883613b3d565b915061340282614141565b604082019050919050565b600061341a602a83613b3d565b915061342582614190565b604082019050919050565b600061343d602983613b3d565b9150613448826141df565b604082019050919050565b6000613460601e83613b3d565b915061346b8261422e565b602082019050919050565b6000613483602083613b3d565b915061348e82614257565b602082019050919050565b60006134a6602c83613b3d565b91506134b182614280565b604082019050919050565b60006134c9600583613b4e565b91506134d4826142cf565b600582019050919050565b60006134ec602083613b3d565b91506134f7826142f8565b602082019050919050565b600061350f602983613b3d565b915061351a82614321565b604082019050919050565b6000613532602f83613b3d565b915061353d82614370565b604082019050919050565b6000613555602a83613b3d565b9150613560826143bf565b604082019050919050565b6000613578602183613b3d565b91506135838261440e565b604082019050919050565b600061359b603183613b3d565b91506135a68261445d565b604082019050919050565b60006135be602c83613b3d565b91506135c9826144ac565b604082019050919050565b60006135e1602483613b3d565b91506135ec826144fb565b604082019050919050565b6000613604602d83613b3d565b915061360f8261454a565b604082019050919050565b6000613627601283613b3d565b915061363282614599565b602082019050919050565b61364681613c7e565b82525050565b600061365882856132a1565b915061366482846132a1565b915061366f826134bc565b91508190509392505050565b60006020820190506136906000830184613211565b92915050565b60006080820190506136ab6000830187613211565b6136b86020830186613211565b6136c5604083018561363d565b81810360608301526136d7818461322f565b905095945050505050565b60006040820190506136f76000830185613211565b613704602083018461363d565b9392505050565b60006020820190506137206000830184613220565b92915050565b600060208201905081810360008301526137408184613268565b905092915050565b60006020820190508181036000830152613761816132d2565b9050919050565b60006020820190508181036000830152613781816132f5565b9050919050565b600060208201905081810360008301526137a181613318565b9050919050565b600060208201905081810360008301526137c18161333b565b9050919050565b600060208201905081810360008301526137e18161335e565b9050919050565b6000602082019050818103600083015261380181613381565b9050919050565b60006020820190508181036000830152613821816133a4565b9050919050565b60006020820190508181036000830152613841816133c7565b9050919050565b60006020820190508181036000830152613861816133ea565b9050919050565b600060208201905081810360008301526138818161340d565b9050919050565b600060208201905081810360008301526138a181613430565b9050919050565b600060208201905081810360008301526138c181613453565b9050919050565b600060208201905081810360008301526138e181613476565b9050919050565b6000602082019050818103600083015261390181613499565b9050919050565b60006020820190508181036000830152613921816134df565b9050919050565b6000602082019050818103600083015261394181613502565b9050919050565b6000602082019050818103600083015261396181613525565b9050919050565b6000602082019050818103600083015261398181613548565b9050919050565b600060208201905081810360008301526139a18161356b565b9050919050565b600060208201905081810360008301526139c18161358e565b9050919050565b600060208201905081810360008301526139e1816135b1565b9050919050565b60006020820190508181036000830152613a01816135d4565b9050919050565b60006020820190508181036000830152613a21816135f7565b9050919050565b60006020820190508181036000830152613a418161361a565b9050919050565b6000602082019050613a5d600083018461363d565b92915050565b6000613a6d613a7e565b9050613a798282613d26565b919050565b6000604051905090565b600067ffffffffffffffff821115613aa357613aa2613ebc565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613acf57613ace613ebc565b5b613ad882613f04565b9050602081019050919050565b600067ffffffffffffffff821115613b0057613aff613ebc565b5b613b0982613f04565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b6482613c7e565b9150613b6f83613c7e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ba457613ba3613dd1565b5b828201905092915050565b6000613bba82613c7e565b9150613bc583613c7e565b925082613bd557613bd4613e00565b5b828204905092915050565b6000613beb82613c7e565b9150613bf683613c7e565b925082821015613c0957613c08613dd1565b5b828203905092915050565b6000613c1f82613c5e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613cb5578082015181840152602081019050613c9a565b83811115613cc4576000848401525b50505050565b6000613cd582613c7e565b91506000821415613ce957613ce8613dd1565b5b600182039050919050565b60006002820490506001821680613d0c57607f821691505b60208210811415613d2057613d1f613e2f565b5b50919050565b613d2f82613f04565b810181811067ffffffffffffffff82111715613d4e57613d4d613ebc565b5b80604052505050565b6000613d6282613c7e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d9557613d94613dd1565b5b600182019050919050565b6000613dab82613c7e565b9150613db683613c7e565b925082613dc657613dc5613e00565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f54686520746f6b656e20686173206265656e20616c726561647920636c61696d60008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f50726f76696465642076616c7565206973206e6f7420706f7a69746976650000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f596f7520646f206e6f7420706f737365737320656e6f75676820636c61696d6160008201527f626c6520746f6b656e7300000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f436c61696d696e67206973206e6f742061637469766520617420746865206d6f60008201527f6d656e7400000000000000000000000000000000000000000000000000000000602082015250565b7f596f7520646f206e6f74206f776e2074686520746f6b656e207769746820746860008201527f652070726f766964656420696400000000000000000000000000000000000000602082015250565b7f4d65746164617461206973206c6f636b65640000000000000000000000000000600082015250565b6145cb81613c14565b81146145d657600080fd5b50565b6145e281613c26565b81146145ed57600080fd5b50565b6145f981613c32565b811461460457600080fd5b50565b61461081613c7e565b811461461b57600080fd5b5056fea2646970667358221220ab688a11cb216047f1311a53030c7109b0aea15c14728c890bf6dd766356113664736f6c63430008070033
Deployed Bytecode Sourcemap
48782:4325:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42630:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30929:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32381:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31918:397;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51755:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43279:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33271:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42947:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50762:182;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50952:789;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33647:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43469:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48966:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49654:167;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30623:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49338:92;;;:::i;:::-;;30353:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28189:148;;;:::i;:::-;;49008:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27538:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31098:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49438:83;;;:::i;:::-;;50648:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32674:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33869:285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49829:811;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49149:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33040:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28492:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42630:233;42732:4;42771:35;42756:50;;;:11;:50;;;;:99;;;;42819:36;42843:11;42819:23;:36::i;:::-;42756:99;42749:106;;42630:233;;;:::o;30929:100::-;30983:13;31016:5;31009:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30929:100;:::o;32381:221::-;32457:7;32485:16;32493:7;32485;:16::i;:::-;32477:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32570:15;:24;32586:7;32570:24;;;;;;;;;;;;;;;;;;;;;32563:31;;32381:221;;;:::o;31918:397::-;31999:13;32015:23;32030:7;32015:14;:23::i;:::-;31999:39;;32063:5;32057:11;;:2;:11;;;;32049:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32143:5;32127:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32152:37;32169:5;32176:12;:10;:12::i;:::-;32152:16;:37::i;:::-;32127:62;32119:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32286:21;32295:2;32299:7;32286:8;:21::i;:::-;31988:327;31918:397;;:::o;51755:131::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51842:36:::1;51855:22;51842:12;:36::i;:::-;51755:131:::0;:::o;43279:113::-;43340:7;43367:10;:17;;;;43360:24;;43279:113;:::o;33271:305::-;33432:41;33451:12;:10;:12::i;:::-;33465:7;33432:18;:41::i;:::-;33424:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33540:28;33550:4;33556:2;33560:7;33540:9;:28::i;:::-;33271:305;;;:::o;42947:256::-;43044:7;43080:23;43097:5;43080:16;:23::i;:::-;43072:5;:31;43064:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43169:12;:19;43182:5;43169:19;;;;;;;;;;;;;;;:26;43189:5;43169:26;;;;;;;;;;;;43162:33;;42947:256;;;;:::o;50762:182::-;50835:13;;;;;;;;;;;50827:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;50900:36;50913:22;50900:12;:36::i;:::-;50762:182;:::o;50952:789::-;51029:13;;;;;;;;;;;51021:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;51094:52;51177:25;;;;;;;;;;;51094:109;;51219:10;51214:342;51239:12;:19;51235:1;:23;51214:342;;;51280:22;51305:24;:32;;;51338:12;51351:1;51338:15;;;;;;;;:::i;:::-;;;;;;;;51305:49;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51280:74;;51395:10;51377:28;;:14;:28;;;51369:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;51479:26;51489:12;51502:1;51489:15;;;;;;;;:::i;:::-;;;;;;;;51479:9;:26::i;:::-;51478:27;51470:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;51265:291;51260:3;;;;;:::i;:::-;;;;51214:342;;;;51573:10;51568:166;51593:12;:19;51589:1;:23;51568:166;;;51634:36;51644:10;51656:13;:11;:13::i;:::-;51634:9;:36::i;:::-;51718:4;51685:13;:30;51699:12;51712:1;51699:15;;;;;;;;:::i;:::-;;;;;;;;51685:30;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;51614:3;;;;;:::i;:::-;;;;51568:166;;;;51010:731;50952:789;:::o;33647:151::-;33751:39;33768:4;33774:2;33778:7;33751:39;;;;;;;;;;;;:16;:39::i;:::-;33647:151;;;:::o;43469:233::-;43544:7;43580:30;:28;:30::i;:::-;43572:5;:38;43564:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;43677:10;43688:5;43677:17;;;;;;;;:::i;:::-;;;;;;;;;;43670:24;;43469:233;;;:::o;48966:33::-;;;;;;;;;;;;;:::o;49654:167::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49737:16:::1;;;;;;;;;;;49736:17;49728:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;49805:8;49786:16;:27;;;;;;;;;;;;:::i;:::-;;49654:167:::0;:::o;30623:239::-;30695:7;30715:13;30731:7;:16;30739:7;30731:16;;;;;;;;;;;;;;;;;;;;;30715:32;;30783:1;30766:19;;:5;:19;;;;30758:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30849:5;30842:12;;;30623:239;;;:::o;49338:92::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49409:13:::1;;;;;;;;;;;49408:14;49392:13;;:30;;;;;;;;;;;;;;;;;;49338:92::o:0;30353:208::-;30425:7;30470:1;30453:19;;:5;:19;;;;30445:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30537:9;:16;30547:5;30537:16;;;;;;;;;;;;;;;;30530:23;;30353:208;;;:::o;28189:148::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28296:1:::1;28259:40;;28280:6;;;;;;;;;;;28259:40;;;;;;;;;;;;28327:1;28310:6;;:19;;;;;;;;;;;;;;;;;;28189:148::o:0;49008:85::-;;;;;;;;;;;;;:::o;27538:87::-;27584:7;27611:6;;;;;;;;;;;27604:13;;27538:87;:::o;31098:104::-;31154:13;31187:7;31180:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31098:104;:::o;49438:83::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49509:4:::1;49490:16;;:23;;;;;;;;;;;;;;;;;;49438:83::o:0;50648:106::-;50703:4;50727:13;:19;50741:4;50727:19;;;;;;;;;;;;;;;;;;;;;50720:26;;50648:106;;;:::o;32674:295::-;32789:12;:10;:12::i;:::-;32777:24;;:8;:24;;;;32769:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;32889:8;32844:18;:32;32863:12;:10;:12::i;:::-;32844:32;;;;;;;;;;;;;;;:42;32877:8;32844:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;32942:8;32913:48;;32928:12;:10;:12::i;:::-;32913:48;;;32952:8;32913:48;;;;;;:::i;:::-;;;;;;;;32674:295;;:::o;33869:285::-;34001:41;34020:12;:10;:12::i;:::-;34034:7;34001:18;:41::i;:::-;33993:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34107:39;34121:4;34127:2;34131:7;34140:5;34107:13;:39::i;:::-;33869:285;;;;:::o;49829:811::-;49902:13;49936:16;49944:7;49936;:16::i;:::-;49928:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;50017:23;50043:10;:19;50054:7;50043:19;;;;;;;;;;;50017:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50073:18;50094:10;:8;:10::i;:::-;50073:31;;50202:1;50186:4;50180:18;:23;50176:72;;;50227:9;50220:16;;;;;;50176:72;50378:1;50358:9;50352:23;:27;50348:117;;;50427:4;50433:9;50410:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50396:57;;;;;;50348:117;50597:4;50603:18;:7;:16;:18::i;:::-;50580:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50566:66;;;;49829:811;;;;:::o;49149:36::-;;;;;;;;;;;;;:::o;33040:164::-;33137:4;33161:18;:25;33180:5;33161:25;;;;;;;;;;;;;;;:35;33187:8;33161:35;;;;;;;;;;;;;;;;;;;;;;;;;33154:42;;33040:164;;;;:::o;28492:244::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28601:1:::1;28581:22;;:8;:22;;;;28573:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28691:8;28662:38;;28683:6;;;;;;;;;;;28662:38;;;;;;;;;;;;28720:8;28711:6;;:17;;;;;;;;;;;;;;;;;;28492:244:::0;:::o;30005:284::-;30107:4;30146:25;30131:40;;;:11;:40;;;;:101;;;;30199:33;30184:48;;;:11;:48;;;;30131:101;:150;;;;30245:36;30269:11;30245:23;:36::i;:::-;30131:150;30124:157;;30005:284;;;:::o;35621:127::-;35686:4;35738:1;35710:30;;:7;:16;35718:7;35710:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35703:37;;35621:127;;;:::o;26155:98::-;26208:7;26235:10;26228:17;;26155:98;:::o;39498:174::-;39600:2;39573:15;:24;39589:7;39573:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39656:7;39652:2;39618:46;;39627:23;39642:7;39627:14;:23::i;:::-;39618:46;;;;;;;;;;;;39498:174;;:::o;51894:1210::-;52001:1;51976:22;:26;51968:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52050:52;52133:25;;;;;;;;;;;52050:109;;52172:21;52196:24;:34;;;52231:10;52196:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52172:70;;52255:27;52299:13;52285:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52255:58;;52326:30;52378:9;52373:300;52397:13;52393:1;:17;52373:300;;;52432:19;52454:24;:44;;;52499:10;52511:1;52454:59;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52432:81;;52546:11;52530:10;52541:1;52530:13;;;;;;;;:::i;:::-;;;;;;;:27;;;;;52579:22;52589:11;52579:9;:22::i;:::-;52574:88;;52622:24;;;;;:::i;:::-;;;;52574:88;52417:256;52412:3;;;;;:::i;:::-;;;;52373:300;;;;52719:22;52693;:48;;52685:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;52806:6;52801:296;52822:13;52818:1;:17;52801:296;;;52862:24;52872:10;52883:1;52872:13;;;;;;;;:::i;:::-;;;;;;;;52862:9;:24::i;:::-;52861:25;:55;;;;;52915:1;52890:22;:26;52861:55;52857:229;;;52937:36;52947:10;52959:13;:11;:13::i;:::-;52937:9;:36::i;:::-;53023:4;52992:13;:28;53006:10;53017:1;53006:13;;;;;;;;:::i;:::-;;;;;;;;52992:28;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;53046:24;;;;;:::i;:::-;;;;52857:229;52837:3;;;;;:::i;:::-;;;;52801:296;;;;51957:1147;;;;51894:1210;:::o;35915:348::-;36008:4;36033:16;36041:7;36033;:16::i;:::-;36025:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36109:13;36125:23;36140:7;36125:14;:23::i;:::-;36109:39;;36178:5;36167:16;;:7;:16;;;:51;;;;36211:7;36187:31;;:20;36199:7;36187:11;:20::i;:::-;:31;;;36167:51;:87;;;;36222:32;36239:5;36246:7;36222:16;:32::i;:::-;36167:87;36159:96;;;35915:348;;;;:::o;38836:544::-;38961:4;38934:31;;:23;38949:7;38934:14;:23::i;:::-;:31;;;38926:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39044:1;39030:16;;:2;:16;;;;39022:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39100:39;39121:4;39127:2;39131:7;39100:20;:39::i;:::-;39204:29;39221:1;39225:7;39204:8;:29::i;:::-;39265:1;39246:9;:15;39256:4;39246:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39294:1;39277:9;:13;39287:2;39277:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39325:2;39306:7;:16;39314:7;39306:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39364:7;39360:2;39345:27;;39354:4;39345:27;;;;;;;;;;;;38836:544;;;:::o;36605:110::-;36681:26;36691:2;36695:7;36681:26;;;;;;;;;;;;:9;:26::i;:::-;36605:110;;:::o;35036:272::-;35150:28;35160:4;35166:2;35170:7;35150:9;:28::i;:::-;35197:48;35220:4;35226:2;35230:7;35239:5;35197:22;:48::i;:::-;35189:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35036:272;;;;:::o;49529:117::-;49589:13;49622:16;49615:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49529:117;:::o;7152:723::-;7208:13;7438:1;7429:5;:10;7425:53;;;7456:10;;;;;;;;;;;;;;;;;;;;;7425:53;7488:12;7503:5;7488:20;;7519:14;7544:78;7559:1;7551:4;:9;7544:78;;7577:8;;;;;:::i;:::-;;;;7608:2;7600:10;;;;;:::i;:::-;;;7544:78;;;7632:19;7664:6;7654:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7632:39;;7682:154;7698:1;7689:5;:10;7682:154;;7726:1;7716:11;;;;;:::i;:::-;;;7793:2;7785:5;:10;;;;:::i;:::-;7772:2;:24;;;;:::i;:::-;7759:39;;7742:6;7749;7742:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;7822:2;7813:11;;;;;:::i;:::-;;;7682:154;;;7860:6;7846:21;;;;;7152:723;;;;:::o;19228:157::-;19313:4;19352:25;19337:40;;;:11;:40;;;;19330:47;;19228:157;;;:::o;44315:555::-;44425:45;44452:4;44458:2;44462:7;44425:26;:45::i;:::-;44503:1;44487:18;;:4;:18;;;44483:187;;;44522:40;44554:7;44522:31;:40::i;:::-;44483:187;;;44592:2;44584:10;;:4;:10;;;44580:90;;44611:47;44644:4;44650:7;44611:32;:47::i;:::-;44580:90;44483:187;44698:1;44684:16;;:2;:16;;;44680:183;;;44717:45;44754:7;44717:36;:45::i;:::-;44680:183;;;44790:4;44784:10;;:2;:10;;;44780:83;;44811:40;44839:2;44843:7;44811:27;:40::i;:::-;44780:83;44680:183;44315:555;;;:::o;36942:250::-;37038:18;37044:2;37048:7;37038:5;:18::i;:::-;37075:54;37106:1;37110:2;37114:7;37123:5;37075:22;:54::i;:::-;37067:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;36942:250;;;:::o;40237:839::-;40354:4;40380:15;:2;:13;;;:15::i;:::-;40376:693;;;40432:2;40416:36;;;40453:12;:10;:12::i;:::-;40467:4;40473:7;40482:5;40416:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40412:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40679:1;40662:6;:13;:18;40658:341;;;40705:60;;;;;;;;;;:::i;:::-;;;;;;;;40658:341;40949:6;40943:13;40934:6;40930:2;40926:15;40919:38;40412:602;40549:45;;;40539:55;;;:6;:55;;;;40532:62;;;;;40376:693;41053:4;41046:11;;40237:839;;;;;;;:::o;41689:93::-;;;;:::o;45593:164::-;45697:10;:17;;;;45670:15;:24;45686:7;45670:24;;;;;;;;;;;:44;;;;45725:10;45741:7;45725:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45593:164;:::o;46384:988::-;46650:22;46700:1;46675:22;46692:4;46675:16;:22::i;:::-;:26;;;;:::i;:::-;46650:51;;46712:18;46733:17;:26;46751:7;46733:26;;;;;;;;;;;;46712:47;;46880:14;46866:10;:28;46862:328;;46911:19;46933:12;:18;46946:4;46933:18;;;;;;;;;;;;;;;:34;46952:14;46933:34;;;;;;;;;;;;46911:56;;47017:11;46984:12;:18;46997:4;46984:18;;;;;;;;;;;;;;;:30;47003:10;46984:30;;;;;;;;;;;:44;;;;47134:10;47101:17;:30;47119:11;47101:30;;;;;;;;;;;:43;;;;46896:294;46862:328;47286:17;:26;47304:7;47286:26;;;;;;;;;;;47279:33;;;47330:12;:18;47343:4;47330:18;;;;;;;;;;;;;;;:34;47349:14;47330:34;;;;;;;;;;;47323:41;;;46465:907;;46384:988;;:::o;47667:1079::-;47920:22;47965:1;47945:10;:17;;;;:21;;;;:::i;:::-;47920:46;;47977:18;47998:15;:24;48014:7;47998:24;;;;;;;;;;;;47977:45;;48349:19;48371:10;48382:14;48371:26;;;;;;;;:::i;:::-;;;;;;;;;;48349:48;;48435:11;48410:10;48421;48410:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;48546:10;48515:15;:28;48531:11;48515:28;;;;;;;;;;;:41;;;;48687:15;:24;48703:7;48687:24;;;;;;;;;;;48680:31;;;48722:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47738:1008;;;47667:1079;:::o;45171:221::-;45256:14;45273:20;45290:2;45273:16;:20::i;:::-;45256:37;;45331:7;45304:12;:16;45317:2;45304:16;;;;;;;;;;;;;;;:24;45321:6;45304:24;;;;;;;;;;;:34;;;;45378:6;45349:17;:26;45367:7;45349:26;;;;;;;;;;;:35;;;;45245:147;45171:221;;:::o;37528:382::-;37622:1;37608:16;;:2;:16;;;;37600:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37681:16;37689:7;37681;:16::i;:::-;37680:17;37672:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37743:45;37772:1;37776:2;37780:7;37743:20;:45::i;:::-;37818:1;37801:9;:13;37811:2;37801:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37849:2;37830:7;:16;37838:7;37830:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37894:7;37890:2;37869:33;;37886:1;37869:33;;;;;;;;;;;;37528:382;;:::o;9617:422::-;9677:4;9885:12;9996:7;9984:20;9976:28;;10030:1;10023:4;:8;10016:15;;;9617:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1731:143::-;1788:5;1819:6;1813:13;1804:22;;1835:33;1862:5;1835:33;:::i;:::-;1731:143;;;;:::o;1897:370::-;1968:5;2017:3;2010:4;2002:6;1998:17;1994:27;1984:122;;2025:79;;:::i;:::-;1984:122;2142:6;2129:20;2167:94;2257:3;2249:6;2242:4;2234:6;2230:17;2167:94;:::i;:::-;2158:103;;1974:293;1897:370;;;;:::o;2273:133::-;2316:5;2354:6;2341:20;2332:29;;2370:30;2394:5;2370:30;:::i;:::-;2273:133;;;;:::o;2412:137::-;2457:5;2495:6;2482:20;2473:29;;2511:32;2537:5;2511:32;:::i;:::-;2412:137;;;;:::o;2555:141::-;2611:5;2642:6;2636:13;2627:22;;2658:32;2684:5;2658:32;:::i;:::-;2555:141;;;;:::o;2715:338::-;2770:5;2819:3;2812:4;2804:6;2800:17;2796:27;2786:122;;2827:79;;:::i;:::-;2786:122;2944:6;2931:20;2969:78;3043:3;3035:6;3028:4;3020:6;3016:17;2969:78;:::i;:::-;2960:87;;2776:277;2715:338;;;;:::o;3073:340::-;3129:5;3178:3;3171:4;3163:6;3159:17;3155:27;3145:122;;3186:79;;:::i;:::-;3145:122;3303:6;3290:20;3328:79;3403:3;3395:6;3388:4;3380:6;3376:17;3328:79;:::i;:::-;3319:88;;3135:278;3073:340;;;;:::o;3419:139::-;3465:5;3503:6;3490:20;3481:29;;3519:33;3546:5;3519:33;:::i;:::-;3419:139;;;;:::o;3564:143::-;3621:5;3652:6;3646:13;3637:22;;3668:33;3695:5;3668:33;:::i;:::-;3564:143;;;;:::o;3713:329::-;3772:6;3821:2;3809:9;3800:7;3796:23;3792:32;3789:119;;;3827:79;;:::i;:::-;3789:119;3947:1;3972:53;4017:7;4008:6;3997:9;3993:22;3972:53;:::i;:::-;3962:63;;3918:117;3713:329;;;;:::o;4048:351::-;4118:6;4167:2;4155:9;4146:7;4142:23;4138:32;4135:119;;;4173:79;;:::i;:::-;4135:119;4293:1;4318:64;4374:7;4365:6;4354:9;4350:22;4318:64;:::i;:::-;4308:74;;4264:128;4048:351;;;;:::o;4405:474::-;4473:6;4481;4530:2;4518:9;4509:7;4505:23;4501:32;4498:119;;;4536:79;;:::i;:::-;4498:119;4656:1;4681:53;4726:7;4717:6;4706:9;4702:22;4681:53;:::i;:::-;4671:63;;4627:117;4783:2;4809:53;4854:7;4845:6;4834:9;4830:22;4809:53;:::i;:::-;4799:63;;4754:118;4405:474;;;;;:::o;4885:619::-;4962:6;4970;4978;5027:2;5015:9;5006:7;5002:23;4998:32;4995:119;;;5033:79;;:::i;:::-;4995:119;5153:1;5178:53;5223:7;5214:6;5203:9;5199:22;5178:53;:::i;:::-;5168:63;;5124:117;5280:2;5306:53;5351:7;5342:6;5331:9;5327:22;5306:53;:::i;:::-;5296:63;;5251:118;5408:2;5434:53;5479:7;5470:6;5459:9;5455:22;5434:53;:::i;:::-;5424:63;;5379:118;4885:619;;;;;:::o;5510:943::-;5605:6;5613;5621;5629;5678:3;5666:9;5657:7;5653:23;5649:33;5646:120;;;5685:79;;:::i;:::-;5646:120;5805:1;5830:53;5875:7;5866:6;5855:9;5851:22;5830:53;:::i;:::-;5820:63;;5776:117;5932:2;5958:53;6003:7;5994:6;5983:9;5979:22;5958:53;:::i;:::-;5948:63;;5903:118;6060:2;6086:53;6131:7;6122:6;6111:9;6107:22;6086:53;:::i;:::-;6076:63;;6031:118;6216:2;6205:9;6201:18;6188:32;6247:18;6239:6;6236:30;6233:117;;;6269:79;;:::i;:::-;6233:117;6374:62;6428:7;6419:6;6408:9;6404:22;6374:62;:::i;:::-;6364:72;;6159:287;5510:943;;;;;;;:::o;6459:468::-;6524:6;6532;6581:2;6569:9;6560:7;6556:23;6552:32;6549:119;;;6587:79;;:::i;:::-;6549:119;6707:1;6732:53;6777:7;6768:6;6757:9;6753:22;6732:53;:::i;:::-;6722:63;;6678:117;6834:2;6860:50;6902:7;6893:6;6882:9;6878:22;6860:50;:::i;:::-;6850:60;;6805:115;6459:468;;;;;:::o;6933:474::-;7001:6;7009;7058:2;7046:9;7037:7;7033:23;7029:32;7026:119;;;7064:79;;:::i;:::-;7026:119;7184:1;7209:53;7254:7;7245:6;7234:9;7230:22;7209:53;:::i;:::-;7199:63;;7155:117;7311:2;7337:53;7382:7;7373:6;7362:9;7358:22;7337:53;:::i;:::-;7327:63;;7282:118;6933:474;;;;;:::o;7413:539::-;7497:6;7546:2;7534:9;7525:7;7521:23;7517:32;7514:119;;;7552:79;;:::i;:::-;7514:119;7700:1;7689:9;7685:17;7672:31;7730:18;7722:6;7719:30;7716:117;;;7752:79;;:::i;:::-;7716:117;7857:78;7927:7;7918:6;7907:9;7903:22;7857:78;:::i;:::-;7847:88;;7643:302;7413:539;;;;:::o;7958:327::-;8016:6;8065:2;8053:9;8044:7;8040:23;8036:32;8033:119;;;8071:79;;:::i;:::-;8033:119;8191:1;8216:52;8260:7;8251:6;8240:9;8236:22;8216:52;:::i;:::-;8206:62;;8162:116;7958:327;;;;:::o;8291:349::-;8360:6;8409:2;8397:9;8388:7;8384:23;8380:32;8377:119;;;8415:79;;:::i;:::-;8377:119;8535:1;8560:63;8615:7;8606:6;8595:9;8591:22;8560:63;:::i;:::-;8550:73;;8506:127;8291:349;;;;:::o;8646:509::-;8715:6;8764:2;8752:9;8743:7;8739:23;8735:32;8732:119;;;8770:79;;:::i;:::-;8732:119;8918:1;8907:9;8903:17;8890:31;8948:18;8940:6;8937:30;8934:117;;;8970:79;;:::i;:::-;8934:117;9075:63;9130:7;9121:6;9110:9;9106:22;9075:63;:::i;:::-;9065:73;;8861:287;8646:509;;;;:::o;9161:329::-;9220:6;9269:2;9257:9;9248:7;9244:23;9240:32;9237:119;;;9275:79;;:::i;:::-;9237:119;9395:1;9420:53;9465:7;9456:6;9445:9;9441:22;9420:53;:::i;:::-;9410:63;;9366:117;9161:329;;;;:::o;9496:351::-;9566:6;9615:2;9603:9;9594:7;9590:23;9586:32;9583:119;;;9621:79;;:::i;:::-;9583:119;9741:1;9766:64;9822:7;9813:6;9802:9;9798:22;9766:64;:::i;:::-;9756:74;;9712:128;9496:351;;;;:::o;9853:118::-;9940:24;9958:5;9940:24;:::i;:::-;9935:3;9928:37;9853:118;;:::o;9977:109::-;10058:21;10073:5;10058:21;:::i;:::-;10053:3;10046:34;9977:109;;:::o;10092:360::-;10178:3;10206:38;10238:5;10206:38;:::i;:::-;10260:70;10323:6;10318:3;10260:70;:::i;:::-;10253:77;;10339:52;10384:6;10379:3;10372:4;10365:5;10361:16;10339:52;:::i;:::-;10416:29;10438:6;10416:29;:::i;:::-;10411:3;10407:39;10400:46;;10182:270;10092:360;;;;:::o;10458:364::-;10546:3;10574:39;10607:5;10574:39;:::i;:::-;10629:71;10693:6;10688:3;10629:71;:::i;:::-;10622:78;;10709:52;10754:6;10749:3;10742:4;10735:5;10731:16;10709:52;:::i;:::-;10786:29;10808:6;10786:29;:::i;:::-;10781:3;10777:39;10770:46;;10550:272;10458:364;;;;:::o;10828:377::-;10934:3;10962:39;10995:5;10962:39;:::i;:::-;11017:89;11099:6;11094:3;11017:89;:::i;:::-;11010:96;;11115:52;11160:6;11155:3;11148:4;11141:5;11137:16;11115:52;:::i;:::-;11192:6;11187:3;11183:16;11176:23;;10938:267;10828:377;;;;:::o;11211:366::-;11353:3;11374:67;11438:2;11433:3;11374:67;:::i;:::-;11367:74;;11450:93;11539:3;11450:93;:::i;:::-;11568:2;11563:3;11559:12;11552:19;;11211:366;;;:::o;11583:::-;11725:3;11746:67;11810:2;11805:3;11746:67;:::i;:::-;11739:74;;11822:93;11911:3;11822:93;:::i;:::-;11940:2;11935:3;11931:12;11924:19;;11583:366;;;:::o;11955:::-;12097:3;12118:67;12182:2;12177:3;12118:67;:::i;:::-;12111:74;;12194:93;12283:3;12194:93;:::i;:::-;12312:2;12307:3;12303:12;12296:19;;11955:366;;;:::o;12327:::-;12469:3;12490:67;12554:2;12549:3;12490:67;:::i;:::-;12483:74;;12566:93;12655:3;12566:93;:::i;:::-;12684:2;12679:3;12675:12;12668:19;;12327:366;;;:::o;12699:::-;12841:3;12862:67;12926:2;12921:3;12862:67;:::i;:::-;12855:74;;12938:93;13027:3;12938:93;:::i;:::-;13056:2;13051:3;13047:12;13040:19;;12699:366;;;:::o;13071:::-;13213:3;13234:67;13298:2;13293:3;13234:67;:::i;:::-;13227:74;;13310:93;13399:3;13310:93;:::i;:::-;13428:2;13423:3;13419:12;13412:19;;13071:366;;;:::o;13443:::-;13585:3;13606:67;13670:2;13665:3;13606:67;:::i;:::-;13599:74;;13682:93;13771:3;13682:93;:::i;:::-;13800:2;13795:3;13791:12;13784:19;;13443:366;;;:::o;13815:::-;13957:3;13978:67;14042:2;14037:3;13978:67;:::i;:::-;13971:74;;14054:93;14143:3;14054:93;:::i;:::-;14172:2;14167:3;14163:12;14156:19;;13815:366;;;:::o;14187:::-;14329:3;14350:67;14414:2;14409:3;14350:67;:::i;:::-;14343:74;;14426:93;14515:3;14426:93;:::i;:::-;14544:2;14539:3;14535:12;14528:19;;14187:366;;;:::o;14559:::-;14701:3;14722:67;14786:2;14781:3;14722:67;:::i;:::-;14715:74;;14798:93;14887:3;14798:93;:::i;:::-;14916:2;14911:3;14907:12;14900:19;;14559:366;;;:::o;14931:::-;15073:3;15094:67;15158:2;15153:3;15094:67;:::i;:::-;15087:74;;15170:93;15259:3;15170:93;:::i;:::-;15288:2;15283:3;15279:12;15272:19;;14931:366;;;:::o;15303:::-;15445:3;15466:67;15530:2;15525:3;15466:67;:::i;:::-;15459:74;;15542:93;15631:3;15542:93;:::i;:::-;15660:2;15655:3;15651:12;15644:19;;15303:366;;;:::o;15675:::-;15817:3;15838:67;15902:2;15897:3;15838:67;:::i;:::-;15831:74;;15914:93;16003:3;15914:93;:::i;:::-;16032:2;16027:3;16023:12;16016:19;;15675:366;;;:::o;16047:::-;16189:3;16210:67;16274:2;16269:3;16210:67;:::i;:::-;16203:74;;16286:93;16375:3;16286:93;:::i;:::-;16404:2;16399:3;16395:12;16388:19;;16047:366;;;:::o;16419:400::-;16579:3;16600:84;16682:1;16677:3;16600:84;:::i;:::-;16593:91;;16693:93;16782:3;16693:93;:::i;:::-;16811:1;16806:3;16802:11;16795:18;;16419:400;;;:::o;16825:366::-;16967:3;16988:67;17052:2;17047:3;16988:67;:::i;:::-;16981:74;;17064:93;17153:3;17064:93;:::i;:::-;17182:2;17177:3;17173:12;17166:19;;16825:366;;;:::o;17197:::-;17339:3;17360:67;17424:2;17419:3;17360:67;:::i;:::-;17353:74;;17436:93;17525:3;17436:93;:::i;:::-;17554:2;17549:3;17545:12;17538:19;;17197:366;;;:::o;17569:::-;17711:3;17732:67;17796:2;17791:3;17732:67;:::i;:::-;17725:74;;17808:93;17897:3;17808:93;:::i;:::-;17926:2;17921:3;17917:12;17910:19;;17569:366;;;:::o;17941:::-;18083:3;18104:67;18168:2;18163:3;18104:67;:::i;:::-;18097:74;;18180:93;18269:3;18180:93;:::i;:::-;18298:2;18293:3;18289:12;18282:19;;17941:366;;;:::o;18313:::-;18455:3;18476:67;18540:2;18535:3;18476:67;:::i;:::-;18469:74;;18552:93;18641:3;18552:93;:::i;:::-;18670:2;18665:3;18661:12;18654:19;;18313:366;;;:::o;18685:::-;18827:3;18848:67;18912:2;18907:3;18848:67;:::i;:::-;18841:74;;18924:93;19013:3;18924:93;:::i;:::-;19042:2;19037:3;19033:12;19026:19;;18685:366;;;:::o;19057:::-;19199:3;19220:67;19284:2;19279:3;19220:67;:::i;:::-;19213:74;;19296:93;19385:3;19296:93;:::i;:::-;19414:2;19409:3;19405:12;19398:19;;19057:366;;;:::o;19429:::-;19571:3;19592:67;19656:2;19651:3;19592:67;:::i;:::-;19585:74;;19668:93;19757:3;19668:93;:::i;:::-;19786:2;19781:3;19777:12;19770:19;;19429:366;;;:::o;19801:::-;19943:3;19964:67;20028:2;20023:3;19964:67;:::i;:::-;19957:74;;20040:93;20129:3;20040:93;:::i;:::-;20158:2;20153:3;20149:12;20142:19;;19801:366;;;:::o;20173:::-;20315:3;20336:67;20400:2;20395:3;20336:67;:::i;:::-;20329:74;;20412:93;20501:3;20412:93;:::i;:::-;20530:2;20525:3;20521:12;20514:19;;20173:366;;;:::o;20545:118::-;20632:24;20650:5;20632:24;:::i;:::-;20627:3;20620:37;20545:118;;:::o;20669:701::-;20950:3;20972:95;21063:3;21054:6;20972:95;:::i;:::-;20965:102;;21084:95;21175:3;21166:6;21084:95;:::i;:::-;21077:102;;21196:148;21340:3;21196:148;:::i;:::-;21189:155;;21361:3;21354:10;;20669:701;;;;;:::o;21376:222::-;21469:4;21507:2;21496:9;21492:18;21484:26;;21520:71;21588:1;21577:9;21573:17;21564:6;21520:71;:::i;:::-;21376:222;;;;:::o;21604:640::-;21799:4;21837:3;21826:9;21822:19;21814:27;;21851:71;21919:1;21908:9;21904:17;21895:6;21851:71;:::i;:::-;21932:72;22000:2;21989:9;21985:18;21976:6;21932:72;:::i;:::-;22014;22082:2;22071:9;22067:18;22058:6;22014:72;:::i;:::-;22133:9;22127:4;22123:20;22118:2;22107:9;22103:18;22096:48;22161:76;22232:4;22223:6;22161:76;:::i;:::-;22153:84;;21604:640;;;;;;;:::o;22250:332::-;22371:4;22409:2;22398:9;22394:18;22386:26;;22422:71;22490:1;22479:9;22475:17;22466:6;22422:71;:::i;:::-;22503:72;22571:2;22560:9;22556:18;22547:6;22503:72;:::i;:::-;22250:332;;;;;:::o;22588:210::-;22675:4;22713:2;22702:9;22698:18;22690:26;;22726:65;22788:1;22777:9;22773:17;22764:6;22726:65;:::i;:::-;22588:210;;;;:::o;22804:313::-;22917:4;22955:2;22944:9;22940:18;22932:26;;23004:9;22998:4;22994:20;22990:1;22979:9;22975:17;22968:47;23032:78;23105:4;23096:6;23032:78;:::i;:::-;23024:86;;22804:313;;;;:::o;23123:419::-;23289:4;23327:2;23316:9;23312:18;23304:26;;23376:9;23370:4;23366:20;23362:1;23351:9;23347:17;23340:47;23404:131;23530:4;23404:131;:::i;:::-;23396:139;;23123:419;;;:::o;23548:::-;23714:4;23752:2;23741:9;23737:18;23729:26;;23801:9;23795:4;23791:20;23787:1;23776:9;23772:17;23765:47;23829:131;23955:4;23829:131;:::i;:::-;23821:139;;23548:419;;;:::o;23973:::-;24139:4;24177:2;24166:9;24162:18;24154:26;;24226:9;24220:4;24216:20;24212:1;24201:9;24197:17;24190:47;24254:131;24380:4;24254:131;:::i;:::-;24246:139;;23973:419;;;:::o;24398:::-;24564:4;24602:2;24591:9;24587:18;24579:26;;24651:9;24645:4;24641:20;24637:1;24626:9;24622:17;24615:47;24679:131;24805:4;24679:131;:::i;:::-;24671:139;;24398:419;;;:::o;24823:::-;24989:4;25027:2;25016:9;25012:18;25004:26;;25076:9;25070:4;25066:20;25062:1;25051:9;25047:17;25040:47;25104:131;25230:4;25104:131;:::i;:::-;25096:139;;24823:419;;;:::o;25248:::-;25414:4;25452:2;25441:9;25437:18;25429:26;;25501:9;25495:4;25491:20;25487:1;25476:9;25472:17;25465:47;25529:131;25655:4;25529:131;:::i;:::-;25521:139;;25248:419;;;:::o;25673:::-;25839:4;25877:2;25866:9;25862:18;25854:26;;25926:9;25920:4;25916:20;25912:1;25901:9;25897:17;25890:47;25954:131;26080:4;25954:131;:::i;:::-;25946:139;;25673:419;;;:::o;26098:::-;26264:4;26302:2;26291:9;26287:18;26279:26;;26351:9;26345:4;26341:20;26337:1;26326:9;26322:17;26315:47;26379:131;26505:4;26379:131;:::i;:::-;26371:139;;26098:419;;;:::o;26523:::-;26689:4;26727:2;26716:9;26712:18;26704:26;;26776:9;26770:4;26766:20;26762:1;26751:9;26747:17;26740:47;26804:131;26930:4;26804:131;:::i;:::-;26796:139;;26523:419;;;:::o;26948:::-;27114:4;27152:2;27141:9;27137:18;27129:26;;27201:9;27195:4;27191:20;27187:1;27176:9;27172:17;27165:47;27229:131;27355:4;27229:131;:::i;:::-;27221:139;;26948:419;;;:::o;27373:::-;27539:4;27577:2;27566:9;27562:18;27554:26;;27626:9;27620:4;27616:20;27612:1;27601:9;27597:17;27590:47;27654:131;27780:4;27654:131;:::i;:::-;27646:139;;27373:419;;;:::o;27798:::-;27964:4;28002:2;27991:9;27987:18;27979:26;;28051:9;28045:4;28041:20;28037:1;28026:9;28022:17;28015:47;28079:131;28205:4;28079:131;:::i;:::-;28071:139;;27798:419;;;:::o;28223:::-;28389:4;28427:2;28416:9;28412:18;28404:26;;28476:9;28470:4;28466:20;28462:1;28451:9;28447:17;28440:47;28504:131;28630:4;28504:131;:::i;:::-;28496:139;;28223:419;;;:::o;28648:::-;28814:4;28852:2;28841:9;28837:18;28829:26;;28901:9;28895:4;28891:20;28887:1;28876:9;28872:17;28865:47;28929:131;29055:4;28929:131;:::i;:::-;28921:139;;28648:419;;;:::o;29073:::-;29239:4;29277:2;29266:9;29262:18;29254:26;;29326:9;29320:4;29316:20;29312:1;29301:9;29297:17;29290:47;29354:131;29480:4;29354:131;:::i;:::-;29346:139;;29073:419;;;:::o;29498:::-;29664:4;29702:2;29691:9;29687:18;29679:26;;29751:9;29745:4;29741:20;29737:1;29726:9;29722:17;29715:47;29779:131;29905:4;29779:131;:::i;:::-;29771:139;;29498:419;;;:::o;29923:::-;30089:4;30127:2;30116:9;30112:18;30104:26;;30176:9;30170:4;30166:20;30162:1;30151:9;30147:17;30140:47;30204:131;30330:4;30204:131;:::i;:::-;30196:139;;29923:419;;;:::o;30348:::-;30514:4;30552:2;30541:9;30537:18;30529:26;;30601:9;30595:4;30591:20;30587:1;30576:9;30572:17;30565:47;30629:131;30755:4;30629:131;:::i;:::-;30621:139;;30348:419;;;:::o;30773:::-;30939:4;30977:2;30966:9;30962:18;30954:26;;31026:9;31020:4;31016:20;31012:1;31001:9;30997:17;30990:47;31054:131;31180:4;31054:131;:::i;:::-;31046:139;;30773:419;;;:::o;31198:::-;31364:4;31402:2;31391:9;31387:18;31379:26;;31451:9;31445:4;31441:20;31437:1;31426:9;31422:17;31415:47;31479:131;31605:4;31479:131;:::i;:::-;31471:139;;31198:419;;;:::o;31623:::-;31789:4;31827:2;31816:9;31812:18;31804:26;;31876:9;31870:4;31866:20;31862:1;31851:9;31847:17;31840:47;31904:131;32030:4;31904:131;:::i;:::-;31896:139;;31623:419;;;:::o;32048:::-;32214:4;32252:2;32241:9;32237:18;32229:26;;32301:9;32295:4;32291:20;32287:1;32276:9;32272:17;32265:47;32329:131;32455:4;32329:131;:::i;:::-;32321:139;;32048:419;;;:::o;32473:::-;32639:4;32677:2;32666:9;32662:18;32654:26;;32726:9;32720:4;32716:20;32712:1;32701:9;32697:17;32690:47;32754:131;32880:4;32754:131;:::i;:::-;32746:139;;32473:419;;;:::o;32898:::-;33064:4;33102:2;33091:9;33087:18;33079:26;;33151:9;33145:4;33141:20;33137:1;33126:9;33122:17;33115:47;33179:131;33305:4;33179:131;:::i;:::-;33171:139;;32898:419;;;:::o;33323:222::-;33416:4;33454:2;33443:9;33439:18;33431:26;;33467:71;33535:1;33524:9;33520:17;33511:6;33467:71;:::i;:::-;33323:222;;;;:::o;33551:129::-;33585:6;33612:20;;:::i;:::-;33602:30;;33641:33;33669:4;33661:6;33641:33;:::i;:::-;33551:129;;;:::o;33686:75::-;33719:6;33752:2;33746:9;33736:19;;33686:75;:::o;33767:311::-;33844:4;33934:18;33926:6;33923:30;33920:56;;;33956:18;;:::i;:::-;33920:56;34006:4;33998:6;33994:17;33986:25;;34066:4;34060;34056:15;34048:23;;33767:311;;;:::o;34084:307::-;34145:4;34235:18;34227:6;34224:30;34221:56;;;34257:18;;:::i;:::-;34221:56;34295:29;34317:6;34295:29;:::i;:::-;34287:37;;34379:4;34373;34369:15;34361:23;;34084:307;;;:::o;34397:308::-;34459:4;34549:18;34541:6;34538:30;34535:56;;;34571:18;;:::i;:::-;34535:56;34609:29;34631:6;34609:29;:::i;:::-;34601:37;;34693:4;34687;34683:15;34675:23;;34397:308;;;:::o;34711:98::-;34762:6;34796:5;34790:12;34780:22;;34711:98;;;:::o;34815:99::-;34867:6;34901:5;34895:12;34885:22;;34815:99;;;:::o;34920:168::-;35003:11;35037:6;35032:3;35025:19;35077:4;35072:3;35068:14;35053:29;;34920:168;;;;:::o;35094:169::-;35178:11;35212:6;35207:3;35200:19;35252:4;35247:3;35243:14;35228:29;;35094:169;;;;:::o;35269:148::-;35371:11;35408:3;35393:18;;35269:148;;;;:::o;35423:305::-;35463:3;35482:20;35500:1;35482:20;:::i;:::-;35477:25;;35516:20;35534:1;35516:20;:::i;:::-;35511:25;;35670:1;35602:66;35598:74;35595:1;35592:81;35589:107;;;35676:18;;:::i;:::-;35589:107;35720:1;35717;35713:9;35706:16;;35423:305;;;;:::o;35734:185::-;35774:1;35791:20;35809:1;35791:20;:::i;:::-;35786:25;;35825:20;35843:1;35825:20;:::i;:::-;35820:25;;35864:1;35854:35;;35869:18;;:::i;:::-;35854:35;35911:1;35908;35904:9;35899:14;;35734:185;;;;:::o;35925:191::-;35965:4;35985:20;36003:1;35985:20;:::i;:::-;35980:25;;36019:20;36037:1;36019:20;:::i;:::-;36014:25;;36058:1;36055;36052:8;36049:34;;;36063:18;;:::i;:::-;36049:34;36108:1;36105;36101:9;36093:17;;35925:191;;;;:::o;36122:96::-;36159:7;36188:24;36206:5;36188:24;:::i;:::-;36177:35;;36122:96;;;:::o;36224:90::-;36258:7;36301:5;36294:13;36287:21;36276:32;;36224:90;;;:::o;36320:149::-;36356:7;36396:66;36389:5;36385:78;36374:89;;36320:149;;;:::o;36475:126::-;36512:7;36552:42;36545:5;36541:54;36530:65;;36475:126;;;:::o;36607:77::-;36644:7;36673:5;36662:16;;36607:77;;;:::o;36690:154::-;36774:6;36769:3;36764;36751:30;36836:1;36827:6;36822:3;36818:16;36811:27;36690:154;;;:::o;36850:307::-;36918:1;36928:113;36942:6;36939:1;36936:13;36928:113;;;37027:1;37022:3;37018:11;37012:18;37008:1;37003:3;36999:11;36992:39;36964:2;36961:1;36957:10;36952:15;;36928:113;;;37059:6;37056:1;37053:13;37050:101;;;37139:1;37130:6;37125:3;37121:16;37114:27;37050:101;36899:258;36850:307;;;:::o;37163:171::-;37202:3;37225:24;37243:5;37225:24;:::i;:::-;37216:33;;37271:4;37264:5;37261:15;37258:41;;;37279:18;;:::i;:::-;37258:41;37326:1;37319:5;37315:13;37308:20;;37163:171;;;:::o;37340:320::-;37384:6;37421:1;37415:4;37411:12;37401:22;;37468:1;37462:4;37458:12;37489:18;37479:81;;37545:4;37537:6;37533:17;37523:27;;37479:81;37607:2;37599:6;37596:14;37576:18;37573:38;37570:84;;;37626:18;;:::i;:::-;37570:84;37391:269;37340:320;;;:::o;37666:281::-;37749:27;37771:4;37749:27;:::i;:::-;37741:6;37737:40;37879:6;37867:10;37864:22;37843:18;37831:10;37828:34;37825:62;37822:88;;;37890:18;;:::i;:::-;37822:88;37930:10;37926:2;37919:22;37709:238;37666:281;;:::o;37953:233::-;37992:3;38015:24;38033:5;38015:24;:::i;:::-;38006:33;;38061:66;38054:5;38051:77;38048:103;;;38131:18;;:::i;:::-;38048:103;38178:1;38171:5;38167:13;38160:20;;37953:233;;;:::o;38192:176::-;38224:1;38241:20;38259:1;38241:20;:::i;:::-;38236:25;;38275:20;38293:1;38275:20;:::i;:::-;38270:25;;38314:1;38304:35;;38319:18;;:::i;:::-;38304:35;38360:1;38357;38353:9;38348:14;;38192:176;;;;:::o;38374:180::-;38422:77;38419:1;38412:88;38519:4;38516:1;38509:15;38543:4;38540:1;38533:15;38560:180;38608:77;38605:1;38598:88;38705:4;38702:1;38695:15;38729:4;38726:1;38719:15;38746:180;38794:77;38791:1;38784:88;38891:4;38888:1;38881:15;38915:4;38912:1;38905:15;38932:180;38980:77;38977:1;38970:88;39077:4;39074:1;39067:15;39101:4;39098:1;39091:15;39118:180;39166:77;39163:1;39156:88;39263:4;39260:1;39253:15;39287:4;39284:1;39277:15;39304:180;39352:77;39349:1;39342:88;39449:4;39446:1;39439:15;39473:4;39470:1;39463:15;39490:117;39599:1;39596;39589:12;39613:117;39722:1;39719;39712:12;39736:117;39845:1;39842;39835:12;39859:117;39968:1;39965;39958:12;39982:117;40091:1;40088;40081:12;40105:102;40146:6;40197:2;40193:7;40188:2;40181:5;40177:14;40173:28;40163:38;;40105:102;;;:::o;40213:221::-;40353:34;40349:1;40341:6;40337:14;40330:58;40422:4;40417:2;40409:6;40405:15;40398:29;40213:221;:::o;40440:230::-;40580:34;40576:1;40568:6;40564:14;40557:58;40649:13;40644:2;40636:6;40632:15;40625:38;40440:230;:::o;40676:237::-;40816:34;40812:1;40804:6;40800:14;40793:58;40885:20;40880:2;40872:6;40868:15;40861:45;40676:237;:::o;40919:225::-;41059:34;41055:1;41047:6;41043:14;41036:58;41128:8;41123:2;41115:6;41111:15;41104:33;40919:225;:::o;41150:178::-;41290:30;41286:1;41278:6;41274:14;41267:54;41150:178;:::o;41334:223::-;41474:34;41470:1;41462:6;41458:14;41451:58;41543:6;41538:2;41530:6;41526:15;41519:31;41334:223;:::o;41563:175::-;41703:27;41699:1;41691:6;41687:14;41680:51;41563:175;:::o;41744:231::-;41884:34;41880:1;41872:6;41868:14;41861:58;41953:14;41948:2;41940:6;41936:15;41929:39;41744:231;:::o;41981:243::-;42121:34;42117:1;42109:6;42105:14;42098:58;42190:26;42185:2;42177:6;42173:15;42166:51;41981:243;:::o;42230:229::-;42370:34;42366:1;42358:6;42354:14;42347:58;42439:12;42434:2;42426:6;42422:15;42415:37;42230:229;:::o;42465:228::-;42605:34;42601:1;42593:6;42589:14;42582:58;42674:11;42669:2;42661:6;42657:15;42650:36;42465:228;:::o;42699:180::-;42839:32;42835:1;42827:6;42823:14;42816:56;42699:180;:::o;42885:182::-;43025:34;43021:1;43013:6;43009:14;43002:58;42885:182;:::o;43073:231::-;43213:34;43209:1;43201:6;43197:14;43190:58;43282:14;43277:2;43269:6;43265:15;43258:39;43073:231;:::o;43310:155::-;43450:7;43446:1;43438:6;43434:14;43427:31;43310:155;:::o;43471:182::-;43611:34;43607:1;43599:6;43595:14;43588:58;43471:182;:::o;43659:228::-;43799:34;43795:1;43787:6;43783:14;43776:58;43868:11;43863:2;43855:6;43851:15;43844:36;43659:228;:::o;43893:234::-;44033:34;44029:1;44021:6;44017:14;44010:58;44102:17;44097:2;44089:6;44085:15;44078:42;43893:234;:::o;44133:229::-;44273:34;44269:1;44261:6;44257:14;44250:58;44342:12;44337:2;44329:6;44325:15;44318:37;44133:229;:::o;44368:220::-;44508:34;44504:1;44496:6;44492:14;44485:58;44577:3;44572:2;44564:6;44560:15;44553:28;44368:220;:::o;44594:236::-;44734:34;44730:1;44722:6;44718:14;44711:58;44803:19;44798:2;44790:6;44786:15;44779:44;44594:236;:::o;44836:231::-;44976:34;44972:1;44964:6;44960:14;44953:58;45045:14;45040:2;45032:6;45028:15;45021:39;44836:231;:::o;45073:223::-;45213:34;45209:1;45201:6;45197:14;45190:58;45282:6;45277:2;45269:6;45265:15;45258:31;45073:223;:::o;45302:232::-;45442:34;45438:1;45430:6;45426:14;45419:58;45511:15;45506:2;45498:6;45494:15;45487:40;45302:232;:::o;45540:168::-;45680:20;45676:1;45668:6;45664:14;45657:44;45540:168;:::o;45714:122::-;45787:24;45805:5;45787:24;:::i;:::-;45780:5;45777:35;45767:63;;45826:1;45823;45816:12;45767:63;45714:122;:::o;45842:116::-;45912:21;45927:5;45912:21;:::i;:::-;45905:5;45902:32;45892:60;;45948:1;45945;45938:12;45892:60;45842:116;:::o;45964:120::-;46036:23;46053:5;46036:23;:::i;:::-;46029:5;46026:34;46016:62;;46074:1;46071;46064:12;46016:62;45964:120;:::o;46090:122::-;46163:24;46181:5;46163:24;:::i;:::-;46156:5;46153:35;46143:63;;46202:1;46199;46192:12;46143:63;46090:122;:::o
Swarm Source
ipfs://ab688a11cb216047f1311a53030c7109b0aea15c14728c890bf6dd7663561136
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.