Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
571 KM
Holders
248
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 KMLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
KingMakers
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-05 */ // SPDX-License-Identifier: MIT // GO TO LINE 1904 TO SEE WHERE THE KINGMAKER CONTRACT STARTS // File: @openzeppelin/contracts/utils/Context.sol pragma solidity >=0.6.0 <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 GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/introspection/IERC165.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/IERC721Metadata.sol pragma solidity >=0.6.2 <0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/IERC721Enumerable.sol pragma solidity >=0.6.2 <0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity >=0.6.0 <0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/introspection/ERC165.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ abstract contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor() internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ 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) { 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) { 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) { // 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) { 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) { 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) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @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) { require(b <= a, "SafeMath: subtraction overflow"); 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) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @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. 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) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); 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) { require(b > 0, "SafeMath: modulo by zero"); 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) { 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. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * 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) { 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) { require(b > 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: value}( data ); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/EnumerableSet.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require( set._values.length > index, "EnumerableSet: index out of bounds" ); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File: @openzeppelin/contracts/utils/EnumerableMap.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Library for managing an enumerable variant of Solidity's * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] * type. * * Maps have the following properties: * * - Entries are added, removed, and checked for existence in constant time * (O(1)). * - Entries are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableMap for EnumerableMap.UintToAddressMap; * * // Declare a set state variable * EnumerableMap.UintToAddressMap private myMap; * } * ``` * * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are * supported. */ library EnumerableMap { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Map type with // bytes32 keys and values. // The Map implementation uses private functions, and user-facing // implementations (such as Uint256ToAddressMap) are just wrappers around // the underlying Map. // This means that we can only create new EnumerableMaps for types that fit // in bytes32. struct MapEntry { bytes32 _key; bytes32 _value; } struct Map { // Storage of map keys and values MapEntry[] _entries; // Position of the entry defined by a key in the `entries` array, plus 1 // because index 0 means a key is not in the map. mapping(bytes32 => uint256) _indexes; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function _set( Map storage map, bytes32 key, bytes32 value ) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) { // Equivalent to !contains(map, key) map._entries.push(MapEntry({_key: key, _value: value})); // The entry is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value map._indexes[key] = map._entries.length; return true; } else { map._entries[keyIndex - 1]._value = value; return false; } } /** * @dev Removes a key-value pair from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function _remove(Map storage map, bytes32 key) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex != 0) { // Equivalent to contains(map, key) // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one // in the array, and then remove the last entry (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = keyIndex - 1; uint256 lastIndex = map._entries.length - 1; // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. MapEntry storage lastEntry = map._entries[lastIndex]; // Move the last entry to the index where the entry to delete is map._entries[toDeleteIndex] = lastEntry; // Update the index for the moved entry map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved entry was stored map._entries.pop(); // Delete the index for the deleted slot delete map._indexes[key]; return true; } else { return false; } } /** * @dev Returns true if the key is in the map. O(1). */ function _contains(Map storage map, bytes32 key) private view returns (bool) { return map._indexes[key] != 0; } /** * @dev Returns the number of key-value pairs in the map. O(1). */ function _length(Map storage map) private view returns (uint256) { return map._entries.length; } /** * @dev Returns the key-value pair stored at position `index` in the map. O(1). * * Note that there are no guarantees on the ordering of entries inside the * array, and it may change when more entries are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) { require( map._entries.length > index, "EnumerableMap: index out of bounds" ); MapEntry storage entry = map._entries[index]; return (entry._key, entry._value); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. */ function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) { uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key) return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function _get(Map storage map, bytes32 key) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } /** * @dev Same as {_get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {_tryGet}. */ function _get( Map storage map, bytes32 key, string memory errorMessage ) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } // UintToAddressMap struct UintToAddressMap { Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set( UintToAddressMap storage map, uint256 key, address value ) internal returns (bool) { return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) { return _remove(map._inner, bytes32(key)); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) { return _contains(map._inner, bytes32(key)); } /** * @dev Returns the number of elements in the map. O(1). */ function length(UintToAddressMap storage map) internal view returns (uint256) { return _length(map._inner); } /** * @dev Returns the element stored at position `index` in the set. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) { (bytes32 key, bytes32 value) = _at(map._inner, index); return (uint256(key), address(uint160(uint256(value)))); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. * * _Available since v3.4._ */ function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) { (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key)); return (success, address(uint160(uint256(value)))); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(UintToAddressMap storage map, uint256 key) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key))))); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryGet}. */ function get( UintToAddressMap storage map, uint256 key, string memory errorMessage ) internal view returns (address) { return address( uint160(uint256(_get(map._inner, bytes32(key), errorMessage))) ); } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev String operations. */ library Strings { /** * @dev Converts a `uint256` to its ASCII `string` 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); uint256 index = digits - 1; temp = value; while (temp != 0) { buffer[index--] = bytes1(uint8(48 + (temp % 10))); temp /= 10; } return string(buffer); } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity >=0.6.0 <0.8.0; /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using SafeMath for uint256; using Address for address; using EnumerableSet for EnumerableSet.UintSet; using EnumerableMap for EnumerableMap.UintToAddressMap; using Strings for uint256; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from holder address to their (enumerable) set of owned tokens mapping(address => EnumerableSet.UintSet) private _holderTokens; // Enumerable mapping from token ids to their owners EnumerableMap.UintToAddressMap private _tokenOwners; // 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; // Token name string private _name; // Token symbol string private _symbol; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; // Base URI string private _baseURI; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) public { _name = name_; _symbol = symbol_; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); _registerInterface(_INTERFACE_ID_ERC721_METADATA); _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } /** * @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 _holderTokens[owner].length(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return _tokenOwners.get( tokenId, "ERC721: owner query for nonexistent token" ); } /** * @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 _tokenURI = _tokenURIs[tokenId]; string memory base = baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(base, tokenId.toString())); } /** * @dev Returns the base URI set via {_setBaseURI}. This will be * automatically added as a prefix in {tokenURI} to each token's URI, or * to the token ID if no specific URI is set for that token ID. */ function baseURI() public view virtual returns (string memory) { return _baseURI; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { return _holderTokens[owner].at(index); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds return _tokenOwners.length(); } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { (uint256 tokenId, ) = _tokenOwners.at(index); return tokenId; } /** * @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 || ERC721.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 _tokenOwners.contains(tokenId); } /** * @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 || ERC721.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: d* * - `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); _holderTokens[to].add(tokenId); _tokenOwners.set(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); // internal owner _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } _holderTokens[owner].remove(tokenId); _tokenOwners.remove(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" ); // internal owner require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _holderTokens[from].remove(tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(from, to, tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require( _exists(tokenId), "ERC721Metadata: URI set of nonexistent token" ); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Internal function to set the base URI for all token IDs. It is * automatically added as a prefix to the value returned in {tokenURI}, * or to the token ID if {tokenURI} is empty. */ function _setBaseURI(string memory baseURI_) internal virtual { _baseURI = baseURI_; } /** * @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()) { return true; } bytes memory returndata = to.functionCall( abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data ), "ERC721: transfer to non ERC721Receiver implementer" ); bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); // internal owner } /** * @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 {} } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity >=0.6.0 <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() internal { 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; } } // King Makers creator: // @deadLuchador // Special thanks to the BoringBananaCo and their community, go check out thier website (https://boringbananas.co) pragma solidity ^0.7.0; pragma abicoder v2; contract KingMakers is ERC721, Ownable { using SafeMath for uint256; string public KING_MAKERS_PROVENANCE = ""; // IPFS URL WILL BE ADDED WHEN ALL KING MAKERS ARE ALL SOLD OUT string public LICENSE_TEXT = ""; // IT IS WHAT IT SAYS bool licenseLocked = false; // TEAM CAN'T EDIT THE LICENSE AFTER THIS GETS TRUE uint256 public KING_MAKER_PRICE = 25000000000000000; // 0.025 ETH uint256 public constant MIN_SELL_TARGET_FOR_BOUNTY_1 = 500; uint256 public constant MIN_SELL_TARGET_FOR_BOUNTY_2 = 1000; uint256 public constant MIN_SELL_TARGET_FOR_BOUNTY_3 = 2000; uint256 public constant MIN_SELL_TARGET_FOR_BOUNTY_4 = 4000; uint256 public constant MIN_SELL_TARGET_FOR_BOUNTY_5 = 6000; uint256 public constant MIN_SELL_TARGET_FOR_BOUNTY_6 = 8000; // EXCALIBUR_BOUNTY is only active after MIN_SELL_TARGET_FOR_BOUNTY is reached in sales uint256 public constant EXCALIBUR_BOUNTY_1 = 1000000000000000000; // 1.0 ETH uint256 public constant EXCALIBUR_BOUNTY_2 = 2000000000000000000; // 2.0 ETH uint256 public constant EXCALIBUR_BOUNTY_3 = 3000000000000000000; // 3.0 ETH uint256 public constant EXCALIBUR_BOUNTY_4 = 4000000000000000000; // 4.0 ETH uint256 public constant EXCALIBUR_BOUNTY_5 = 5000000000000000000; // 5.0 ETH uint256 public constant EXCALIBUR_BOUNTY_6 = 6000000000000000000; // 6.0 ETH uint256 public constant MAX_KINGMAKER_PURCHASE = 10; uint256 public constant MAX_KINGMAKERS = 10000; uint256 public constant FREE_MINT_KINGMAKERS = 1; // Reserve 125 KingMakers for team - Giveaways/Prizes etc uint256 public KING_MAKERS_RESERVE = 250; bool public hasExcaliburBeenMinted = false; // TEAM CAN'T EDIT THIS ONCE IT IS SET TO TRUE bool public isSaleActive = true; event kingMakerMinted(address ethAddress, uint256 tokenId); event excaliburMinted(address ethAddress); event licenseisLocked(string _licenseText); constructor() ERC721("KingMakers", "KM") {} function withdraw() public onlyOwner { uint256 balance = address(this).balance; msg.sender.transfer(balance); } function reserveKingMakers(address _to, uint256 _reserveAmount) public onlyOwner { uint256 mintIndex = totalSupply().add(1); require( _reserveAmount > 0 && _reserveAmount <= KING_MAKERS_RESERVE, "Not enough reserve left for team" ); for (uint256 i = 0; i < _reserveAmount; i++) { _safeMint(_to, mintIndex + i); emit kingMakerMinted(_to, mintIndex + i); } KING_MAKERS_RESERVE = KING_MAKERS_RESERVE.sub(_reserveAmount); } function setProvenanceHash(string memory provenanceHash) public onlyOwner { KING_MAKERS_PROVENANCE = provenanceHash; } function setKingMakerPrice(uint256 price) public onlyOwner { KING_MAKER_PRICE = price.mul(1000000000000000); } function setBaseURI(string memory baseURI) public onlyOwner { _setBaseURI(baseURI); } function flipSaleState() public onlyOwner { isSaleActive = !isSaleActive; } function tokensOfOwner(address _owner) external view returns (uint256[] memory) { uint256 tokenCount = balanceOf(_owner); if (tokenCount == 0) { // Return an empty array return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); uint256 index; for (index = 0; index < tokenCount; index++) { result[index] = tokenOfOwnerByIndex(_owner, index); } return result; } } // Returns the license for tokens function tokenLicense(uint256 _id) public view returns (string memory) { require(_id < totalSupply(), "CHOOSE A KINGMAKER WITHIN RANGE"); return LICENSE_TEXT; } // Locks the license to prevent further changes function lockLicense() public onlyOwner { licenseLocked = true; emit licenseisLocked(LICENSE_TEXT); } // Change the license function changeLicense(string memory _license) public onlyOwner { require(licenseLocked == false, "License already locked"); LICENSE_TEXT = _license; } function mintKingMaker(uint256 numberOfTokens) public payable { require(isSaleActive, "Sale must be active to mint KingMaker"); if (totalSupply() < FREE_MINT_KINGMAKERS) { require( numberOfTokens > 0 && numberOfTokens == 1, "Can only mint 1 tokens at a time" ); } if (totalSupply() >= FREE_MINT_KINGMAKERS) { require( numberOfTokens > 0 && numberOfTokens <= MAX_KINGMAKER_PURCHASE, "Can only mint 10 tokens at a time" ); } if (totalSupply() >= FREE_MINT_KINGMAKERS) { require( msg.value >= KING_MAKER_PRICE.mul(numberOfTokens), "Ether value sent is not correct" ); } require( totalSupply().add(numberOfTokens) <= MAX_KINGMAKERS.sub(1), "Purchase would exceed max supply of KingMakers" ); for (uint256 i = 0; i < numberOfTokens; i++) { uint256 mintIndex = totalSupply().add(1); if (totalSupply() < MAX_KINGMAKERS) { _safeMint(msg.sender, mintIndex); emit kingMakerMinted(msg.sender, mintIndex); } } } function mintExcalibur(address payable _to) public payable onlyOwner { require( !hasExcaliburBeenMinted, "Excalibur must not have already been minted" ); if (totalSupply() < MIN_SELL_TARGET_FOR_BOUNTY_1) { _safeMint(_to, 0); hasExcaliburBeenMinted = true; emit excaliburMinted(_to); } if ( totalSupply() >= MIN_SELL_TARGET_FOR_BOUNTY_1 && totalSupply() < MIN_SELL_TARGET_FOR_BOUNTY_2 ) { require( msg.value == EXCALIBUR_BOUNTY_1, "Ether value must be 1 ETH" ); _safeMint(_to, 0); hasExcaliburBeenMinted = true; emit excaliburMinted(_to); _to.transfer(EXCALIBUR_BOUNTY_1); } if ( totalSupply() >= MIN_SELL_TARGET_FOR_BOUNTY_2 && totalSupply() < MIN_SELL_TARGET_FOR_BOUNTY_3 ) { require( msg.value == EXCALIBUR_BOUNTY_2, "Ether value must be 2 ETH" ); _safeMint(_to, 0); hasExcaliburBeenMinted = true; emit excaliburMinted(_to); _to.transfer(EXCALIBUR_BOUNTY_2); } if ( totalSupply() >= MIN_SELL_TARGET_FOR_BOUNTY_3 && totalSupply() < MIN_SELL_TARGET_FOR_BOUNTY_4 ) { require( msg.value == EXCALIBUR_BOUNTY_3, "Ether value must be 3 ETH" ); _safeMint(_to, 0); hasExcaliburBeenMinted = true; emit excaliburMinted(_to); _to.transfer(EXCALIBUR_BOUNTY_3); } if ( totalSupply() >= MIN_SELL_TARGET_FOR_BOUNTY_4 && totalSupply() < MIN_SELL_TARGET_FOR_BOUNTY_5 ) { require( msg.value == EXCALIBUR_BOUNTY_4, "Ether value must be 4 ETH" ); _safeMint(_to, 0); hasExcaliburBeenMinted = true; emit excaliburMinted(_to); _to.transfer(EXCALIBUR_BOUNTY_4); } if ( totalSupply() >= MIN_SELL_TARGET_FOR_BOUNTY_5 && totalSupply() < MIN_SELL_TARGET_FOR_BOUNTY_6 ) { require( msg.value == EXCALIBUR_BOUNTY_5, "Ether value must be 5 ETH" ); _safeMint(_to, 0); hasExcaliburBeenMinted = true; emit excaliburMinted(_to); _to.transfer(EXCALIBUR_BOUNTY_5); } if (totalSupply() >= MIN_SELL_TARGET_FOR_BOUNTY_6) { require( msg.value >= EXCALIBUR_BOUNTY_6, "Ether value must be 6 ETH or more" ); _safeMint(_to, 0); hasExcaliburBeenMinted = true; emit excaliburMinted(_to); _to.transfer(EXCALIBUR_BOUNTY_6); } } }
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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"ethAddress","type":"address"}],"name":"excaliburMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"ethAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"kingMakerMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_licenseText","type":"string"}],"name":"licenseisLocked","type":"event"},{"inputs":[],"name":"EXCALIBUR_BOUNTY_1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXCALIBUR_BOUNTY_2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXCALIBUR_BOUNTY_3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXCALIBUR_BOUNTY_4","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXCALIBUR_BOUNTY_5","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXCALIBUR_BOUNTY_6","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FREE_MINT_KINGMAKERS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KING_MAKERS_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KING_MAKERS_RESERVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KING_MAKER_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LICENSE_TEXT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_KINGMAKERS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_KINGMAKER_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_SELL_TARGET_FOR_BOUNTY_1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_SELL_TARGET_FOR_BOUNTY_2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_SELL_TARGET_FOR_BOUNTY_3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_SELL_TARGET_FOR_BOUNTY_4","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_SELL_TARGET_FOR_BOUNTY_5","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_SELL_TARGET_FOR_BOUNTY_6","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_license","type":"string"}],"name":"changeLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasExcaliburBeenMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"isSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"}],"name":"mintExcalibur","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintKingMaker","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reserveKingMakers","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":"uint256","name":"price","type":"uint256"}],"name":"setKingMakerPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","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":"uint256","name":"_id","type":"uint256"}],"name":"tokenLicense","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180602001604052806000815250600b90805190602001906200002b9291906200035a565b5060405180602001604052806000815250600c9080519060200190620000539291906200035a565b506000600d60006101000a81548160ff0219169083151502179055506658d15e17628000600e5560fa600f556000601060006101000a81548160ff0219169083151502179055506001601060016101000a81548160ff021916908315150217905550348015620000c257600080fd5b506040518060400160405280600a81526020017f4b696e674d616b657273000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f4b4d000000000000000000000000000000000000000000000000000000000000815250620001476301ffc9a760e01b6200027a60201b60201c565b81600690805190602001906200015f9291906200035a565b508060079080519060200190620001789291906200035a565b50620001916380ac58cd60e01b6200027a60201b60201c565b620001a9635b5e139f60e01b6200027a60201b60201c565b620001c163780e9d6360e01b6200027a60201b60201c565b50506000620001d56200035260201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35062000485565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620002e6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002dd9062000452565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620003925760008555620003de565b82601f10620003ad57805160ff1916838001178555620003de565b82800160010185558215620003de579182015b82811115620003dd578251825591602001919060010190620003c0565b5b509050620003ed9190620003f1565b5090565b5b808211156200040c576000816000905550600101620003f2565b5090565b60006200041f601c8362000474565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b600060208201905081810360008301526200046d8162000410565b9050919050565b600082825260208201905092915050565b615b1180620004956000396000f3fe60806040526004361061031a5760003560e01c80638da5cb5b116101ab578063bd538b87116100f7578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b14610b8c578063f831227d14610bb5578063fc5d6b0014610be0578063fcceaab414610c0b5761031a565b8063e985e9c514610afb578063ea04b42414610b38578063ed44835614610b615761031a565b8063d22c1486116100d1578063d22c148614610a3f578063d30802ac14610a6a578063d9b137b214610a93578063de99ac8914610ad05761031a565b8063bd538b87146109c0578063bf4702fc146109eb578063c87b56dd14610a025761031a565b8063a15648b111610164578063b7b026151161013e578063b7b0261514610916578063b7f91dad14610941578063b88d4fde1461096c578063ba7a1f04146109955761031a565b8063a15648b1146108a8578063a22cb465146108c4578063b09904b5146108ed5761031a565b80638da5cb5b146107a65780638e5b6a48146107d157806395d89b41146107fc57806399d4be69146108275780639a7b0e7d146108525780639c3e72bd1461087d5761031a565b806334918dfd1161026a5780636352211e11610223578063715018a6116101fd578063715018a61461070b57806379db40231461072257806383d721a71461074d5780638462151c146107695761031a565b80636352211e146106665780636c0360eb146106a357806370a08231146106ce5761031a565b806334918dfd1461057e5780633ccfd60b1461059557806342842e0e146105ac5780634f6ccce7146105d557806355f804b314610612578063564566a81461063b5761031a565b806319aac80d116102d7578063282c07c9116102b1578063282c07c9146104c05780632baee3b8146104eb5780632f745c5914610516578063304e99dc146105535761031a565b806319aac80d1461044157806323b872dd1461046c57806325dbf9a5146104955761031a565b806301ffc9a71461031f57806306fdde031461035c578063081812fc14610387578063095ea7b3146103c457806310969523146103ed57806318160ddd14610416575b600080fd5b34801561032b57600080fd5b506103466004803603810190610341919061425d565b610c36565b60405161035391906152b5565b60405180910390f35b34801561036857600080fd5b50610371610c9d565b60405161037e91906152d0565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a991906142f0565b610d3f565b6040516103bb91906151bf565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e69190614221565b610dc4565b005b3480156103f957600080fd5b50610414600480360381019061040f91906142af565b610edc565b005b34801561042257600080fd5b5061042b610f72565b60405161043891906157b4565b60405180910390f35b34801561044d57600080fd5b50610456610f83565b60405161046391906157b4565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e919061411b565b610f89565b005b3480156104a157600080fd5b506104aa610fe9565b6040516104b791906157b4565b60405180910390f35b3480156104cc57600080fd5b506104d5610fef565b6040516104e291906157b4565b60405180910390f35b3480156104f757600080fd5b50610500610ffb565b60405161050d91906152b5565b60405180910390f35b34801561052257600080fd5b5061053d60048036038101906105389190614221565b61100e565b60405161054a91906157b4565b60405180910390f35b34801561055f57600080fd5b50610568611069565b60405161057591906157b4565b60405180910390f35b34801561058a57600080fd5b5061059361106f565b005b3480156105a157600080fd5b506105aa611117565b005b3480156105b857600080fd5b506105d360048036038101906105ce919061411b565b6111e2565b005b3480156105e157600080fd5b506105fc60048036038101906105f791906142f0565b611202565b60405161060991906157b4565b60405180910390f35b34801561061e57600080fd5b50610639600480360381019061063491906142af565b611225565b005b34801561064757600080fd5b506106506112ad565b60405161065d91906152b5565b60405180910390f35b34801561067257600080fd5b5061068d600480360381019061068891906142f0565b6112c0565b60405161069a91906151bf565b60405180910390f35b3480156106af57600080fd5b506106b86112f7565b6040516106c591906152d0565b60405180910390f35b3480156106da57600080fd5b506106f560048036038101906106f0919061408d565b611399565b60405161070291906157b4565b60405180910390f35b34801561071757600080fd5b50610720611458565b005b34801561072e57600080fd5b50610737611595565b60405161074491906157b4565b60405180910390f35b610767600480360381019061076291906142f0565b61159b565b005b34801561077557600080fd5b50610790600480360381019061078b919061408d565b611813565b60405161079d9190615293565b60405180910390f35b3480156107b257600080fd5b506107bb61190c565b6040516107c891906151bf565b60405180910390f35b3480156107dd57600080fd5b506107e6611936565b6040516107f391906157b4565b60405180910390f35b34801561080857600080fd5b5061081161193b565b60405161081e91906152d0565b60405180910390f35b34801561083357600080fd5b5061083c6119dd565b60405161084991906157b4565b60405180910390f35b34801561085e57600080fd5b506108676119e3565b60405161087491906157b4565b60405180910390f35b34801561088957600080fd5b506108926119ef565b60405161089f91906152d0565b60405180910390f35b6108c260048036038101906108bd91906140b6565b611a8d565b005b3480156108d057600080fd5b506108eb60048036038101906108e691906141e5565b612264565b005b3480156108f957600080fd5b50610914600480360381019061090f91906142af565b6123e5565b005b34801561092257600080fd5b5061092b6124d1565b60405161093891906157b4565b60405180910390f35b34801561094d57600080fd5b506109566124d7565b60405161096391906157b4565b60405180910390f35b34801561097857600080fd5b50610993600480360381019061098e919061416a565b6124dc565b005b3480156109a157600080fd5b506109aa61253e565b6040516109b791906157b4565b60405180910390f35b3480156109cc57600080fd5b506109d561254a565b6040516109e291906152d0565b60405180910390f35b3480156109f757600080fd5b50610a006125e8565b005b348015610a0e57600080fd5b50610a296004803603810190610a2491906142f0565b6126b9565b604051610a3691906152d0565b60405180910390f35b348015610a4b57600080fd5b50610a5461283c565b604051610a6191906157b4565b60405180910390f35b348015610a7657600080fd5b50610a916004803603810190610a8c9190614221565b612848565b005b348015610a9f57600080fd5b50610aba6004803603810190610ab591906142f0565b6129b4565b604051610ac791906152d0565b60405180910390f35b348015610adc57600080fd5b50610ae5612aa1565b604051610af291906157b4565b60405180910390f35b348015610b0757600080fd5b50610b226004803603810190610b1d91906140df565b612aa7565b604051610b2f91906152b5565b60405180910390f35b348015610b4457600080fd5b50610b5f6004803603810190610b5a91906142f0565b612b3b565b005b348015610b6d57600080fd5b50610b76612bda565b604051610b8391906157b4565b60405180910390f35b348015610b9857600080fd5b50610bb36004803603810190610bae919061408d565b612be0565b005b348015610bc157600080fd5b50610bca612d8c565b604051610bd791906157b4565b60405180910390f35b348015610bec57600080fd5b50610bf5612d98565b604051610c0291906157b4565b60405180910390f35b348015610c1757600080fd5b50610c20612da4565b604051610c2d91906157b4565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d355780601f10610d0a57610100808354040283529160200191610d35565b820191906000526020600020905b815481529060010190602001808311610d1857829003601f168201915b5050505050905090565b6000610d4a82612daa565b610d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8090615634565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610dcf826112c0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e37906156b4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e5f612dc7565b73ffffffffffffffffffffffffffffffffffffffff161480610e8e5750610e8d81610e88612dc7565b612aa7565b5b610ecd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec490615594565b60405180910390fd5b610ed78383612dcf565b505050565b610ee4612dc7565b73ffffffffffffffffffffffffffffffffffffffff16610f0261190c565b73ffffffffffffffffffffffffffffffffffffffff1614610f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4f90615654565b60405180910390fd5b80600b9080519060200190610f6e929190613e94565b5050565b6000610f7e6002612e88565b905090565b6103e881565b610f9a610f94612dc7565b82612e9d565b610fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd090615714565b60405180910390fd5b610fe4838383612f7b565b505050565b61177081565b674563918244f4000081565b601060009054906101000a900460ff1681565b600061106182600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061319290919063ffffffff16565b905092915050565b61271081565b611077612dc7565b73ffffffffffffffffffffffffffffffffffffffff1661109561190c565b73ffffffffffffffffffffffffffffffffffffffff16146110eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e290615654565b60405180910390fd5b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b61111f612dc7565b73ffffffffffffffffffffffffffffffffffffffff1661113d61190c565b73ffffffffffffffffffffffffffffffffffffffff1614611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a90615654565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156111de573d6000803e3d6000fd5b5050565b6111fd838383604051806020016040528060008152506124dc565b505050565b6000806112198360026131ac90919063ffffffff16565b50905080915050919050565b61122d612dc7565b73ffffffffffffffffffffffffffffffffffffffff1661124b61190c565b73ffffffffffffffffffffffffffffffffffffffff16146112a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129890615654565b60405180910390fd5b6112aa816131d8565b50565b601060019054906101000a900460ff1681565b60006112f082604051806060016040528060298152602001615ab36029913960026131f29092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561138f5780601f106113645761010080835404028352916020019161138f565b820191906000526020600020905b81548152906001019060200180831161137257829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561140a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611401906155b4565b60405180910390fd5b611451600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613211565b9050919050565b611460612dc7565b73ffffffffffffffffffffffffffffffffffffffff1661147e61190c565b73ffffffffffffffffffffffffffffffffffffffff16146114d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cb90615654565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6101f481565b601060019054906101000a900460ff166115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e190615414565b60405180910390fd5b60016115f4610f72565b101561164a5760008111801561160a5750600181145b611649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164090615554565b60405180910390fd5b5b6001611654610f72565b106116aa5760008111801561166a5750600a8111155b6116a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a090615794565b60405180910390fd5b5b60016116b4610f72565b10611711576116ce81600e5461322690919063ffffffff16565b341015611710576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170790615494565b60405180910390fd5b5b611727600161271061329690919063ffffffff16565b61174182611733610f72565b6132e690919063ffffffff16565b1115611782576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611779906153f4565b60405180910390fd5b60005b8181101561180f5760006117aa600161179c610f72565b6132e690919063ffffffff16565b90506127106117b7610f72565b1015611801576117c7338261333b565b7f82835ea25ccfef5e19aa13fadaec2a0f2e1fbbcd0d09dbca27b70624b09b113233826040516117f8929190615241565b60405180910390a15b508080600101915050611785565b5050565b6060600061182083611399565b9050600081141561187b57600067ffffffffffffffff8111801561184357600080fd5b506040519080825280602002602001820160405280156118725781602001602082028036833780820191505090505b50915050611907565b60008167ffffffffffffffff8111801561189457600080fd5b506040519080825280602002602001820160405280156118c35781602001602082028036833780820191505090505b50905060005b82811015611900576118db858261100e565b8282815181106118e757fe5b60200260200101818152505080806001019150506118c9565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a81565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119d35780601f106119a8576101008083540402835291602001916119d3565b820191906000526020600020905b8154815290600101906020018083116119b657829003601f168201915b5050505050905090565b610fa081565b670de0b6b3a764000081565b600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a855780601f10611a5a57610100808354040283529160200191611a85565b820191906000526020600020905b815481529060010190602001808311611a6857829003601f168201915b505050505081565b611a95612dc7565b73ffffffffffffffffffffffffffffffffffffffff16611ab361190c565b73ffffffffffffffffffffffffffffffffffffffff1614611b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0090615654565b60405180910390fd5b601060009054906101000a900460ff1615611b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5090615574565b60405180910390fd5b6101f4611b64610f72565b1015611bc857611b7581600061333b565b6001601060006101000a81548160ff0219169083151502179055507fb4a21726ec29ac7853cdc5a2e951b23991d9c4b3c079fb95ffe3b873575030fb81604051611bbf91906151da565b60405180910390a15b6101f4611bd3610f72565b10158015611be957506103e8611be7610f72565b105b15611ce557670de0b6b3a76400003414611c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2f906154d4565b60405180910390fd5b611c4381600061333b565b6001601060006101000a81548160ff0219169083151502179055507fb4a21726ec29ac7853cdc5a2e951b23991d9c4b3c079fb95ffe3b873575030fb81604051611c8d91906151da565b60405180910390a18073ffffffffffffffffffffffffffffffffffffffff166108fc670de0b6b3a76400009081150290604051600060405180830381858888f19350505050158015611ce3573d6000803e3d6000fd5b505b6103e8611cf0610f72565b10158015611d0657506107d0611d04610f72565b105b15611e0257671bc16d674ec800003414611d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4c906156d4565b60405180910390fd5b611d6081600061333b565b6001601060006101000a81548160ff0219169083151502179055507fb4a21726ec29ac7853cdc5a2e951b23991d9c4b3c079fb95ffe3b873575030fb81604051611daa91906151da565b60405180910390a18073ffffffffffffffffffffffffffffffffffffffff166108fc671bc16d674ec800009081150290604051600060405180830381858888f19350505050158015611e00573d6000803e3d6000fd5b505b6107d0611e0d610f72565b10158015611e235750610fa0611e21610f72565b105b15611f1f576729a2241af62c00003414611e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e69906153b4565b60405180910390fd5b611e7d81600061333b565b6001601060006101000a81548160ff0219169083151502179055507fb4a21726ec29ac7853cdc5a2e951b23991d9c4b3c079fb95ffe3b873575030fb81604051611ec791906151da565b60405180910390a18073ffffffffffffffffffffffffffffffffffffffff166108fc6729a2241af62c00009081150290604051600060405180830381858888f19350505050158015611f1d573d6000803e3d6000fd5b505b610fa0611f2a610f72565b10158015611f405750611770611f3e610f72565b105b1561203c57673782dace9d9000003414611f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8690615754565b60405180910390fd5b611f9a81600061333b565b6001601060006101000a81548160ff0219169083151502179055507fb4a21726ec29ac7853cdc5a2e951b23991d9c4b3c079fb95ffe3b873575030fb81604051611fe491906151da565b60405180910390a18073ffffffffffffffffffffffffffffffffffffffff166108fc673782dace9d9000009081150290604051600060405180830381858888f1935050505015801561203a573d6000803e3d6000fd5b505b611770612047610f72565b1015801561205d5750611f4061205b610f72565b105b1561215957674563918244f4000034146120ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a390615774565b60405180910390fd5b6120b781600061333b565b6001601060006101000a81548160ff0219169083151502179055507fb4a21726ec29ac7853cdc5a2e951b23991d9c4b3c079fb95ffe3b873575030fb8160405161210191906151da565b60405180910390a18073ffffffffffffffffffffffffffffffffffffffff166108fc674563918244f400009081150290604051600060405180830381858888f19350505050158015612157573d6000803e3d6000fd5b505b611f40612164610f72565b10612261576753444835ec5800003410156121b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ab90615514565b60405180910390fd5b6121bf81600061333b565b6001601060006101000a81548160ff0219169083151502179055507fb4a21726ec29ac7853cdc5a2e951b23991d9c4b3c079fb95ffe3b873575030fb8160405161220991906151da565b60405180910390a18073ffffffffffffffffffffffffffffffffffffffff166108fc6753444835ec5800009081150290604051600060405180830381858888f1935050505015801561225f573d6000803e3d6000fd5b505b50565b61226c612dc7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d190615474565b60405180910390fd5b80600560006122e7612dc7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612394612dc7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123d991906152b5565b60405180910390a35050565b6123ed612dc7565b73ffffffffffffffffffffffffffffffffffffffff1661240b61190c565b73ffffffffffffffffffffffffffffffffffffffff1614612461576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245890615654565b60405180910390fd5b60001515600d60009054906101000a900460ff161515146124b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ae906156f4565b60405180910390fd5b80600c90805190602001906124cd929190613e94565b5050565b6107d081565b600181565b6124ed6124e7612dc7565b83612e9d565b61252c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252390615714565b60405180910390fd5b61253884848484613359565b50505050565b6753444835ec58000081565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125e05780601f106125b5576101008083540402835291602001916125e0565b820191906000526020600020905b8154815290600101906020018083116125c357829003601f168201915b505050505081565b6125f0612dc7565b73ffffffffffffffffffffffffffffffffffffffff1661260e61190c565b73ffffffffffffffffffffffffffffffffffffffff1614612664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265b90615654565b60405180910390fd5b6001600d60006101000a81548160ff0219169083151502179055507f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b0600c6040516126af91906152f2565b60405180910390a1565b60606126c482612daa565b612703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fa90615694565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156127ac5780601f10612781576101008083540402835291602001916127ac565b820191906000526020600020905b81548152906001019060200180831161278f57829003601f168201915b5050505050905060006127bd6112f7565b90506000815114156127d3578192505050612837565b6000825111156128085780826040516020016127f092919061519b565b60405160208183030381529060405292505050612837565b80612812856133b5565b60405160200161282392919061519b565b604051602081830303815290604052925050505b919050565b671bc16d674ec8000081565b612850612dc7565b73ffffffffffffffffffffffffffffffffffffffff1661286e61190c565b73ffffffffffffffffffffffffffffffffffffffff16146128c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128bb90615654565b60405180910390fd5b60006128e160016128d3610f72565b6132e690919063ffffffff16565b90506000821180156128f55750600f548211155b612934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292b90615434565b60405180910390fd5b60005b828110156129935761294b8482840161333b565b7f82835ea25ccfef5e19aa13fadaec2a0f2e1fbbcd0d09dbca27b70624b09b11328482840160405161297e92919061526a565b60405180910390a18080600101915050612937565b506129a982600f5461329690919063ffffffff16565b600f81905550505050565b60606129be610f72565b82106129ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f690615334565b60405180910390fd5b600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612a955780601f10612a6a57610100808354040283529160200191612a95565b820191906000526020600020905b815481529060010190602001808311612a7857829003601f168201915b50505050509050919050565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612b43612dc7565b73ffffffffffffffffffffffffffffffffffffffff16612b6161190c565b73ffffffffffffffffffffffffffffffffffffffff1614612bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bae90615654565b60405180910390fd5b612bd166038d7ea4c680008261322690919063ffffffff16565b600e8190555050565b611f4081565b612be8612dc7565b73ffffffffffffffffffffffffffffffffffffffff16612c0661190c565b73ffffffffffffffffffffffffffffffffffffffff1614612c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5390615654565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc390615374565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6729a2241af62c000081565b673782dace9d90000081565b600e5481565b6000612dc08260026134fc90919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612e42836112c0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612e9682600001613516565b9050919050565b6000612ea882612daa565b612ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ede90615534565b60405180910390fd5b6000612ef2836112c0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612f6157508373ffffffffffffffffffffffffffffffffffffffff16612f4984610d3f565b73ffffffffffffffffffffffffffffffffffffffff16145b80612f725750612f718185612aa7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612f9b826112c0565b73ffffffffffffffffffffffffffffffffffffffff1614612ff1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe890615674565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305890615454565b60405180910390fd5b61306c838383613527565b613077600082612dcf565b6130c881600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061352c90919063ffffffff16565b5061311a81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061354690919063ffffffff16565b50613131818360026135609092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006131a18360000183613595565b60001c905092915050565b6000806000806131bf8660000186613602565b915091508160001c8160001c9350935050509250929050565b80600990805190602001906131ee929190613e94565b5050565b6000613205846000018460001b84613685565b60001c90509392505050565b600061321f82600001613716565b9050919050565b6000808314156132395760009050613290565b600082840290508284828161324a57fe5b041461328b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328290615614565b60405180910390fd5b809150505b92915050565b6000828211156132db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132d2906154b4565b60405180910390fd5b818303905092915050565b600080828401905083811015613331576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613328906153d4565b60405180910390fd5b8091505092915050565b613355828260405180602001604052806000815250613727565b5050565b613364848484612f7b565b61337084848484613782565b6133af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a690615354565b60405180910390fd5b50505050565b606060008214156133fd576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506134f7565b600082905060005b60008214613427578080600101915050600a828161341f57fe5b049150613405565b60008167ffffffffffffffff8111801561344057600080fd5b506040519080825280601f01601f1916602001820160405280156134735781602001600182028036833780820191505090505b50905060006001830390508593505b600084146134ef57600a848161349457fe5b0660300160f81b828280600190039350815181106134ae57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84816134e757fe5b049350613482565b819450505050505b919050565b600061350e836000018360001b6138e6565b905092915050565b600081600001805490509050919050565b505050565b600061353e836000018360001b613909565b905092915050565b6000613558836000018360001b6139f1565b905092915050565b600061358c846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613a61565b90509392505050565b6000818360000180549050116135e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135d790615314565b60405180910390fd5b8260000182815481106135ef57fe5b9060005260206000200154905092915050565b6000808284600001805490501161364e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613645906155d4565b60405180910390fd5b600084600001848154811061365f57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600080846001016000858152602001908152602001600020549050600081141583906136e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136de91906152d0565b60405180910390fd5b508460000160018203815481106136fa57fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6137318383613b3d565b61373e6000848484613782565b61377d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377490615354565b60405180910390fd5b505050565b60006137a38473ffffffffffffffffffffffffffffffffffffffff16613ccb565b6137b057600190506138de565b600061387763150b7a0260e01b6137c5612dc7565b8887876040516024016137db94939291906151f5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615a81603291398773ffffffffffffffffffffffffffffffffffffffff16613cde9092919063ffffffff16565b905060008180602001905181019061388f9190614286565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146139e5576000600182039050600060018660000180549050039050600086600001828154811061395457fe5b906000526020600020015490508087600001848154811061397157fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806139a957fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506139eb565b60009150505b92915050565b60006139fd8383613cf6565b613a56578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613a5b565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415613b0857846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613b36565b82856000016001830381548110613b1b57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ba4906155f4565b60405180910390fd5b613bb681612daa565b15613bf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bed90615394565b60405180910390fd5b613c0260008383613527565b613c5381600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061354690919063ffffffff16565b50613c6a818360026135609092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6060613ced8484600085613d19565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b606082471015613d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d55906154f4565b60405180910390fd5b613d6785613ccb565b613da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d9d90615734565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613dcf9190615184565b60006040518083038185875af1925050503d8060008114613e0c576040519150601f19603f3d011682016040523d82523d6000602084013e613e11565b606091505b5091509150613e21828286613e2d565b92505050949350505050565b60608315613e3d57829050613e8d565b600083511115613e505782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e8491906152d0565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282613eca5760008555613f11565b82601f10613ee357805160ff1916838001178555613f11565b82800160010185558215613f11579182015b82811115613f10578251825591602001919060010190613ef5565b5b509050613f1e9190613f22565b5090565b5b80821115613f3b576000816000905550600101613f23565b5090565b6000613f52613f4d84615800565b6157cf565b905082815260208101848484011115613f6a57600080fd5b613f758482856159b8565b509392505050565b6000613f90613f8b84615830565b6157cf565b905082815260208101848484011115613fa857600080fd5b613fb38482856159b8565b509392505050565b600081359050613fca81615a0d565b92915050565b600081359050613fdf81615a24565b92915050565b600081359050613ff481615a3b565b92915050565b60008135905061400981615a52565b92915050565b60008151905061401e81615a52565b92915050565b600082601f83011261403557600080fd5b8135614045848260208601613f3f565b91505092915050565b600082601f83011261405f57600080fd5b813561406f848260208601613f7d565b91505092915050565b60008135905061408781615a69565b92915050565b60006020828403121561409f57600080fd5b60006140ad84828501613fbb565b91505092915050565b6000602082840312156140c857600080fd5b60006140d684828501613fd0565b91505092915050565b600080604083850312156140f257600080fd5b600061410085828601613fbb565b925050602061411185828601613fbb565b9150509250929050565b60008060006060848603121561413057600080fd5b600061413e86828701613fbb565b935050602061414f86828701613fbb565b925050604061416086828701614078565b9150509250925092565b6000806000806080858703121561418057600080fd5b600061418e87828801613fbb565b945050602061419f87828801613fbb565b93505060406141b087828801614078565b925050606085013567ffffffffffffffff8111156141cd57600080fd5b6141d987828801614024565b91505092959194509250565b600080604083850312156141f857600080fd5b600061420685828601613fbb565b925050602061421785828601613fe5565b9150509250929050565b6000806040838503121561423457600080fd5b600061424285828601613fbb565b925050602061425385828601614078565b9150509250929050565b60006020828403121561426f57600080fd5b600061427d84828501613ffa565b91505092915050565b60006020828403121561429857600080fd5b60006142a68482850161400f565b91505092915050565b6000602082840312156142c157600080fd5b600082013567ffffffffffffffff8111156142db57600080fd5b6142e78482850161404e565b91505092915050565b60006020828403121561430257600080fd5b600061431084828501614078565b91505092915050565b60006143258383615166565b60208301905092915050565b61433a81615982565b82525050565b6143498161590e565b82525050565b614358816158fc565b82525050565b600061436982615885565b61437381856158b3565b935061437e83615860565b8060005b838110156143af5781516143968882614319565b97506143a1836158a6565b925050600181019050614382565b5085935050505092915050565b6143c581615920565b82525050565b60006143d682615890565b6143e081856158c4565b93506143f08185602086016159c7565b6143f9816159fc565b840191505092915050565b600061440f82615890565b61441981856158d5565b93506144298185602086016159c7565b80840191505092915050565b60006144408261589b565b61444a81856158e0565b935061445a8185602086016159c7565b614463816159fc565b840191505092915050565b60006144798261589b565b61448381856158f1565b93506144938185602086016159c7565b80840191505092915050565b6000815460018116600081146144bc57600181146144e257614526565b607f60028304166144cd81876158e0565b955060ff198316865260208601935050614526565b600282046144f081876158e0565b95506144fb85615870565b60005b8281101561451d578154818901526001820191506020810190506144fe565b80880195505050505b505092915050565b600061453b6022836158e0565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145a1601f836158e0565b91507f43484f4f53452041204b494e474d414b45522057495448494e2052414e4745006000830152602082019050919050565b60006145e16032836158e0565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006146476026836158e0565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ad601c836158e0565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006146ed6019836158e0565b91507f45746865722076616c7565206d757374206265203320455448000000000000006000830152602082019050919050565b600061472d601b836158e0565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b600061476d602e836158e0565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f66204b696e674d616b6572730000000000000000000000000000000000006020830152604082019050919050565b60006147d36025836158e0565b91507f53616c65206d7573742062652061637469766520746f206d696e74204b696e6760008301527f4d616b65720000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006148396020836158e0565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d6000830152602082019050919050565b60006148796024836158e0565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006148df6019836158e0565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061491f601f836158e0565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b600061495f601e836158e0565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b600061499f6019836158e0565b91507f45746865722076616c7565206d757374206265203120455448000000000000006000830152602082019050919050565b60006149df6026836158e0565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a456021836158e0565b91507f45746865722076616c7565206d757374206265203620455448206f72206d6f7260008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614aab602c836158e0565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614b116020836158e0565b91507f43616e206f6e6c79206d696e74203120746f6b656e7320617420612074696d656000830152602082019050919050565b6000614b51602b836158e0565b91507f457863616c69627572206d757374206e6f74206861766520616c72656164792060008301527f6265656e206d696e7465640000000000000000000000000000000000000000006020830152604082019050919050565b6000614bb76038836158e0565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614c1d602a836158e0565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c836022836158e0565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ce96020836158e0565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614d296021836158e0565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d8f602c836158e0565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614df56020836158e0565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614e356029836158e0565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614e9b602f836158e0565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614f016021836158e0565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614f676019836158e0565b91507f45746865722076616c7565206d757374206265203220455448000000000000006000830152602082019050919050565b6000614fa76016836158e0565b91507f4c6963656e736520616c7265616479206c6f636b6564000000000000000000006000830152602082019050919050565b6000614fe76031836158e0565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061504d601d836158e0565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b600061508d6019836158e0565b91507f45746865722076616c7565206d757374206265203420455448000000000000006000830152602082019050919050565b60006150cd6019836158e0565b91507f45746865722076616c7565206d757374206265203520455448000000000000006000830152602082019050919050565b600061510d6021836158e0565b91507f43616e206f6e6c79206d696e7420313020746f6b656e7320617420612074696d60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b61516f81615978565b82525050565b61517e81615978565b82525050565b60006151908284614404565b915081905092915050565b60006151a7828561446e565b91506151b3828461446e565b91508190509392505050565b60006020820190506151d4600083018461434f565b92915050565b60006020820190506151ef6000830184614331565b92915050565b600060808201905061520a6000830187614340565b615217602083018661434f565b6152246040830185615175565b818103606083015261523681846143cb565b905095945050505050565b60006040820190506152566000830185614331565b6152636020830184615175565b9392505050565b600060408201905061527f600083018561434f565b61528c6020830184615175565b9392505050565b600060208201905081810360008301526152ad818461435e565b905092915050565b60006020820190506152ca60008301846143bc565b92915050565b600060208201905081810360008301526152ea8184614435565b905092915050565b6000602082019050818103600083015261530c818461449f565b905092915050565b6000602082019050818103600083015261532d8161452e565b9050919050565b6000602082019050818103600083015261534d81614594565b9050919050565b6000602082019050818103600083015261536d816145d4565b9050919050565b6000602082019050818103600083015261538d8161463a565b9050919050565b600060208201905081810360008301526153ad816146a0565b9050919050565b600060208201905081810360008301526153cd816146e0565b9050919050565b600060208201905081810360008301526153ed81614720565b9050919050565b6000602082019050818103600083015261540d81614760565b9050919050565b6000602082019050818103600083015261542d816147c6565b9050919050565b6000602082019050818103600083015261544d8161482c565b9050919050565b6000602082019050818103600083015261546d8161486c565b9050919050565b6000602082019050818103600083015261548d816148d2565b9050919050565b600060208201905081810360008301526154ad81614912565b9050919050565b600060208201905081810360008301526154cd81614952565b9050919050565b600060208201905081810360008301526154ed81614992565b9050919050565b6000602082019050818103600083015261550d816149d2565b9050919050565b6000602082019050818103600083015261552d81614a38565b9050919050565b6000602082019050818103600083015261554d81614a9e565b9050919050565b6000602082019050818103600083015261556d81614b04565b9050919050565b6000602082019050818103600083015261558d81614b44565b9050919050565b600060208201905081810360008301526155ad81614baa565b9050919050565b600060208201905081810360008301526155cd81614c10565b9050919050565b600060208201905081810360008301526155ed81614c76565b9050919050565b6000602082019050818103600083015261560d81614cdc565b9050919050565b6000602082019050818103600083015261562d81614d1c565b9050919050565b6000602082019050818103600083015261564d81614d82565b9050919050565b6000602082019050818103600083015261566d81614de8565b9050919050565b6000602082019050818103600083015261568d81614e28565b9050919050565b600060208201905081810360008301526156ad81614e8e565b9050919050565b600060208201905081810360008301526156cd81614ef4565b9050919050565b600060208201905081810360008301526156ed81614f5a565b9050919050565b6000602082019050818103600083015261570d81614f9a565b9050919050565b6000602082019050818103600083015261572d81614fda565b9050919050565b6000602082019050818103600083015261574d81615040565b9050919050565b6000602082019050818103600083015261576d81615080565b9050919050565b6000602082019050818103600083015261578d816150c0565b9050919050565b600060208201905081810360008301526157ad81615100565b9050919050565b60006020820190506157c96000830184615175565b92915050565b6000604051905081810181811067ffffffffffffffff821117156157f6576157f56159fa565b5b8060405250919050565b600067ffffffffffffffff82111561581b5761581a6159fa565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561584b5761584a6159fa565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061590782615958565b9050919050565b600061591982615958565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061598d82615994565b9050919050565b600061599f826159a6565b9050919050565b60006159b182615958565b9050919050565b82818337600083830152505050565b60005b838110156159e55780820151818401526020810190506159ca565b838111156159f4576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b615a16816158fc565b8114615a2157600080fd5b50565b615a2d8161590e565b8114615a3857600080fd5b50565b615a4481615920565b8114615a4f57600080fd5b50565b615a5b8161592c565b8114615a6657600080fd5b50565b615a7281615978565b8114615a7d57600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea26469706673582212206d11cd4bd6bc4d6103d7014c1e613e31d5b92e7ce822223e82278cf0b260f20164736f6c63430007060033
Deployed Bytecode
0x60806040526004361061031a5760003560e01c80638da5cb5b116101ab578063bd538b87116100f7578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b14610b8c578063f831227d14610bb5578063fc5d6b0014610be0578063fcceaab414610c0b5761031a565b8063e985e9c514610afb578063ea04b42414610b38578063ed44835614610b615761031a565b8063d22c1486116100d1578063d22c148614610a3f578063d30802ac14610a6a578063d9b137b214610a93578063de99ac8914610ad05761031a565b8063bd538b87146109c0578063bf4702fc146109eb578063c87b56dd14610a025761031a565b8063a15648b111610164578063b7b026151161013e578063b7b0261514610916578063b7f91dad14610941578063b88d4fde1461096c578063ba7a1f04146109955761031a565b8063a15648b1146108a8578063a22cb465146108c4578063b09904b5146108ed5761031a565b80638da5cb5b146107a65780638e5b6a48146107d157806395d89b41146107fc57806399d4be69146108275780639a7b0e7d146108525780639c3e72bd1461087d5761031a565b806334918dfd1161026a5780636352211e11610223578063715018a6116101fd578063715018a61461070b57806379db40231461072257806383d721a71461074d5780638462151c146107695761031a565b80636352211e146106665780636c0360eb146106a357806370a08231146106ce5761031a565b806334918dfd1461057e5780633ccfd60b1461059557806342842e0e146105ac5780634f6ccce7146105d557806355f804b314610612578063564566a81461063b5761031a565b806319aac80d116102d7578063282c07c9116102b1578063282c07c9146104c05780632baee3b8146104eb5780632f745c5914610516578063304e99dc146105535761031a565b806319aac80d1461044157806323b872dd1461046c57806325dbf9a5146104955761031a565b806301ffc9a71461031f57806306fdde031461035c578063081812fc14610387578063095ea7b3146103c457806310969523146103ed57806318160ddd14610416575b600080fd5b34801561032b57600080fd5b506103466004803603810190610341919061425d565b610c36565b60405161035391906152b5565b60405180910390f35b34801561036857600080fd5b50610371610c9d565b60405161037e91906152d0565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a991906142f0565b610d3f565b6040516103bb91906151bf565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e69190614221565b610dc4565b005b3480156103f957600080fd5b50610414600480360381019061040f91906142af565b610edc565b005b34801561042257600080fd5b5061042b610f72565b60405161043891906157b4565b60405180910390f35b34801561044d57600080fd5b50610456610f83565b60405161046391906157b4565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e919061411b565b610f89565b005b3480156104a157600080fd5b506104aa610fe9565b6040516104b791906157b4565b60405180910390f35b3480156104cc57600080fd5b506104d5610fef565b6040516104e291906157b4565b60405180910390f35b3480156104f757600080fd5b50610500610ffb565b60405161050d91906152b5565b60405180910390f35b34801561052257600080fd5b5061053d60048036038101906105389190614221565b61100e565b60405161054a91906157b4565b60405180910390f35b34801561055f57600080fd5b50610568611069565b60405161057591906157b4565b60405180910390f35b34801561058a57600080fd5b5061059361106f565b005b3480156105a157600080fd5b506105aa611117565b005b3480156105b857600080fd5b506105d360048036038101906105ce919061411b565b6111e2565b005b3480156105e157600080fd5b506105fc60048036038101906105f791906142f0565b611202565b60405161060991906157b4565b60405180910390f35b34801561061e57600080fd5b50610639600480360381019061063491906142af565b611225565b005b34801561064757600080fd5b506106506112ad565b60405161065d91906152b5565b60405180910390f35b34801561067257600080fd5b5061068d600480360381019061068891906142f0565b6112c0565b60405161069a91906151bf565b60405180910390f35b3480156106af57600080fd5b506106b86112f7565b6040516106c591906152d0565b60405180910390f35b3480156106da57600080fd5b506106f560048036038101906106f0919061408d565b611399565b60405161070291906157b4565b60405180910390f35b34801561071757600080fd5b50610720611458565b005b34801561072e57600080fd5b50610737611595565b60405161074491906157b4565b60405180910390f35b610767600480360381019061076291906142f0565b61159b565b005b34801561077557600080fd5b50610790600480360381019061078b919061408d565b611813565b60405161079d9190615293565b60405180910390f35b3480156107b257600080fd5b506107bb61190c565b6040516107c891906151bf565b60405180910390f35b3480156107dd57600080fd5b506107e6611936565b6040516107f391906157b4565b60405180910390f35b34801561080857600080fd5b5061081161193b565b60405161081e91906152d0565b60405180910390f35b34801561083357600080fd5b5061083c6119dd565b60405161084991906157b4565b60405180910390f35b34801561085e57600080fd5b506108676119e3565b60405161087491906157b4565b60405180910390f35b34801561088957600080fd5b506108926119ef565b60405161089f91906152d0565b60405180910390f35b6108c260048036038101906108bd91906140b6565b611a8d565b005b3480156108d057600080fd5b506108eb60048036038101906108e691906141e5565b612264565b005b3480156108f957600080fd5b50610914600480360381019061090f91906142af565b6123e5565b005b34801561092257600080fd5b5061092b6124d1565b60405161093891906157b4565b60405180910390f35b34801561094d57600080fd5b506109566124d7565b60405161096391906157b4565b60405180910390f35b34801561097857600080fd5b50610993600480360381019061098e919061416a565b6124dc565b005b3480156109a157600080fd5b506109aa61253e565b6040516109b791906157b4565b60405180910390f35b3480156109cc57600080fd5b506109d561254a565b6040516109e291906152d0565b60405180910390f35b3480156109f757600080fd5b50610a006125e8565b005b348015610a0e57600080fd5b50610a296004803603810190610a2491906142f0565b6126b9565b604051610a3691906152d0565b60405180910390f35b348015610a4b57600080fd5b50610a5461283c565b604051610a6191906157b4565b60405180910390f35b348015610a7657600080fd5b50610a916004803603810190610a8c9190614221565b612848565b005b348015610a9f57600080fd5b50610aba6004803603810190610ab591906142f0565b6129b4565b604051610ac791906152d0565b60405180910390f35b348015610adc57600080fd5b50610ae5612aa1565b604051610af291906157b4565b60405180910390f35b348015610b0757600080fd5b50610b226004803603810190610b1d91906140df565b612aa7565b604051610b2f91906152b5565b60405180910390f35b348015610b4457600080fd5b50610b5f6004803603810190610b5a91906142f0565b612b3b565b005b348015610b6d57600080fd5b50610b76612bda565b604051610b8391906157b4565b60405180910390f35b348015610b9857600080fd5b50610bb36004803603810190610bae919061408d565b612be0565b005b348015610bc157600080fd5b50610bca612d8c565b604051610bd791906157b4565b60405180910390f35b348015610bec57600080fd5b50610bf5612d98565b604051610c0291906157b4565b60405180910390f35b348015610c1757600080fd5b50610c20612da4565b604051610c2d91906157b4565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d355780601f10610d0a57610100808354040283529160200191610d35565b820191906000526020600020905b815481529060010190602001808311610d1857829003601f168201915b5050505050905090565b6000610d4a82612daa565b610d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8090615634565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610dcf826112c0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e37906156b4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e5f612dc7565b73ffffffffffffffffffffffffffffffffffffffff161480610e8e5750610e8d81610e88612dc7565b612aa7565b5b610ecd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec490615594565b60405180910390fd5b610ed78383612dcf565b505050565b610ee4612dc7565b73ffffffffffffffffffffffffffffffffffffffff16610f0261190c565b73ffffffffffffffffffffffffffffffffffffffff1614610f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4f90615654565b60405180910390fd5b80600b9080519060200190610f6e929190613e94565b5050565b6000610f7e6002612e88565b905090565b6103e881565b610f9a610f94612dc7565b82612e9d565b610fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd090615714565b60405180910390fd5b610fe4838383612f7b565b505050565b61177081565b674563918244f4000081565b601060009054906101000a900460ff1681565b600061106182600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061319290919063ffffffff16565b905092915050565b61271081565b611077612dc7565b73ffffffffffffffffffffffffffffffffffffffff1661109561190c565b73ffffffffffffffffffffffffffffffffffffffff16146110eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e290615654565b60405180910390fd5b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b61111f612dc7565b73ffffffffffffffffffffffffffffffffffffffff1661113d61190c565b73ffffffffffffffffffffffffffffffffffffffff1614611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a90615654565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156111de573d6000803e3d6000fd5b5050565b6111fd838383604051806020016040528060008152506124dc565b505050565b6000806112198360026131ac90919063ffffffff16565b50905080915050919050565b61122d612dc7565b73ffffffffffffffffffffffffffffffffffffffff1661124b61190c565b73ffffffffffffffffffffffffffffffffffffffff16146112a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129890615654565b60405180910390fd5b6112aa816131d8565b50565b601060019054906101000a900460ff1681565b60006112f082604051806060016040528060298152602001615ab36029913960026131f29092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561138f5780601f106113645761010080835404028352916020019161138f565b820191906000526020600020905b81548152906001019060200180831161137257829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561140a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611401906155b4565b60405180910390fd5b611451600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613211565b9050919050565b611460612dc7565b73ffffffffffffffffffffffffffffffffffffffff1661147e61190c565b73ffffffffffffffffffffffffffffffffffffffff16146114d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cb90615654565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6101f481565b601060019054906101000a900460ff166115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e190615414565b60405180910390fd5b60016115f4610f72565b101561164a5760008111801561160a5750600181145b611649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164090615554565b60405180910390fd5b5b6001611654610f72565b106116aa5760008111801561166a5750600a8111155b6116a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a090615794565b60405180910390fd5b5b60016116b4610f72565b10611711576116ce81600e5461322690919063ffffffff16565b341015611710576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170790615494565b60405180910390fd5b5b611727600161271061329690919063ffffffff16565b61174182611733610f72565b6132e690919063ffffffff16565b1115611782576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611779906153f4565b60405180910390fd5b60005b8181101561180f5760006117aa600161179c610f72565b6132e690919063ffffffff16565b90506127106117b7610f72565b1015611801576117c7338261333b565b7f82835ea25ccfef5e19aa13fadaec2a0f2e1fbbcd0d09dbca27b70624b09b113233826040516117f8929190615241565b60405180910390a15b508080600101915050611785565b5050565b6060600061182083611399565b9050600081141561187b57600067ffffffffffffffff8111801561184357600080fd5b506040519080825280602002602001820160405280156118725781602001602082028036833780820191505090505b50915050611907565b60008167ffffffffffffffff8111801561189457600080fd5b506040519080825280602002602001820160405280156118c35781602001602082028036833780820191505090505b50905060005b82811015611900576118db858261100e565b8282815181106118e757fe5b60200260200101818152505080806001019150506118c9565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a81565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119d35780601f106119a8576101008083540402835291602001916119d3565b820191906000526020600020905b8154815290600101906020018083116119b657829003601f168201915b5050505050905090565b610fa081565b670de0b6b3a764000081565b600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a855780601f10611a5a57610100808354040283529160200191611a85565b820191906000526020600020905b815481529060010190602001808311611a6857829003601f168201915b505050505081565b611a95612dc7565b73ffffffffffffffffffffffffffffffffffffffff16611ab361190c565b73ffffffffffffffffffffffffffffffffffffffff1614611b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0090615654565b60405180910390fd5b601060009054906101000a900460ff1615611b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5090615574565b60405180910390fd5b6101f4611b64610f72565b1015611bc857611b7581600061333b565b6001601060006101000a81548160ff0219169083151502179055507fb4a21726ec29ac7853cdc5a2e951b23991d9c4b3c079fb95ffe3b873575030fb81604051611bbf91906151da565b60405180910390a15b6101f4611bd3610f72565b10158015611be957506103e8611be7610f72565b105b15611ce557670de0b6b3a76400003414611c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2f906154d4565b60405180910390fd5b611c4381600061333b565b6001601060006101000a81548160ff0219169083151502179055507fb4a21726ec29ac7853cdc5a2e951b23991d9c4b3c079fb95ffe3b873575030fb81604051611c8d91906151da565b60405180910390a18073ffffffffffffffffffffffffffffffffffffffff166108fc670de0b6b3a76400009081150290604051600060405180830381858888f19350505050158015611ce3573d6000803e3d6000fd5b505b6103e8611cf0610f72565b10158015611d0657506107d0611d04610f72565b105b15611e0257671bc16d674ec800003414611d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4c906156d4565b60405180910390fd5b611d6081600061333b565b6001601060006101000a81548160ff0219169083151502179055507fb4a21726ec29ac7853cdc5a2e951b23991d9c4b3c079fb95ffe3b873575030fb81604051611daa91906151da565b60405180910390a18073ffffffffffffffffffffffffffffffffffffffff166108fc671bc16d674ec800009081150290604051600060405180830381858888f19350505050158015611e00573d6000803e3d6000fd5b505b6107d0611e0d610f72565b10158015611e235750610fa0611e21610f72565b105b15611f1f576729a2241af62c00003414611e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e69906153b4565b60405180910390fd5b611e7d81600061333b565b6001601060006101000a81548160ff0219169083151502179055507fb4a21726ec29ac7853cdc5a2e951b23991d9c4b3c079fb95ffe3b873575030fb81604051611ec791906151da565b60405180910390a18073ffffffffffffffffffffffffffffffffffffffff166108fc6729a2241af62c00009081150290604051600060405180830381858888f19350505050158015611f1d573d6000803e3d6000fd5b505b610fa0611f2a610f72565b10158015611f405750611770611f3e610f72565b105b1561203c57673782dace9d9000003414611f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8690615754565b60405180910390fd5b611f9a81600061333b565b6001601060006101000a81548160ff0219169083151502179055507fb4a21726ec29ac7853cdc5a2e951b23991d9c4b3c079fb95ffe3b873575030fb81604051611fe491906151da565b60405180910390a18073ffffffffffffffffffffffffffffffffffffffff166108fc673782dace9d9000009081150290604051600060405180830381858888f1935050505015801561203a573d6000803e3d6000fd5b505b611770612047610f72565b1015801561205d5750611f4061205b610f72565b105b1561215957674563918244f4000034146120ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a390615774565b60405180910390fd5b6120b781600061333b565b6001601060006101000a81548160ff0219169083151502179055507fb4a21726ec29ac7853cdc5a2e951b23991d9c4b3c079fb95ffe3b873575030fb8160405161210191906151da565b60405180910390a18073ffffffffffffffffffffffffffffffffffffffff166108fc674563918244f400009081150290604051600060405180830381858888f19350505050158015612157573d6000803e3d6000fd5b505b611f40612164610f72565b10612261576753444835ec5800003410156121b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ab90615514565b60405180910390fd5b6121bf81600061333b565b6001601060006101000a81548160ff0219169083151502179055507fb4a21726ec29ac7853cdc5a2e951b23991d9c4b3c079fb95ffe3b873575030fb8160405161220991906151da565b60405180910390a18073ffffffffffffffffffffffffffffffffffffffff166108fc6753444835ec5800009081150290604051600060405180830381858888f1935050505015801561225f573d6000803e3d6000fd5b505b50565b61226c612dc7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d190615474565b60405180910390fd5b80600560006122e7612dc7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612394612dc7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123d991906152b5565b60405180910390a35050565b6123ed612dc7565b73ffffffffffffffffffffffffffffffffffffffff1661240b61190c565b73ffffffffffffffffffffffffffffffffffffffff1614612461576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245890615654565b60405180910390fd5b60001515600d60009054906101000a900460ff161515146124b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ae906156f4565b60405180910390fd5b80600c90805190602001906124cd929190613e94565b5050565b6107d081565b600181565b6124ed6124e7612dc7565b83612e9d565b61252c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252390615714565b60405180910390fd5b61253884848484613359565b50505050565b6753444835ec58000081565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125e05780601f106125b5576101008083540402835291602001916125e0565b820191906000526020600020905b8154815290600101906020018083116125c357829003601f168201915b505050505081565b6125f0612dc7565b73ffffffffffffffffffffffffffffffffffffffff1661260e61190c565b73ffffffffffffffffffffffffffffffffffffffff1614612664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265b90615654565b60405180910390fd5b6001600d60006101000a81548160ff0219169083151502179055507f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b0600c6040516126af91906152f2565b60405180910390a1565b60606126c482612daa565b612703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fa90615694565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156127ac5780601f10612781576101008083540402835291602001916127ac565b820191906000526020600020905b81548152906001019060200180831161278f57829003601f168201915b5050505050905060006127bd6112f7565b90506000815114156127d3578192505050612837565b6000825111156128085780826040516020016127f092919061519b565b60405160208183030381529060405292505050612837565b80612812856133b5565b60405160200161282392919061519b565b604051602081830303815290604052925050505b919050565b671bc16d674ec8000081565b612850612dc7565b73ffffffffffffffffffffffffffffffffffffffff1661286e61190c565b73ffffffffffffffffffffffffffffffffffffffff16146128c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128bb90615654565b60405180910390fd5b60006128e160016128d3610f72565b6132e690919063ffffffff16565b90506000821180156128f55750600f548211155b612934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292b90615434565b60405180910390fd5b60005b828110156129935761294b8482840161333b565b7f82835ea25ccfef5e19aa13fadaec2a0f2e1fbbcd0d09dbca27b70624b09b11328482840160405161297e92919061526a565b60405180910390a18080600101915050612937565b506129a982600f5461329690919063ffffffff16565b600f81905550505050565b60606129be610f72565b82106129ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f690615334565b60405180910390fd5b600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612a955780601f10612a6a57610100808354040283529160200191612a95565b820191906000526020600020905b815481529060010190602001808311612a7857829003601f168201915b50505050509050919050565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612b43612dc7565b73ffffffffffffffffffffffffffffffffffffffff16612b6161190c565b73ffffffffffffffffffffffffffffffffffffffff1614612bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bae90615654565b60405180910390fd5b612bd166038d7ea4c680008261322690919063ffffffff16565b600e8190555050565b611f4081565b612be8612dc7565b73ffffffffffffffffffffffffffffffffffffffff16612c0661190c565b73ffffffffffffffffffffffffffffffffffffffff1614612c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5390615654565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc390615374565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6729a2241af62c000081565b673782dace9d90000081565b600e5481565b6000612dc08260026134fc90919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612e42836112c0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612e9682600001613516565b9050919050565b6000612ea882612daa565b612ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ede90615534565b60405180910390fd5b6000612ef2836112c0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612f6157508373ffffffffffffffffffffffffffffffffffffffff16612f4984610d3f565b73ffffffffffffffffffffffffffffffffffffffff16145b80612f725750612f718185612aa7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612f9b826112c0565b73ffffffffffffffffffffffffffffffffffffffff1614612ff1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe890615674565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305890615454565b60405180910390fd5b61306c838383613527565b613077600082612dcf565b6130c881600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061352c90919063ffffffff16565b5061311a81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061354690919063ffffffff16565b50613131818360026135609092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006131a18360000183613595565b60001c905092915050565b6000806000806131bf8660000186613602565b915091508160001c8160001c9350935050509250929050565b80600990805190602001906131ee929190613e94565b5050565b6000613205846000018460001b84613685565b60001c90509392505050565b600061321f82600001613716565b9050919050565b6000808314156132395760009050613290565b600082840290508284828161324a57fe5b041461328b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328290615614565b60405180910390fd5b809150505b92915050565b6000828211156132db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132d2906154b4565b60405180910390fd5b818303905092915050565b600080828401905083811015613331576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613328906153d4565b60405180910390fd5b8091505092915050565b613355828260405180602001604052806000815250613727565b5050565b613364848484612f7b565b61337084848484613782565b6133af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a690615354565b60405180910390fd5b50505050565b606060008214156133fd576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506134f7565b600082905060005b60008214613427578080600101915050600a828161341f57fe5b049150613405565b60008167ffffffffffffffff8111801561344057600080fd5b506040519080825280601f01601f1916602001820160405280156134735781602001600182028036833780820191505090505b50905060006001830390508593505b600084146134ef57600a848161349457fe5b0660300160f81b828280600190039350815181106134ae57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84816134e757fe5b049350613482565b819450505050505b919050565b600061350e836000018360001b6138e6565b905092915050565b600081600001805490509050919050565b505050565b600061353e836000018360001b613909565b905092915050565b6000613558836000018360001b6139f1565b905092915050565b600061358c846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613a61565b90509392505050565b6000818360000180549050116135e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135d790615314565b60405180910390fd5b8260000182815481106135ef57fe5b9060005260206000200154905092915050565b6000808284600001805490501161364e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613645906155d4565b60405180910390fd5b600084600001848154811061365f57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600080846001016000858152602001908152602001600020549050600081141583906136e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136de91906152d0565b60405180910390fd5b508460000160018203815481106136fa57fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6137318383613b3d565b61373e6000848484613782565b61377d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377490615354565b60405180910390fd5b505050565b60006137a38473ffffffffffffffffffffffffffffffffffffffff16613ccb565b6137b057600190506138de565b600061387763150b7a0260e01b6137c5612dc7565b8887876040516024016137db94939291906151f5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615a81603291398773ffffffffffffffffffffffffffffffffffffffff16613cde9092919063ffffffff16565b905060008180602001905181019061388f9190614286565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146139e5576000600182039050600060018660000180549050039050600086600001828154811061395457fe5b906000526020600020015490508087600001848154811061397157fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806139a957fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506139eb565b60009150505b92915050565b60006139fd8383613cf6565b613a56578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613a5b565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415613b0857846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613b36565b82856000016001830381548110613b1b57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ba4906155f4565b60405180910390fd5b613bb681612daa565b15613bf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bed90615394565b60405180910390fd5b613c0260008383613527565b613c5381600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061354690919063ffffffff16565b50613c6a818360026135609092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6060613ced8484600085613d19565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b606082471015613d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d55906154f4565b60405180910390fd5b613d6785613ccb565b613da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d9d90615734565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613dcf9190615184565b60006040518083038185875af1925050503d8060008114613e0c576040519150601f19603f3d011682016040523d82523d6000602084013e613e11565b606091505b5091509150613e21828286613e2d565b92505050949350505050565b60608315613e3d57829050613e8d565b600083511115613e505782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e8491906152d0565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282613eca5760008555613f11565b82601f10613ee357805160ff1916838001178555613f11565b82800160010185558215613f11579182015b82811115613f10578251825591602001919060010190613ef5565b5b509050613f1e9190613f22565b5090565b5b80821115613f3b576000816000905550600101613f23565b5090565b6000613f52613f4d84615800565b6157cf565b905082815260208101848484011115613f6a57600080fd5b613f758482856159b8565b509392505050565b6000613f90613f8b84615830565b6157cf565b905082815260208101848484011115613fa857600080fd5b613fb38482856159b8565b509392505050565b600081359050613fca81615a0d565b92915050565b600081359050613fdf81615a24565b92915050565b600081359050613ff481615a3b565b92915050565b60008135905061400981615a52565b92915050565b60008151905061401e81615a52565b92915050565b600082601f83011261403557600080fd5b8135614045848260208601613f3f565b91505092915050565b600082601f83011261405f57600080fd5b813561406f848260208601613f7d565b91505092915050565b60008135905061408781615a69565b92915050565b60006020828403121561409f57600080fd5b60006140ad84828501613fbb565b91505092915050565b6000602082840312156140c857600080fd5b60006140d684828501613fd0565b91505092915050565b600080604083850312156140f257600080fd5b600061410085828601613fbb565b925050602061411185828601613fbb565b9150509250929050565b60008060006060848603121561413057600080fd5b600061413e86828701613fbb565b935050602061414f86828701613fbb565b925050604061416086828701614078565b9150509250925092565b6000806000806080858703121561418057600080fd5b600061418e87828801613fbb565b945050602061419f87828801613fbb565b93505060406141b087828801614078565b925050606085013567ffffffffffffffff8111156141cd57600080fd5b6141d987828801614024565b91505092959194509250565b600080604083850312156141f857600080fd5b600061420685828601613fbb565b925050602061421785828601613fe5565b9150509250929050565b6000806040838503121561423457600080fd5b600061424285828601613fbb565b925050602061425385828601614078565b9150509250929050565b60006020828403121561426f57600080fd5b600061427d84828501613ffa565b91505092915050565b60006020828403121561429857600080fd5b60006142a68482850161400f565b91505092915050565b6000602082840312156142c157600080fd5b600082013567ffffffffffffffff8111156142db57600080fd5b6142e78482850161404e565b91505092915050565b60006020828403121561430257600080fd5b600061431084828501614078565b91505092915050565b60006143258383615166565b60208301905092915050565b61433a81615982565b82525050565b6143498161590e565b82525050565b614358816158fc565b82525050565b600061436982615885565b61437381856158b3565b935061437e83615860565b8060005b838110156143af5781516143968882614319565b97506143a1836158a6565b925050600181019050614382565b5085935050505092915050565b6143c581615920565b82525050565b60006143d682615890565b6143e081856158c4565b93506143f08185602086016159c7565b6143f9816159fc565b840191505092915050565b600061440f82615890565b61441981856158d5565b93506144298185602086016159c7565b80840191505092915050565b60006144408261589b565b61444a81856158e0565b935061445a8185602086016159c7565b614463816159fc565b840191505092915050565b60006144798261589b565b61448381856158f1565b93506144938185602086016159c7565b80840191505092915050565b6000815460018116600081146144bc57600181146144e257614526565b607f60028304166144cd81876158e0565b955060ff198316865260208601935050614526565b600282046144f081876158e0565b95506144fb85615870565b60005b8281101561451d578154818901526001820191506020810190506144fe565b80880195505050505b505092915050565b600061453b6022836158e0565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145a1601f836158e0565b91507f43484f4f53452041204b494e474d414b45522057495448494e2052414e4745006000830152602082019050919050565b60006145e16032836158e0565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006146476026836158e0565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ad601c836158e0565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006146ed6019836158e0565b91507f45746865722076616c7565206d757374206265203320455448000000000000006000830152602082019050919050565b600061472d601b836158e0565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b600061476d602e836158e0565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f66204b696e674d616b6572730000000000000000000000000000000000006020830152604082019050919050565b60006147d36025836158e0565b91507f53616c65206d7573742062652061637469766520746f206d696e74204b696e6760008301527f4d616b65720000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006148396020836158e0565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d6000830152602082019050919050565b60006148796024836158e0565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006148df6019836158e0565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061491f601f836158e0565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b600061495f601e836158e0565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b600061499f6019836158e0565b91507f45746865722076616c7565206d757374206265203120455448000000000000006000830152602082019050919050565b60006149df6026836158e0565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a456021836158e0565b91507f45746865722076616c7565206d757374206265203620455448206f72206d6f7260008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614aab602c836158e0565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614b116020836158e0565b91507f43616e206f6e6c79206d696e74203120746f6b656e7320617420612074696d656000830152602082019050919050565b6000614b51602b836158e0565b91507f457863616c69627572206d757374206e6f74206861766520616c72656164792060008301527f6265656e206d696e7465640000000000000000000000000000000000000000006020830152604082019050919050565b6000614bb76038836158e0565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614c1d602a836158e0565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c836022836158e0565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ce96020836158e0565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614d296021836158e0565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d8f602c836158e0565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614df56020836158e0565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614e356029836158e0565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614e9b602f836158e0565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614f016021836158e0565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614f676019836158e0565b91507f45746865722076616c7565206d757374206265203220455448000000000000006000830152602082019050919050565b6000614fa76016836158e0565b91507f4c6963656e736520616c7265616479206c6f636b6564000000000000000000006000830152602082019050919050565b6000614fe76031836158e0565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061504d601d836158e0565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b600061508d6019836158e0565b91507f45746865722076616c7565206d757374206265203420455448000000000000006000830152602082019050919050565b60006150cd6019836158e0565b91507f45746865722076616c7565206d757374206265203520455448000000000000006000830152602082019050919050565b600061510d6021836158e0565b91507f43616e206f6e6c79206d696e7420313020746f6b656e7320617420612074696d60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b61516f81615978565b82525050565b61517e81615978565b82525050565b60006151908284614404565b915081905092915050565b60006151a7828561446e565b91506151b3828461446e565b91508190509392505050565b60006020820190506151d4600083018461434f565b92915050565b60006020820190506151ef6000830184614331565b92915050565b600060808201905061520a6000830187614340565b615217602083018661434f565b6152246040830185615175565b818103606083015261523681846143cb565b905095945050505050565b60006040820190506152566000830185614331565b6152636020830184615175565b9392505050565b600060408201905061527f600083018561434f565b61528c6020830184615175565b9392505050565b600060208201905081810360008301526152ad818461435e565b905092915050565b60006020820190506152ca60008301846143bc565b92915050565b600060208201905081810360008301526152ea8184614435565b905092915050565b6000602082019050818103600083015261530c818461449f565b905092915050565b6000602082019050818103600083015261532d8161452e565b9050919050565b6000602082019050818103600083015261534d81614594565b9050919050565b6000602082019050818103600083015261536d816145d4565b9050919050565b6000602082019050818103600083015261538d8161463a565b9050919050565b600060208201905081810360008301526153ad816146a0565b9050919050565b600060208201905081810360008301526153cd816146e0565b9050919050565b600060208201905081810360008301526153ed81614720565b9050919050565b6000602082019050818103600083015261540d81614760565b9050919050565b6000602082019050818103600083015261542d816147c6565b9050919050565b6000602082019050818103600083015261544d8161482c565b9050919050565b6000602082019050818103600083015261546d8161486c565b9050919050565b6000602082019050818103600083015261548d816148d2565b9050919050565b600060208201905081810360008301526154ad81614912565b9050919050565b600060208201905081810360008301526154cd81614952565b9050919050565b600060208201905081810360008301526154ed81614992565b9050919050565b6000602082019050818103600083015261550d816149d2565b9050919050565b6000602082019050818103600083015261552d81614a38565b9050919050565b6000602082019050818103600083015261554d81614a9e565b9050919050565b6000602082019050818103600083015261556d81614b04565b9050919050565b6000602082019050818103600083015261558d81614b44565b9050919050565b600060208201905081810360008301526155ad81614baa565b9050919050565b600060208201905081810360008301526155cd81614c10565b9050919050565b600060208201905081810360008301526155ed81614c76565b9050919050565b6000602082019050818103600083015261560d81614cdc565b9050919050565b6000602082019050818103600083015261562d81614d1c565b9050919050565b6000602082019050818103600083015261564d81614d82565b9050919050565b6000602082019050818103600083015261566d81614de8565b9050919050565b6000602082019050818103600083015261568d81614e28565b9050919050565b600060208201905081810360008301526156ad81614e8e565b9050919050565b600060208201905081810360008301526156cd81614ef4565b9050919050565b600060208201905081810360008301526156ed81614f5a565b9050919050565b6000602082019050818103600083015261570d81614f9a565b9050919050565b6000602082019050818103600083015261572d81614fda565b9050919050565b6000602082019050818103600083015261574d81615040565b9050919050565b6000602082019050818103600083015261576d81615080565b9050919050565b6000602082019050818103600083015261578d816150c0565b9050919050565b600060208201905081810360008301526157ad81615100565b9050919050565b60006020820190506157c96000830184615175565b92915050565b6000604051905081810181811067ffffffffffffffff821117156157f6576157f56159fa565b5b8060405250919050565b600067ffffffffffffffff82111561581b5761581a6159fa565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561584b5761584a6159fa565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061590782615958565b9050919050565b600061591982615958565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061598d82615994565b9050919050565b600061599f826159a6565b9050919050565b60006159b182615958565b9050919050565b82818337600083830152505050565b60005b838110156159e55780820151818401526020810190506159ca565b838111156159f4576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b615a16816158fc565b8114615a2157600080fd5b50565b615a2d8161590e565b8114615a3857600080fd5b50565b615a4481615920565b8114615a4f57600080fd5b50565b615a5b8161592c565b8114615a6657600080fd5b50565b615a7281615978565b8114615a7d57600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea26469706673582212206d11cd4bd6bc4d6103d7014c1e613e31d5b92e7ce822223e82278cf0b260f20164736f6c63430007060033
Deployed Bytecode Sourcemap
70693:8759:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10588:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54075:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57083:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56582:435;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73438:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56010:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71175:59;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58142:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71373:59;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71928:64;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72378:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55722:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72154:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73817:89;;;;;;;;;;;;;:::i;:::-;;72735:134;;;;;;;;;;;;;:::i;:::-;;58589:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56298:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73710:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72476:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53719:289;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55541:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53349:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69891:148;;;;;;;;;;;;;:::i;:::-;;71110:58;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75118:1284;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73914:572;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69240:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72094:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54244:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71307:59;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71600:64;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70888:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76410:3039;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57463:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74936:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71241:59;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72209:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58845:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72010:64;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70774:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74777:124;;;;;;;;;;;;;:::i;:::-;;54419:879;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71682:64;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72877:553;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74533:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72329:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57861:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73578:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71439:59;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70194:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71764:64;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71846;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71037:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10588:200;10718:4;10747:20;:33;10768:11;10747:33;;;;;;;;;;;;;;;;;;;;;;;;;;;10740:40;;10588:200;;;:::o;54075:100::-;54129:13;54162:5;54155:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54075:100;:::o;57083:308::-;57204:7;57251:16;57259:7;57251;:16::i;:::-;57229:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;57359:15;:24;57375:7;57359:24;;;;;;;;;;;;;;;;;;;;;57352:31;;57083:308;;;:::o;56582:435::-;56663:13;56679:23;56694:7;56679:14;:23::i;:::-;56663:39;;56727:5;56721:11;;:2;:11;;;;56713:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;56821:5;56805:21;;:12;:10;:12::i;:::-;:21;;;:86;;;;56847:44;56871:5;56878:12;:10;:12::i;:::-;56847:23;:44::i;:::-;56805:86;56783:192;;;;;;;;;;;;:::i;:::-;;;;;;;;;56988:21;56997:2;57001:7;56988:8;:21::i;:::-;56582:435;;;:::o;73438:132::-;69471:12;:10;:12::i;:::-;69460:23;;:7;:5;:7::i;:::-;:23;;;69452:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73548:14:::1;73523:22;:39;;;;;;;;;;;;:::i;:::-;;73438:132:::0;:::o;56010:211::-;56071:7;56192:21;:12;:19;:21::i;:::-;56185:28;;56010:211;:::o;71175:59::-;71230:4;71175:59;:::o;58142:376::-;58351:41;58370:12;:10;:12::i;:::-;58384:7;58351:18;:41::i;:::-;58329:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;58482:28;58492:4;58498:2;58502:7;58482:9;:28::i;:::-;58142:376;;;:::o;71373:59::-;71428:4;71373:59;:::o;71928:64::-;71973:19;71928:64;:::o;72378:42::-;;;;;;;;;;;;;:::o;55722:212::-;55864:7;55896:30;55920:5;55896:13;:20;55910:5;55896:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;55889:37;;55722:212;;;;:::o;72154:46::-;72195:5;72154:46;:::o;73817:89::-;69471:12;:10;:12::i;:::-;69460:23;;:7;:5;:7::i;:::-;:23;;;69452:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73886:12:::1;;;;;;;;;;;73885:13;73870:12;;:28;;;;;;;;;;;;;;;;;;73817:89::o:0;72735:134::-;69471:12;:10;:12::i;:::-;69460:23;;:7;:5;:7::i;:::-;:23;;;69452:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72783:15:::1;72801:21;72783:39;;72833:10;:19;;:28;72853:7;72833:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;69531:1;72735:134::o:0;58589:185::-;58727:39;58744:4;58750:2;58754:7;58727:39;;;;;;;;;;;;:16;:39::i;:::-;58589:185;;;:::o;56298:222::-;56418:7;56444:15;56465:22;56481:5;56465:12;:15;;:22;;;;:::i;:::-;56443:44;;;56505:7;56498:14;;;56298:222;;;:::o;73710:99::-;69471:12;:10;:12::i;:::-;69460:23;;:7;:5;:7::i;:::-;:23;;;69452:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73781:20:::1;73793:7;73781:11;:20::i;:::-;73710:99:::0;:::o;72476:31::-;;;;;;;;;;;;;:::o;53719:289::-;53836:7;53881:119;53916:7;53881:119;;;;;;;;;;;;;;;;;:12;:16;;:119;;;;;:::i;:::-;53861:139;;53719:289;;;:::o;55541:97::-;55589:13;55622:8;55615:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55541:97;:::o;53349:308::-;53466:7;53530:1;53513:19;;:5;:19;;;;53491:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;53620:29;:13;:20;53634:5;53620:20;;;;;;;;;;;;;;;:27;:29::i;:::-;53613:36;;53349:308;;;:::o;69891:148::-;69471:12;:10;:12::i;:::-;69460:23;;:7;:5;:7::i;:::-;:23;;;69452:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69998:1:::1;69961:40;;69982:6;;;;;;;;;;;69961:40;;;;;;;;;;;;70029:1;70012:6;;:19;;;;;;;;;;;;;;;;;;69891:148::o:0;71110:58::-;71165:3;71110:58;:::o;75118:1284::-;75199:12;;;;;;;;;;;75191:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;72256:1;75268:13;:11;:13::i;:::-;:36;75264:204;;;75364:1;75347:14;:18;:41;;;;;75387:1;75369:14;:19;75347:41;75321:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;75264:204;72256:1;75482:13;:11;:13::i;:::-;:37;75478:227;;75579:1;75562:14;:18;:62;;;;;72143:2;75584:14;:40;;75562:62;75536:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;75478:227;72256:1;75719:13;:11;:13::i;:::-;:37;75715:212;;75812:36;75833:14;75812:16;;:20;;:36;;;;:::i;:::-;75799:9;:49;;75773:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;75715:212;75996:21;76015:1;72195:5;75996:18;;:21;;;;:::i;:::-;75959:33;75977:14;75959:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:58;;75937:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;76109:9;76104:291;76128:14;76124:1;:18;76104:291;;;76164:17;76184:20;76202:1;76184:13;:11;:13::i;:::-;:17;;:20;;;;:::i;:::-;76164:40;;72195:5;76223:13;:11;:13::i;:::-;:30;76219:165;;;76274:32;76284:10;76296:9;76274;:32::i;:::-;76330:38;76346:10;76358:9;76330:38;;;;;;;:::i;:::-;;;;;;;;76219:165;76104:291;76144:3;;;;;;;76104:291;;;;75118:1284;:::o;73914:572::-;74003:16;74037:18;74058:17;74068:6;74058:9;:17::i;:::-;74037:38;;74104:1;74090:10;:15;74086:393;;;74181:1;74167:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74160:23;;;;;74086:393;74216:23;74256:10;74242:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74216:51;;74282:13;74310:130;74334:10;74326:5;:18;74310:130;;;74390:34;74410:6;74418:5;74390:19;:34::i;:::-;74374:6;74381:5;74374:13;;;;;;;;;;;;;:50;;;;;74346:7;;;;;;;74310:130;;;74461:6;74454:13;;;;;73914:572;;;;:::o;69240:87::-;69286:7;69313:6;;;;;;;;;;;69306:13;;69240:87;:::o;72094:51::-;72143:2;72094:51;:::o;54244:104::-;54300:13;54333:7;54326:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54244:104;:::o;71307:59::-;71362:4;71307:59;:::o;71600:64::-;71645:19;71600:64;:::o;70888:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;76410:3039::-;69471:12;:10;:12::i;:::-;69460:23;;:7;:5;:7::i;:::-;:23;;;69452:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76513:22:::1;;;;;;;;;;;76512:23;76490:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;71165:3;76621:13;:11;:13::i;:::-;:44;76617:178;;;76682:17;76692:3;76697:1;76682:9;:17::i;:::-;76739:4;76714:22;;:29;;;;;;;;;;;;;;;;;;76763:20;76779:3;76763:20;;;;;;:::i;:::-;;;;;;;;76617:178;71165:3;76823:13;:11;:13::i;:::-;:45;;:106;;;;;71230:4;76885:13;:11;:13::i;:::-;:44;76823:106;76805:444;;;71645:19;76982:9;:31;76956:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;77089:17;77099:3;77104:1;77089:9;:17::i;:::-;77146:4;77121:22;;:29;;;;;;;;;;;;;;;;;;77170:20;77186:3;77170:20;;;;;;:::i;:::-;;;;;;;;77205:3;:12;;:32;71645:19;77205:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;76805:444;71230:4;77277:13;:11;:13::i;:::-;:45;;:106;;;;;71296:4;77339:13;:11;:13::i;:::-;:44;77277:106;77259:444;;;71727:19;77436:9;:31;77410:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;77543:17;77553:3;77558:1;77543:9;:17::i;:::-;77600:4;77575:22;;:29;;;;;;;;;;;;;;;;;;77624:20;77640:3;77624:20;;;;;;:::i;:::-;;;;;;;;77659:3;:12;;:32;71727:19;77659:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;77259:444;71296:4;77731:13;:11;:13::i;:::-;:45;;:106;;;;;71362:4;77793:13;:11;:13::i;:::-;:44;77731:106;77713:444;;;71809:19;77890:9;:31;77864:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;77997:17;78007:3;78012:1;77997:9;:17::i;:::-;78054:4;78029:22;;:29;;;;;;;;;;;;;;;;;;78078:20;78094:3;78078:20;;;;;;:::i;:::-;;;;;;;;78113:3;:12;;:32;71809:19;78113:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;77713:444;71362:4;78185:13;:11;:13::i;:::-;:45;;:106;;;;;71428:4;78247:13;:11;:13::i;:::-;:44;78185:106;78167:444;;;71891:19;78344:9;:31;78318:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;78451:17;78461:3;78466:1;78451:9;:17::i;:::-;78508:4;78483:22;;:29;;;;;;;;;;;;;;;;;;78532:20;78548:3;78532:20;;;;;;:::i;:::-;;;;;;;;78567:3;:12;;:32;71891:19;78567:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;78167:444;71428:4;78639:13;:11;:13::i;:::-;:45;;:106;;;;;71494:4;78701:13;:11;:13::i;:::-;:44;78639:106;78621:444;;;71973:19;78798:9;:31;78772:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;78905:17;78915:3;78920:1;78905:9;:17::i;:::-;78962:4;78937:22;;:29;;;;;;;;;;;;;;;;;;78986:20;79002:3;78986:20;;;;;;:::i;:::-;;;;;;;;79021:3;:12;;:32;71973:19;79021:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;78621:444;71494:4;79079:13;:11;:13::i;:::-;:45;79075:367;;72055:19;79167:9;:31;;79141:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;79282:17;79292:3;79297:1;79282:9;:17::i;:::-;79339:4;79314:22;;:29;;;;;;;;;;;;;;;;;;79363:20;79379:3;79363:20;;;;;;:::i;:::-;;;;;;;;79398:3;:12;;:32;72055:19;79398:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;79075:367;76410:3039:::0;:::o;57463:327::-;57610:12;:10;:12::i;:::-;57598:24;;:8;:24;;;;57590:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;57710:8;57665:18;:32;57684:12;:10;:12::i;:::-;57665:32;;;;;;;;;;;;;;;:42;57698:8;57665:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;57763:8;57734:48;;57749:12;:10;:12::i;:::-;57734:48;;;57773:8;57734:48;;;;;;:::i;:::-;;;;;;;;57463:327;;:::o;74936:174::-;69471:12;:10;:12::i;:::-;69460:23;;:7;:5;:7::i;:::-;:23;;;69452:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75036:5:::1;75019:22;;:13;;;;;;;;;;;:22;;;75011:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;75094:8;75079:12;:23;;;;;;;;;;;;:::i;:::-;;74936:174:::0;:::o;71241:59::-;71296:4;71241:59;:::o;72209:48::-;72256:1;72209:48;:::o;58845:365::-;59034:41;59053:12;:10;:12::i;:::-;59067:7;59034:18;:41::i;:::-;59012:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;59163:39;59177:4;59183:2;59187:7;59196:5;59163:13;:39::i;:::-;58845:365;;;;:::o;72010:64::-;72055:19;72010:64;:::o;70774:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;74777:124::-;69471:12;:10;:12::i;:::-;69460:23;;:7;:5;:7::i;:::-;:23;;;69452:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74844:4:::1;74828:13;;:20;;;;;;;;;;;;;;;;;;74864:29;74880:12;74864:29;;;;;;:::i;:::-;;;;;;;;74777:124::o:0;54419:879::-;54537:13;54590:16;54598:7;54590;:16::i;:::-;54568:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;54694:23;54720:10;:19;54731:7;54720:19;;;;;;;;;;;54694:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54750:18;54771:9;:7;:9::i;:::-;54750:30;;54878:1;54862:4;54856:18;:23;54852:72;;;54903:9;54896:16;;;;;;54852:72;55054:1;55034:9;55028:23;:27;55024:108;;;55103:4;55109:9;55086:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55072:48;;;;;;55024:108;55264:4;55270:18;:7;:16;:18::i;:::-;55247:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55233:57;;;;54419:879;;;;:::o;71682:64::-;71727:19;71682:64;:::o;72877:553::-;69471:12;:10;:12::i;:::-;69460:23;;:7;:5;:7::i;:::-;:23;;;69452:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72992:17:::1;73012:20;73030:1;73012:13;:11;:13::i;:::-;:17;;:20;;;;:::i;:::-;72992:40;;73082:1;73065:14;:18;:59;;;;;73105:19;;73087:14;:37;;73065:59;73043:141;;;;;;;;;;;;:::i;:::-;;;;;;;;;73200:9;73195:156;73219:14;73215:1;:18;73195:156;;;73255:29;73265:3;73282:1;73270:9;:13;73255:9;:29::i;:::-;73304:35;73320:3;73337:1;73325:9;:13;73304:35;;;;;;;:::i;:::-;;;;;;;;73235:3;;;;;;;73195:156;;;;73383:39;73407:14;73383:19;;:23;;:39;;;;:::i;:::-;73361:19;:61;;;;69531:1;72877:553:::0;;:::o;74533:183::-;74589:13;74629;:11;:13::i;:::-;74623:3;:19;74615:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;74696:12;74689:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74533:183;;;:::o;72329:40::-;;;;:::o;57861:214::-;58003:4;58032:18;:25;58051:5;58032:25;;;;;;;;;;;;;;;:35;58058:8;58032:35;;;;;;;;;;;;;;;;;;;;;;;;;58025:42;;57861:214;;;;:::o;73578:124::-;69471:12;:10;:12::i;:::-;69460:23;;:7;:5;:7::i;:::-;:23;;;69452:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73667:27:::1;73677:16;73667:5;:9;;:27;;;;:::i;:::-;73648:16;:46;;;;73578:124:::0;:::o;71439:59::-;71494:4;71439:59;:::o;70194:281::-;69471:12;:10;:12::i;:::-;69460:23;;:7;:5;:7::i;:::-;:23;;;69452:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70317:1:::1;70297:22;;:8;:22;;;;70275:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;70430:8;70401:38;;70422:6;;;;;;;;;;;70401:38;;;;;;;;;;;;70459:8;70450:6;;:17;;;;;;;;;;;;;;;;;;70194:281:::0;:::o;71764:64::-;71809:19;71764:64;:::o;71846:::-;71891:19;71846:64;:::o;71037:51::-;;;;:::o;60757:127::-;60822:4;60846:30;60868:7;60846:12;:21;;:30;;;;:::i;:::-;60839:37;;60757:127;;;:::o;732:106::-;785:15;820:10;813:17;;732:106;:::o;67171:192::-;67273:2;67246:15;:24;67262:7;67246:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;67329:7;67325:2;67291:46;;67300:23;67315:7;67300:14;:23::i;:::-;67291:46;;;;;;;;;;;;67171:192;;:::o;46405:155::-;46501:7;46533:19;46541:3;:10;;46533:7;:19::i;:::-;46526:26;;46405:155;;;:::o;61051:459::-;61180:4;61224:16;61232:7;61224;:16::i;:::-;61202:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;61323:13;61339:23;61354:7;61339:14;:23::i;:::-;61323:39;;61392:5;61381:16;;:7;:16;;;:64;;;;61438:7;61414:31;;:20;61426:7;61414:11;:20::i;:::-;:31;;;61381:64;:120;;;;61462:39;61486:5;61493:7;61462:23;:39::i;:::-;61381:120;61373:129;;;61051:459;;;;:::o;64362:670::-;64535:4;64508:31;;:23;64523:7;64508:14;:23::i;:::-;:31;;;64486:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;64659:1;64645:16;;:2;:16;;;;64637:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;64715:39;64736:4;64742:2;64746:7;64715:20;:39::i;:::-;64819:29;64836:1;64840:7;64819:8;:29::i;:::-;64861:35;64888:7;64861:13;:19;64875:4;64861:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;64907:30;64929:7;64907:13;:17;64921:2;64907:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;64950:29;64967:7;64976:2;64950:12;:16;;:29;;;;;:::i;:::-;;65016:7;65012:2;64997:27;;65006:4;64997:27;;;;;;;;;;;;64362:670;;;:::o;37847:169::-;37945:7;37985:22;37989:3;:10;;38001:5;37985:3;:22::i;:::-;37977:31;;37970:38;;37847:169;;;;:::o;46908:268::-;47015:7;47024;47050:11;47063:13;47080:22;47084:3;:10;;47096:5;47080:3;:22::i;:::-;47049:53;;;;47129:3;47121:12;;47159:5;47151:14;;47113:55;;;;;;46908:268;;;;;:::o;65693:100::-;65777:8;65766;:19;;;;;;;;;;;;:::i;:::-;;65693:100;:::o;48290:292::-;48431:7;48513:44;48518:3;:10;;48538:3;48530:12;;48544;48513:4;:44::i;:::-;48505:53;;48451:123;;48290:292;;;;;:::o;37379:114::-;37439:7;37466:19;37474:3;:10;;37466:7;:19::i;:::-;37459:26;;37379:114;;;:::o;15235:220::-;15293:7;15322:1;15317;:6;15313:20;;;15332:1;15325:8;;;;15313:20;15344:9;15360:1;15356;:5;15344:17;;15389:1;15384;15380;:5;;;;;;:10;15372:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;15446:1;15439:8;;;15235:220;;;;;:::o;14818:158::-;14876:7;14909:1;14904;:6;;14896:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;14967:1;14963;:5;14956:12;;14818:158;;;;:::o;14356:179::-;14414:7;14434:9;14450:1;14446;:5;14434:17;;14475:1;14470;:6;;14462:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;14526:1;14519:8;;;14356:179;;;;:::o;61853:110::-;61929:26;61939:2;61943:7;61929:26;;;;;;;;;;;;:9;:26::i;:::-;61853:110;;:::o;60092:352::-;60249:28;60259:4;60265:2;60269:7;60249:9;:28::i;:::-;60310:48;60333:4;60339:2;60343:7;60352:5;60310:22;:48::i;:::-;60288:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;60092:352;;;;:::o;48829:748::-;48885:13;49115:1;49106:5;:10;49102:53;;;49133:10;;;;;;;;;;;;;;;;;;;;;49102:53;49165:12;49180:5;49165:20;;49196:14;49221:78;49236:1;49228:4;:9;49221:78;;49254:8;;;;;;;49285:2;49277:10;;;;;;;;;49221:78;;;49309:19;49341:6;49331:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49309:39;;49359:13;49384:1;49375:6;:10;49359:26;;49403:5;49396:12;;49419:119;49434:1;49426:4;:9;49419:119;;49496:2;49489:4;:9;;;;;;49483:2;:16;49470:31;;49452:6;49459:7;;;;;;;49452:15;;;;;;;;;;;:49;;;;;;;;;;;49524:2;49516:10;;;;;;;;;49419:119;;;49562:6;49548:21;;;;;;48829:748;;;;:::o;46134:183::-;46245:4;46274:35;46284:3;:10;;46304:3;46296:12;;46274:9;:35::i;:::-;46267:42;;46134:183;;;;:::o;42750:110::-;42806:7;42833:3;:12;;:19;;;;42826:26;;42750:110;;;:::o;67976:126::-;;;;:::o;36869:160::-;36957:4;36986:35;36994:3;:10;;37014:5;37006:14;;36986:7;:35::i;:::-;36979:42;;36869:160;;;;:::o;36562:131::-;36629:4;36653:32;36658:3;:10;;36678:5;36670:14;;36653:4;:32::i;:::-;36646:39;;36562:131;;;;:::o;45500:219::-;45623:4;45647:64;45652:3;:10;;45672:3;45664:12;;45702:5;45686:23;;45678:32;;45647:4;:64::i;:::-;45640:71;;45500:219;;;;;:::o;32513:273::-;32607:7;32675:5;32654:3;:11;;:18;;;;:26;32632:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;32760:3;:11;;32772:5;32760:18;;;;;;;;;;;;;;;;32753:25;;32513:273;;;;:::o;43225:348::-;43319:7;43328;43397:5;43375:3;:12;;:19;;;;:27;43353:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;43477:22;43502:3;:12;;43515:5;43502:19;;;;;;;;;;;;;;;;;;43477:44;;43540:5;:10;;;43552:5;:12;;;43532:33;;;;;43225:348;;;;;:::o;44823:353::-;44951:7;44971:16;44990:3;:12;;:17;45003:3;44990:17;;;;;;;;;;;;44971:36;;45038:1;45026:8;:13;;45041:12;45018:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;45108:3;:12;;45132:1;45121:8;:12;45108:26;;;;;;;;;;;;;;;;;;:33;;;45101:40;;;44823:353;;;;;:::o;32050:109::-;32106:7;32133:3;:11;;:18;;;;32126:25;;32050:109;;;:::o;62190:321::-;62320:18;62326:2;62330:7;62320:5;:18::i;:::-;62371:54;62402:1;62406:2;62410:7;62419:5;62371:22;:54::i;:::-;62349:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;62190:321;;;:::o;66358:694::-;66513:4;66535:15;:2;:13;;;:15::i;:::-;66530:60;;66574:4;66567:11;;;;66530:60;66600:23;66626:313;66697:45;;;66761:12;:10;:12::i;:::-;66792:4;66815:7;66841:5;66656:205;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66626:313;;;;;;;;;;;;;;;;;:2;:15;;;;:313;;;;;:::i;:::-;66600:339;;66950:13;66977:10;66966:32;;;;;;;;;;;;:::i;:::-;66950:48;;50352:10;67027:16;;67017:26;;;:6;:26;;;;67009:35;;;;66358:694;;;;;;;:::o;42498:157::-;42596:4;42646:1;42625:3;:12;;:17;42638:3;42625:17;;;;;;;;;;;;:22;;42618:29;;42498:157;;;;:::o;30160:1557::-;30226:4;30344:18;30365:3;:12;;:19;30378:5;30365:19;;;;;;;;;;;;30344:40;;30415:1;30401:10;:15;30397:1313;;30776:21;30813:1;30800:10;:14;30776:38;;30829:17;30870:1;30849:3;:11;;:18;;;;:22;30829:42;;31116:17;31136:3;:11;;31148:9;31136:22;;;;;;;;;;;;;;;;31116:42;;31282:9;31253:3;:11;;31265:13;31253:26;;;;;;;;;;;;;;;:38;;;;31401:1;31385:13;:17;31359:3;:12;;:23;31372:9;31359:23;;;;;;;;;;;:43;;;;31511:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;31606:3;:12;;:19;31619:5;31606:19;;;;;;;;;;;31599:26;;;31649:4;31642:11;;;;;;;;30397:1313;31693:5;31686:12;;;30160:1557;;;;;:::o;29570:414::-;29633:4;29655:21;29665:3;29670:5;29655:9;:21::i;:::-;29650:327;;29693:3;:11;;29710:5;29693:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29876:3;:11;;:18;;;;29854:3;:12;;:19;29867:5;29854:19;;;;;;;;;;;:40;;;;29916:4;29909:11;;;;29650:327;29960:5;29953:12;;29570:414;;;;;:::o;39940:737::-;40050:4;40166:16;40185:3;:12;;:17;40198:3;40185:17;;;;;;;;;;;;40166:36;;40231:1;40219:8;:13;40215:455;;;40299:3;:12;;40317:36;;;;;;;;40333:3;40317:36;;;;40346:5;40317:36;;;40299:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40512:3;:12;;:19;;;;40492:3;:12;;:17;40505:3;40492:17;;;;;;;;;;;:39;;;;40553:4;40546:11;;;;;40215:455;40626:5;40590:3;:12;;40614:1;40603:8;:12;40590:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;40653:5;40646:12;;;39940:737;;;;;;:::o;62847:404::-;62941:1;62927:16;;:2;:16;;;;62919:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;63000:16;63008:7;63000;:16::i;:::-;62999:17;62991:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;63062:45;63091:1;63095:2;63099:7;63062:20;:45::i;:::-;63120:30;63142:7;63120:13;:17;63134:2;63120:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;63163:29;63180:7;63189:2;63163:12;:16;;:29;;;;;:::i;:::-;;63235:7;63231:2;63210:33;;63227:1;63210:33;;;;;;;;;;;;62847:404;;:::o;19895:444::-;19955:4;20163:12;20287:7;20275:20;20267:28;;20330:1;20323:4;:8;20316:15;;;19895:444;;;:::o;22932:229::-;23069:12;23101:52;23123:6;23131:4;23137:1;23140:12;23101:21;:52::i;:::-;23094:59;;22932:229;;;;;:::o;31803:161::-;31903:4;31955:1;31932:3;:12;;:19;31945:5;31932:19;;;;;;;;;;;;:24;;31925:31;;31803:161;;;;:::o;24148:632::-;24318:12;24390:5;24365:21;:30;;24343:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;24480:18;24491:6;24480:10;:18::i;:::-;24472:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;24606:12;24620:23;24647:6;:11;;24666:5;24687:4;24647:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24605:97;;;;24720:52;24738:7;24747:10;24759:12;24720:17;:52::i;:::-;24713:59;;;;24148:632;;;;;;:::o;27071:777::-;27221:12;27250:7;27246:595;;;27281:10;27274:17;;;;27246:595;27415:1;27395:10;:17;:21;27391:439;;;27658:10;27652:17;27719:15;27706:10;27702:2;27698:19;27691:44;27606:148;27801:12;27794:20;;;;;;;;;;;:::i;:::-;;;;;;;;27071:777;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:155::-;;942:6;929:20;920:29;;958:41;993:5;958:41;:::i;:::-;910:95;;;;:::o;1011:133::-;;1092:6;1079:20;1070:29;;1108:30;1132:5;1108:30;:::i;:::-;1060:84;;;;:::o;1150:137::-;;1233:6;1220:20;1211:29;;1249:32;1275:5;1249:32;:::i;:::-;1201:86;;;;:::o;1293:141::-;;1380:6;1374:13;1365:22;;1396:32;1422:5;1396:32;:::i;:::-;1355:79;;;;:::o;1453:271::-;;1557:3;1550:4;1542:6;1538:17;1534:27;1524:2;;1575:1;1572;1565:12;1524:2;1615:6;1602:20;1640:78;1714:3;1706:6;1699:4;1691:6;1687:17;1640:78;:::i;:::-;1631:87;;1514:210;;;;;:::o;1744:273::-;;1849:3;1842:4;1834:6;1830:17;1826:27;1816:2;;1867:1;1864;1857:12;1816:2;1907:6;1894:20;1932:79;2007:3;1999:6;1992:4;1984:6;1980:17;1932:79;:::i;:::-;1923:88;;1806:211;;;;;:::o;2023:139::-;;2107:6;2094:20;2085:29;;2123:33;2150:5;2123:33;:::i;:::-;2075:87;;;;:::o;2168:262::-;;2276:2;2264:9;2255:7;2251:23;2247:32;2244:2;;;2292:1;2289;2282:12;2244:2;2335:1;2360:53;2405:7;2396:6;2385:9;2381:22;2360:53;:::i;:::-;2350:63;;2306:117;2234:196;;;;:::o;2436:278::-;;2552:2;2540:9;2531:7;2527:23;2523:32;2520:2;;;2568:1;2565;2558:12;2520:2;2611:1;2636:61;2689:7;2680:6;2669:9;2665:22;2636:61;:::i;:::-;2626:71;;2582:125;2510:204;;;;:::o;2720:407::-;;;2845:2;2833:9;2824:7;2820:23;2816:32;2813:2;;;2861:1;2858;2851:12;2813:2;2904:1;2929:53;2974:7;2965:6;2954:9;2950:22;2929:53;:::i;:::-;2919:63;;2875:117;3031:2;3057:53;3102:7;3093:6;3082:9;3078:22;3057:53;:::i;:::-;3047:63;;3002:118;2803:324;;;;;:::o;3133:552::-;;;;3275:2;3263:9;3254:7;3250:23;3246:32;3243:2;;;3291:1;3288;3281:12;3243:2;3334:1;3359:53;3404:7;3395:6;3384:9;3380:22;3359:53;:::i;:::-;3349:63;;3305:117;3461:2;3487:53;3532:7;3523:6;3512:9;3508:22;3487:53;:::i;:::-;3477:63;;3432:118;3589:2;3615:53;3660:7;3651:6;3640:9;3636:22;3615:53;:::i;:::-;3605:63;;3560:118;3233:452;;;;;:::o;3691:809::-;;;;;3859:3;3847:9;3838:7;3834:23;3830:33;3827:2;;;3876:1;3873;3866:12;3827:2;3919:1;3944:53;3989:7;3980:6;3969:9;3965:22;3944:53;:::i;:::-;3934:63;;3890:117;4046:2;4072:53;4117:7;4108:6;4097:9;4093:22;4072:53;:::i;:::-;4062:63;;4017:118;4174:2;4200:53;4245:7;4236:6;4225:9;4221:22;4200:53;:::i;:::-;4190:63;;4145:118;4330:2;4319:9;4315:18;4302:32;4361:18;4353:6;4350:30;4347:2;;;4393:1;4390;4383:12;4347:2;4421:62;4475:7;4466:6;4455:9;4451:22;4421:62;:::i;:::-;4411:72;;4273:220;3817:683;;;;;;;:::o;4506:401::-;;;4628:2;4616:9;4607:7;4603:23;4599:32;4596:2;;;4644:1;4641;4634:12;4596:2;4687:1;4712:53;4757:7;4748:6;4737:9;4733:22;4712:53;:::i;:::-;4702:63;;4658:117;4814:2;4840:50;4882:7;4873:6;4862:9;4858:22;4840:50;:::i;:::-;4830:60;;4785:115;4586:321;;;;;:::o;4913:407::-;;;5038:2;5026:9;5017:7;5013:23;5009:32;5006:2;;;5054:1;5051;5044:12;5006:2;5097:1;5122:53;5167:7;5158:6;5147:9;5143:22;5122:53;:::i;:::-;5112:63;;5068:117;5224:2;5250:53;5295:7;5286:6;5275:9;5271:22;5250:53;:::i;:::-;5240:63;;5195:118;4996:324;;;;;:::o;5326:260::-;;5433:2;5421:9;5412:7;5408:23;5404:32;5401:2;;;5449:1;5446;5439:12;5401:2;5492:1;5517:52;5561:7;5552:6;5541:9;5537:22;5517:52;:::i;:::-;5507:62;;5463:116;5391:195;;;;:::o;5592:282::-;;5710:2;5698:9;5689:7;5685:23;5681:32;5678:2;;;5726:1;5723;5716:12;5678:2;5769:1;5794:63;5849:7;5840:6;5829:9;5825:22;5794:63;:::i;:::-;5784:73;;5740:127;5668:206;;;;:::o;5880:375::-;;5998:2;5986:9;5977:7;5973:23;5969:32;5966:2;;;6014:1;6011;6004:12;5966:2;6085:1;6074:9;6070:17;6057:31;6115:18;6107:6;6104:30;6101:2;;;6147:1;6144;6137:12;6101:2;6175:63;6230:7;6221:6;6210:9;6206:22;6175:63;:::i;:::-;6165:73;;6028:220;5956:299;;;;:::o;6261:262::-;;6369:2;6357:9;6348:7;6344:23;6340:32;6337:2;;;6385:1;6382;6375:12;6337:2;6428:1;6453:53;6498:7;6489:6;6478:9;6474:22;6453:53;:::i;:::-;6443:63;;6399:117;6327:196;;;;:::o;6529:179::-;;6619:46;6661:3;6653:6;6619:46;:::i;:::-;6697:4;6692:3;6688:14;6674:28;;6609:99;;;;:::o;6714:147::-;6809:45;6848:5;6809:45;:::i;:::-;6804:3;6797:58;6787:74;;:::o;6867:142::-;6970:32;6996:5;6970:32;:::i;:::-;6965:3;6958:45;6948:61;;:::o;7015:118::-;7102:24;7120:5;7102:24;:::i;:::-;7097:3;7090:37;7080:53;;:::o;7169:732::-;;7317:54;7365:5;7317:54;:::i;:::-;7387:86;7466:6;7461:3;7387:86;:::i;:::-;7380:93;;7497:56;7547:5;7497:56;:::i;:::-;7576:7;7607:1;7592:284;7617:6;7614:1;7611:13;7592:284;;;7693:6;7687:13;7720:63;7779:3;7764:13;7720:63;:::i;:::-;7713:70;;7806:60;7859:6;7806:60;:::i;:::-;7796:70;;7652:224;7639:1;7636;7632:9;7627:14;;7592:284;;;7596:14;7892:3;7885:10;;7293:608;;;;;;;:::o;7907:109::-;7988:21;8003:5;7988:21;:::i;:::-;7983:3;7976:34;7966:50;;:::o;8022:360::-;;8136:38;8168:5;8136:38;:::i;:::-;8190:70;8253:6;8248:3;8190:70;:::i;:::-;8183:77;;8269:52;8314:6;8309:3;8302:4;8295:5;8291:16;8269:52;:::i;:::-;8346:29;8368:6;8346:29;:::i;:::-;8341:3;8337:39;8330:46;;8112:270;;;;;:::o;8388:373::-;;8520:38;8552:5;8520:38;:::i;:::-;8574:88;8655:6;8650:3;8574:88;:::i;:::-;8567:95;;8671:52;8716:6;8711:3;8704:4;8697:5;8693:16;8671:52;:::i;:::-;8748:6;8743:3;8739:16;8732:23;;8496:265;;;;;:::o;8767:364::-;;8883:39;8916:5;8883:39;:::i;:::-;8938:71;9002:6;8997:3;8938:71;:::i;:::-;8931:78;;9018:52;9063:6;9058:3;9051:4;9044:5;9040:16;9018:52;:::i;:::-;9095:29;9117:6;9095:29;:::i;:::-;9090:3;9086:39;9079:46;;8859:272;;;;;:::o;9137:377::-;;9271:39;9304:5;9271:39;:::i;:::-;9326:89;9408:6;9403:3;9326:89;:::i;:::-;9319:96;;9424:52;9469:6;9464:3;9457:4;9450:5;9446:16;9424:52;:::i;:::-;9501:6;9496:3;9492:16;9485:23;;9247:267;;;;;:::o;9544:937::-;;9666:5;9660:12;9703:1;9692:9;9688:17;9719:1;9714:281;;;;10009:1;10004:471;;;;9681:794;;9714:281;9804:4;9800:1;9789:9;9785:17;9781:28;9829:71;9893:6;9888:3;9829:71;:::i;:::-;9822:78;;9944:4;9940:9;9929;9925:25;9920:3;9913:38;9980:4;9975:3;9971:14;9964:21;;9721:274;9714:281;;10004:471;10085:1;10074:9;10070:17;10107:71;10171:6;10166:3;10107:71;:::i;:::-;10100:78;;10206:38;10238:5;10206:38;:::i;:::-;10266:1;10280:154;10294:6;10291:1;10288:13;10280:154;;;10368:7;10362:14;10358:1;10353:3;10349:11;10342:35;10418:1;10409:7;10405:15;10394:26;;10316:4;10313:1;10309:12;10304:17;;10280:154;;;10463:1;10458:3;10454:11;10447:18;;10011:464;;;9681:794;;9633:848;;;;;:::o;10487:366::-;;10650:67;10714:2;10709:3;10650:67;:::i;:::-;10643:74;;10747:34;10743:1;10738:3;10734:11;10727:55;10813:4;10808:2;10803:3;10799:12;10792:26;10844:2;10839:3;10835:12;10828:19;;10633:220;;;:::o;10859:329::-;;11022:67;11086:2;11081:3;11022:67;:::i;:::-;11015:74;;11119:33;11115:1;11110:3;11106:11;11099:54;11179:2;11174:3;11170:12;11163:19;;11005:183;;;:::o;11194:382::-;;11357:67;11421:2;11416:3;11357:67;:::i;:::-;11350:74;;11454:34;11450:1;11445:3;11441:11;11434:55;11520:20;11515:2;11510:3;11506:12;11499:42;11567:2;11562:3;11558:12;11551:19;;11340:236;;;:::o;11582:370::-;;11745:67;11809:2;11804:3;11745:67;:::i;:::-;11738:74;;11842:34;11838:1;11833:3;11829:11;11822:55;11908:8;11903:2;11898:3;11894:12;11887:30;11943:2;11938:3;11934:12;11927:19;;11728:224;;;:::o;11958:326::-;;12121:67;12185:2;12180:3;12121:67;:::i;:::-;12114:74;;12218:30;12214:1;12209:3;12205:11;12198:51;12275:2;12270:3;12266:12;12259:19;;12104:180;;;:::o;12290:323::-;;12453:67;12517:2;12512:3;12453:67;:::i;:::-;12446:74;;12550:27;12546:1;12541:3;12537:11;12530:48;12604:2;12599:3;12595:12;12588:19;;12436:177;;;:::o;12619:325::-;;12782:67;12846:2;12841:3;12782:67;:::i;:::-;12775:74;;12879:29;12875:1;12870:3;12866:11;12859:50;12935:2;12930:3;12926:12;12919:19;;12765:179;;;:::o;12950:378::-;;13113:67;13177:2;13172:3;13113:67;:::i;:::-;13106:74;;13210:34;13206:1;13201:3;13197:11;13190:55;13276:16;13271:2;13266:3;13262:12;13255:38;13319:2;13314:3;13310:12;13303:19;;13096:232;;;:::o;13334:369::-;;13497:67;13561:2;13556:3;13497:67;:::i;:::-;13490:74;;13594:34;13590:1;13585:3;13581:11;13574:55;13660:7;13655:2;13650:3;13646:12;13639:29;13694:2;13689:3;13685:12;13678:19;;13480:223;;;:::o;13709:330::-;;13872:67;13936:2;13931:3;13872:67;:::i;:::-;13865:74;;13969:34;13965:1;13960:3;13956:11;13949:55;14030:2;14025:3;14021:12;14014:19;;13855:184;;;:::o;14045:368::-;;14208:67;14272:2;14267:3;14208:67;:::i;:::-;14201:74;;14305:34;14301:1;14296:3;14292:11;14285:55;14371:6;14366:2;14361:3;14357:12;14350:28;14404:2;14399:3;14395:12;14388:19;;14191:222;;;:::o;14419:323::-;;14582:67;14646:2;14641:3;14582:67;:::i;:::-;14575:74;;14679:27;14675:1;14670:3;14666:11;14659:48;14733:2;14728:3;14724:12;14717:19;;14565:177;;;:::o;14748:329::-;;14911:67;14975:2;14970:3;14911:67;:::i;:::-;14904:74;;15008:33;15004:1;14999:3;14995:11;14988:54;15068:2;15063:3;15059:12;15052:19;;14894:183;;;:::o;15083:328::-;;15246:67;15310:2;15305:3;15246:67;:::i;:::-;15239:74;;15343:32;15339:1;15334:3;15330:11;15323:53;15402:2;15397:3;15393:12;15386:19;;15229:182;;;:::o;15417:323::-;;15580:67;15644:2;15639:3;15580:67;:::i;:::-;15573:74;;15677:27;15673:1;15668:3;15664:11;15657:48;15731:2;15726:3;15722:12;15715:19;;15563:177;;;:::o;15746:370::-;;15909:67;15973:2;15968:3;15909:67;:::i;:::-;15902:74;;16006:34;16002:1;15997:3;15993:11;15986:55;16072:8;16067:2;16062:3;16058:12;16051:30;16107:2;16102:3;16098:12;16091:19;;15892:224;;;:::o;16122:365::-;;16285:67;16349:2;16344:3;16285:67;:::i;:::-;16278:74;;16382:34;16378:1;16373:3;16369:11;16362:55;16448:3;16443:2;16438:3;16434:12;16427:25;16478:2;16473:3;16469:12;16462:19;;16268:219;;;:::o;16493:376::-;;16656:67;16720:2;16715:3;16656:67;:::i;:::-;16649:74;;16753:34;16749:1;16744:3;16740:11;16733:55;16819:14;16814:2;16809:3;16805:12;16798:36;16860:2;16855:3;16851:12;16844:19;;16639:230;;;:::o;16875:330::-;;17038:67;17102:2;17097:3;17038:67;:::i;:::-;17031:74;;17135:34;17131:1;17126:3;17122:11;17115:55;17196:2;17191:3;17187:12;17180:19;;17021:184;;;:::o;17211:375::-;;17374:67;17438:2;17433:3;17374:67;:::i;:::-;17367:74;;17471:34;17467:1;17462:3;17458:11;17451:55;17537:13;17532:2;17527:3;17523:12;17516:35;17577:2;17572:3;17568:12;17561:19;;17357:229;;;:::o;17592:388::-;;17755:67;17819:2;17814:3;17755:67;:::i;:::-;17748:74;;17852:34;17848:1;17843:3;17839:11;17832:55;17918:26;17913:2;17908:3;17904:12;17897:48;17971:2;17966:3;17962:12;17955:19;;17738:242;;;:::o;17986:374::-;;18149:67;18213:2;18208:3;18149:67;:::i;:::-;18142:74;;18246:34;18242:1;18237:3;18233:11;18226:55;18312:12;18307:2;18302:3;18298:12;18291:34;18351:2;18346:3;18342:12;18335:19;;18132:228;;;:::o;18366:366::-;;18529:67;18593:2;18588:3;18529:67;:::i;:::-;18522:74;;18626:34;18622:1;18617:3;18613:11;18606:55;18692:4;18687:2;18682:3;18678:12;18671:26;18723:2;18718:3;18714:12;18707:19;;18512:220;;;:::o;18738:330::-;;18901:67;18965:2;18960:3;18901:67;:::i;:::-;18894:74;;18998:34;18994:1;18989:3;18985:11;18978:55;19059:2;19054:3;19050:12;19043:19;;18884:184;;;:::o;19074:365::-;;19237:67;19301:2;19296:3;19237:67;:::i;:::-;19230:74;;19334:34;19330:1;19325:3;19321:11;19314:55;19400:3;19395:2;19390:3;19386:12;19379:25;19430:2;19425:3;19421:12;19414:19;;19220:219;;;:::o;19445:376::-;;19608:67;19672:2;19667:3;19608:67;:::i;:::-;19601:74;;19705:34;19701:1;19696:3;19692:11;19685:55;19771:14;19766:2;19761:3;19757:12;19750:36;19812:2;19807:3;19803:12;19796:19;;19591:230;;;:::o;19827:330::-;;19990:67;20054:2;20049:3;19990:67;:::i;:::-;19983:74;;20087:34;20083:1;20078:3;20074:11;20067:55;20148:2;20143:3;20139:12;20132:19;;19973:184;;;:::o;20163:373::-;;20326:67;20390:2;20385:3;20326:67;:::i;:::-;20319:74;;20423:34;20419:1;20414:3;20410:11;20403:55;20489:11;20484:2;20479:3;20475:12;20468:33;20527:2;20522:3;20518:12;20511:19;;20309:227;;;:::o;20542:379::-;;20705:67;20769:2;20764:3;20705:67;:::i;:::-;20698:74;;20802:34;20798:1;20793:3;20789:11;20782:55;20868:17;20863:2;20858:3;20854:12;20847:39;20912:2;20907:3;20903:12;20896:19;;20688:233;;;:::o;20927:365::-;;21090:67;21154:2;21149:3;21090:67;:::i;:::-;21083:74;;21187:34;21183:1;21178:3;21174:11;21167:55;21253:3;21248:2;21243:3;21239:12;21232:25;21283:2;21278:3;21274:12;21267:19;;21073:219;;;:::o;21298:323::-;;21461:67;21525:2;21520:3;21461:67;:::i;:::-;21454:74;;21558:27;21554:1;21549:3;21545:11;21538:48;21612:2;21607:3;21603:12;21596:19;;21444:177;;;:::o;21627:320::-;;21790:67;21854:2;21849:3;21790:67;:::i;:::-;21783:74;;21887:24;21883:1;21878:3;21874:11;21867:45;21938:2;21933:3;21929:12;21922:19;;21773:174;;;:::o;21953:381::-;;22116:67;22180:2;22175:3;22116:67;:::i;:::-;22109:74;;22213:34;22209:1;22204:3;22200:11;22193:55;22279:19;22274:2;22269:3;22265:12;22258:41;22325:2;22320:3;22316:12;22309:19;;22099:235;;;:::o;22340:327::-;;22503:67;22567:2;22562:3;22503:67;:::i;:::-;22496:74;;22600:31;22596:1;22591:3;22587:11;22580:52;22658:2;22653:3;22649:12;22642:19;;22486:181;;;:::o;22673:323::-;;22836:67;22900:2;22895:3;22836:67;:::i;:::-;22829:74;;22933:27;22929:1;22924:3;22920:11;22913:48;22987:2;22982:3;22978:12;22971:19;;22819:177;;;:::o;23002:323::-;;23165:67;23229:2;23224:3;23165:67;:::i;:::-;23158:74;;23262:27;23258:1;23253:3;23249:11;23242:48;23316:2;23311:3;23307:12;23300:19;;23148:177;;;:::o;23331:365::-;;23494:67;23558:2;23553:3;23494:67;:::i;:::-;23487:74;;23591:34;23587:1;23582:3;23578:11;23571:55;23657:3;23652:2;23647:3;23643:12;23636:25;23687:2;23682:3;23678:12;23671:19;;23477:219;;;:::o;23702:108::-;23779:24;23797:5;23779:24;:::i;:::-;23774:3;23767:37;23757:53;;:::o;23816:118::-;23903:24;23921:5;23903:24;:::i;:::-;23898:3;23891:37;23881:53;;:::o;23940:271::-;;24092:93;24181:3;24172:6;24092:93;:::i;:::-;24085:100;;24202:3;24195:10;;24074:137;;;;:::o;24217:435::-;;24419:95;24510:3;24501:6;24419:95;:::i;:::-;24412:102;;24531:95;24622:3;24613:6;24531:95;:::i;:::-;24524:102;;24643:3;24636:10;;24401:251;;;;;:::o;24658:222::-;;24789:2;24778:9;24774:18;24766:26;;24802:71;24870:1;24859:9;24855:17;24846:6;24802:71;:::i;:::-;24756:124;;;;:::o;24886:238::-;;25025:2;25014:9;25010:18;25002:26;;25038:79;25114:1;25103:9;25099:17;25090:6;25038:79;:::i;:::-;24992:132;;;;:::o;25130:672::-;;25379:3;25368:9;25364:19;25356:27;;25393:87;25477:1;25466:9;25462:17;25453:6;25393:87;:::i;:::-;25490:72;25558:2;25547:9;25543:18;25534:6;25490:72;:::i;:::-;25572;25640:2;25629:9;25625:18;25616:6;25572:72;:::i;:::-;25691:9;25685:4;25681:20;25676:2;25665:9;25661:18;25654:48;25719:76;25790:4;25781:6;25719:76;:::i;:::-;25711:84;;25346:456;;;;;;;:::o;25808:348::-;;25975:2;25964:9;25960:18;25952:26;;25988:79;26064:1;26053:9;26049:17;26040:6;25988:79;:::i;:::-;26077:72;26145:2;26134:9;26130:18;26121:6;26077:72;:::i;:::-;25942:214;;;;;:::o;26162:332::-;;26321:2;26310:9;26306:18;26298:26;;26334:71;26402:1;26391:9;26387:17;26378:6;26334:71;:::i;:::-;26415:72;26483:2;26472:9;26468:18;26459:6;26415:72;:::i;:::-;26288:206;;;;;:::o;26500:373::-;;26681:2;26670:9;26666:18;26658:26;;26730:9;26724:4;26720:20;26716:1;26705:9;26701:17;26694:47;26758:108;26861:4;26852:6;26758:108;:::i;:::-;26750:116;;26648:225;;;;:::o;26879:210::-;;27004:2;26993:9;26989:18;26981:26;;27017:65;27079:1;27068:9;27064:17;27055:6;27017:65;:::i;:::-;26971:118;;;;:::o;27095:313::-;;27246:2;27235:9;27231:18;27223:26;;27295:9;27289:4;27285:20;27281:1;27270:9;27266:17;27259:47;27323:78;27396:4;27387:6;27323:78;:::i;:::-;27315:86;;27213:195;;;;:::o;27414:307::-;;27562:2;27551:9;27547:18;27539:26;;27611:9;27605:4;27601:20;27597:1;27586:9;27582:17;27575:47;27639:75;27709:4;27700:6;27639:75;:::i;:::-;27631:83;;27529:192;;;;:::o;27727:419::-;;27931:2;27920:9;27916:18;27908:26;;27980:9;27974:4;27970:20;27966:1;27955:9;27951:17;27944:47;28008:131;28134:4;28008:131;:::i;:::-;28000:139;;27898:248;;;:::o;28152:419::-;;28356:2;28345:9;28341:18;28333:26;;28405:9;28399:4;28395:20;28391:1;28380:9;28376:17;28369:47;28433:131;28559:4;28433:131;:::i;:::-;28425:139;;28323:248;;;:::o;28577:419::-;;28781:2;28770:9;28766:18;28758:26;;28830:9;28824:4;28820:20;28816:1;28805:9;28801:17;28794:47;28858:131;28984:4;28858:131;:::i;:::-;28850:139;;28748:248;;;:::o;29002:419::-;;29206:2;29195:9;29191:18;29183:26;;29255:9;29249:4;29245:20;29241:1;29230:9;29226:17;29219:47;29283:131;29409:4;29283:131;:::i;:::-;29275:139;;29173:248;;;:::o;29427:419::-;;29631:2;29620:9;29616:18;29608:26;;29680:9;29674:4;29670:20;29666:1;29655:9;29651:17;29644:47;29708:131;29834:4;29708:131;:::i;:::-;29700:139;;29598:248;;;:::o;29852:419::-;;30056:2;30045:9;30041:18;30033:26;;30105:9;30099:4;30095:20;30091:1;30080:9;30076:17;30069:47;30133:131;30259:4;30133:131;:::i;:::-;30125:139;;30023:248;;;:::o;30277:419::-;;30481:2;30470:9;30466:18;30458:26;;30530:9;30524:4;30520:20;30516:1;30505:9;30501:17;30494:47;30558:131;30684:4;30558:131;:::i;:::-;30550:139;;30448:248;;;:::o;30702:419::-;;30906:2;30895:9;30891:18;30883:26;;30955:9;30949:4;30945:20;30941:1;30930:9;30926:17;30919:47;30983:131;31109:4;30983:131;:::i;:::-;30975:139;;30873:248;;;:::o;31127:419::-;;31331:2;31320:9;31316:18;31308:26;;31380:9;31374:4;31370:20;31366:1;31355:9;31351:17;31344:47;31408:131;31534:4;31408:131;:::i;:::-;31400:139;;31298:248;;;:::o;31552:419::-;;31756:2;31745:9;31741:18;31733:26;;31805:9;31799:4;31795:20;31791:1;31780:9;31776:17;31769:47;31833:131;31959:4;31833:131;:::i;:::-;31825:139;;31723:248;;;:::o;31977:419::-;;32181:2;32170:9;32166:18;32158:26;;32230:9;32224:4;32220:20;32216:1;32205:9;32201:17;32194:47;32258:131;32384:4;32258:131;:::i;:::-;32250:139;;32148:248;;;:::o;32402:419::-;;32606:2;32595:9;32591:18;32583:26;;32655:9;32649:4;32645:20;32641:1;32630:9;32626:17;32619:47;32683:131;32809:4;32683:131;:::i;:::-;32675:139;;32573:248;;;:::o;32827:419::-;;33031:2;33020:9;33016:18;33008:26;;33080:9;33074:4;33070:20;33066:1;33055:9;33051:17;33044:47;33108:131;33234:4;33108:131;:::i;:::-;33100:139;;32998:248;;;:::o;33252:419::-;;33456:2;33445:9;33441:18;33433:26;;33505:9;33499:4;33495:20;33491:1;33480:9;33476:17;33469:47;33533:131;33659:4;33533:131;:::i;:::-;33525:139;;33423:248;;;:::o;33677:419::-;;33881:2;33870:9;33866:18;33858:26;;33930:9;33924:4;33920:20;33916:1;33905:9;33901:17;33894:47;33958:131;34084:4;33958:131;:::i;:::-;33950:139;;33848:248;;;:::o;34102:419::-;;34306:2;34295:9;34291:18;34283:26;;34355:9;34349:4;34345:20;34341:1;34330:9;34326:17;34319:47;34383:131;34509:4;34383:131;:::i;:::-;34375:139;;34273:248;;;:::o;34527:419::-;;34731:2;34720:9;34716:18;34708:26;;34780:9;34774:4;34770:20;34766:1;34755:9;34751:17;34744:47;34808:131;34934:4;34808:131;:::i;:::-;34800:139;;34698:248;;;:::o;34952:419::-;;35156:2;35145:9;35141:18;35133:26;;35205:9;35199:4;35195:20;35191:1;35180:9;35176:17;35169:47;35233:131;35359:4;35233:131;:::i;:::-;35225:139;;35123:248;;;:::o;35377:419::-;;35581:2;35570:9;35566:18;35558:26;;35630:9;35624:4;35620:20;35616:1;35605:9;35601:17;35594:47;35658:131;35784:4;35658:131;:::i;:::-;35650:139;;35548:248;;;:::o;35802:419::-;;36006:2;35995:9;35991:18;35983:26;;36055:9;36049:4;36045:20;36041:1;36030:9;36026:17;36019:47;36083:131;36209:4;36083:131;:::i;:::-;36075:139;;35973:248;;;:::o;36227:419::-;;36431:2;36420:9;36416:18;36408:26;;36480:9;36474:4;36470:20;36466:1;36455:9;36451:17;36444:47;36508:131;36634:4;36508:131;:::i;:::-;36500:139;;36398:248;;;:::o;36652:419::-;;36856:2;36845:9;36841:18;36833:26;;36905:9;36899:4;36895:20;36891:1;36880:9;36876:17;36869:47;36933:131;37059:4;36933:131;:::i;:::-;36925:139;;36823:248;;;:::o;37077:419::-;;37281:2;37270:9;37266:18;37258:26;;37330:9;37324:4;37320:20;37316:1;37305:9;37301:17;37294:47;37358:131;37484:4;37358:131;:::i;:::-;37350:139;;37248:248;;;:::o;37502:419::-;;37706:2;37695:9;37691:18;37683:26;;37755:9;37749:4;37745:20;37741:1;37730:9;37726:17;37719:47;37783:131;37909:4;37783:131;:::i;:::-;37775:139;;37673:248;;;:::o;37927:419::-;;38131:2;38120:9;38116:18;38108:26;;38180:9;38174:4;38170:20;38166:1;38155:9;38151:17;38144:47;38208:131;38334:4;38208:131;:::i;:::-;38200:139;;38098:248;;;:::o;38352:419::-;;38556:2;38545:9;38541:18;38533:26;;38605:9;38599:4;38595:20;38591:1;38580:9;38576:17;38569:47;38633:131;38759:4;38633:131;:::i;:::-;38625:139;;38523:248;;;:::o;38777:419::-;;38981:2;38970:9;38966:18;38958:26;;39030:9;39024:4;39020:20;39016:1;39005:9;39001:17;38994:47;39058:131;39184:4;39058:131;:::i;:::-;39050:139;;38948:248;;;:::o;39202:419::-;;39406:2;39395:9;39391:18;39383:26;;39455:9;39449:4;39445:20;39441:1;39430:9;39426:17;39419:47;39483:131;39609:4;39483:131;:::i;:::-;39475:139;;39373:248;;;:::o;39627:419::-;;39831:2;39820:9;39816:18;39808:26;;39880:9;39874:4;39870:20;39866:1;39855:9;39851:17;39844:47;39908:131;40034:4;39908:131;:::i;:::-;39900:139;;39798:248;;;:::o;40052:419::-;;40256:2;40245:9;40241:18;40233:26;;40305:9;40299:4;40295:20;40291:1;40280:9;40276:17;40269:47;40333:131;40459:4;40333:131;:::i;:::-;40325:139;;40223:248;;;:::o;40477:419::-;;40681:2;40670:9;40666:18;40658:26;;40730:9;40724:4;40720:20;40716:1;40705:9;40701:17;40694:47;40758:131;40884:4;40758:131;:::i;:::-;40750:139;;40648:248;;;:::o;40902:419::-;;41106:2;41095:9;41091:18;41083:26;;41155:9;41149:4;41145:20;41141:1;41130:9;41126:17;41119:47;41183:131;41309:4;41183:131;:::i;:::-;41175:139;;41073:248;;;:::o;41327:419::-;;41531:2;41520:9;41516:18;41508:26;;41580:9;41574:4;41570:20;41566:1;41555:9;41551:17;41544:47;41608:131;41734:4;41608:131;:::i;:::-;41600:139;;41498:248;;;:::o;41752:419::-;;41956:2;41945:9;41941:18;41933:26;;42005:9;41999:4;41995:20;41991:1;41980:9;41976:17;41969:47;42033:131;42159:4;42033:131;:::i;:::-;42025:139;;41923:248;;;:::o;42177:419::-;;42381:2;42370:9;42366:18;42358:26;;42430:9;42424:4;42420:20;42416:1;42405:9;42401:17;42394:47;42458:131;42584:4;42458:131;:::i;:::-;42450:139;;42348:248;;;:::o;42602:419::-;;42806:2;42795:9;42791:18;42783:26;;42855:9;42849:4;42845:20;42841:1;42830:9;42826:17;42819:47;42883:131;43009:4;42883:131;:::i;:::-;42875:139;;42773:248;;;:::o;43027:419::-;;43231:2;43220:9;43216:18;43208:26;;43280:9;43274:4;43270:20;43266:1;43255:9;43251:17;43244:47;43308:131;43434:4;43308:131;:::i;:::-;43300:139;;43198:248;;;:::o;43452:222::-;;43583:2;43572:9;43568:18;43560:26;;43596:71;43664:1;43653:9;43649:17;43640:6;43596:71;:::i;:::-;43550:124;;;;:::o;43680:278::-;;43746:2;43740:9;43730:19;;43788:4;43780:6;43776:17;43895:6;43883:10;43880:22;43859:18;43847:10;43844:34;43841:62;43838:2;;;43906:13;;:::i;:::-;43838:2;43941:10;43937:2;43930:22;43720:238;;;;:::o;43964:326::-;;44115:18;44107:6;44104:30;44101:2;;;44137:13;;:::i;:::-;44101:2;44217:4;44213:9;44206:4;44198:6;44194:17;44190:33;44182:41;;44278:4;44272;44268:15;44260:23;;44030:260;;;:::o;44296:327::-;;44448:18;44440:6;44437:30;44434:2;;;44470:13;;:::i;:::-;44434:2;44550:4;44546:9;44539:4;44531:6;44527:17;44523:33;44515:41;;44611:4;44605;44601:15;44593:23;;44363:260;;;:::o;44629:132::-;;44719:3;44711:11;;44749:4;44744:3;44740:14;44732:22;;44701:60;;;:::o;44767:141::-;;44839:3;44831:11;;44862:3;44859:1;44852:14;44896:4;44893:1;44883:18;44875:26;;44821:87;;;:::o;44914:114::-;;45015:5;45009:12;44999:22;;44988:40;;;:::o;45034:98::-;;45119:5;45113:12;45103:22;;45092:40;;;:::o;45138:99::-;;45224:5;45218:12;45208:22;;45197:40;;;:::o;45243:113::-;;45345:4;45340:3;45336:14;45328:22;;45318:38;;;:::o;45362:184::-;;45495:6;45490:3;45483:19;45535:4;45530:3;45526:14;45511:29;;45473:73;;;;:::o;45552:168::-;;45669:6;45664:3;45657:19;45709:4;45704:3;45700:14;45685:29;;45647:73;;;;:::o;45726:147::-;;45864:3;45849:18;;45839:34;;;;:::o;45879:169::-;;45997:6;45992:3;45985:19;46037:4;46032:3;46028:14;46013:29;;45975:73;;;;:::o;46054:148::-;;46193:3;46178:18;;46168:34;;;;:::o;46208:96::-;;46274:24;46292:5;46274:24;:::i;:::-;46263:35;;46253:51;;;:::o;46310:104::-;;46384:24;46402:5;46384:24;:::i;:::-;46373:35;;46363:51;;;:::o;46420:90::-;;46497:5;46490:13;46483:21;46472:32;;46462:48;;;:::o;46516:149::-;;46592:66;46585:5;46581:78;46570:89;;46560:105;;;:::o;46671:126::-;;46748:42;46741:5;46737:54;46726:65;;46716:81;;;:::o;46803:77::-;;46869:5;46858:16;;46848:32;;;:::o;46886:134::-;;46977:37;47008:5;46977:37;:::i;:::-;46964:50;;46954:66;;;:::o;47026:126::-;;47109:37;47140:5;47109:37;:::i;:::-;47096:50;;47086:66;;;:::o;47158:113::-;;47241:24;47259:5;47241:24;:::i;:::-;47228:37;;47218:53;;;:::o;47277:154::-;47361:6;47356:3;47351;47338:30;47423:1;47414:6;47409:3;47405:16;47398:27;47328:103;;;:::o;47437:307::-;47505:1;47515:113;47529:6;47526:1;47523:13;47515:113;;;47614:1;47609:3;47605:11;47599:18;47595:1;47590:3;47586:11;47579:39;47551:2;47548:1;47544:10;47539:15;;47515:113;;;47646:6;47643:1;47640:13;47637:2;;;47726:1;47717:6;47712:3;47708:16;47701:27;47637:2;47486:258;;;;:::o;47750:48::-;47783:9;47804:102;;47896:2;47892:7;47887:2;47880:5;47876:14;47872:28;47862:38;;47852:54;;;:::o;47912:122::-;47985:24;48003:5;47985:24;:::i;:::-;47978:5;47975:35;47965:2;;48024:1;48021;48014:12;47965:2;47955:79;:::o;48040:138::-;48121:32;48147:5;48121:32;:::i;:::-;48114:5;48111:43;48101:2;;48168:1;48165;48158:12;48101:2;48091:87;:::o;48184:116::-;48254:21;48269:5;48254:21;:::i;:::-;48247:5;48244:32;48234:2;;48290:1;48287;48280:12;48234:2;48224:76;:::o;48306:120::-;48378:23;48395:5;48378:23;:::i;:::-;48371:5;48368:34;48358:2;;48416:1;48413;48406:12;48358:2;48348:78;:::o;48432:122::-;48505:24;48523:5;48505:24;:::i;:::-;48498:5;48495:35;48485:2;;48544:1;48541;48534:12;48485:2;48475:79;:::o
Swarm Source
ipfs://6d11cd4bd6bc4d6103d7014c1e613e31d5b92e7ce822223e82278cf0b260f201
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.