ERC-721
Overview
Max Total Supply
871 BABY
Holders
88
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 BABYLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BabyCoterie
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-01-18 */ // SPDX-License-Identifier: MIT // GO TO LINE 1979 TO SEE WHERE THE BABY CONTRACT STARTS // File: @openzeppelin/contracts/utils/Context.sol pragma solidity >=0.6.0 <0.8.8; /* * @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) { 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.8; /** * @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.8; /** * @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.8; /** * @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.8; /** * @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.8; /** * @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.8; /** * @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.8; /** * @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.8; /** * @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.8; /** * @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.8; /** * @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.8; /** * @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.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128. * * Does not support burning tokens to address(0). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex = 0; uint256 internal immutable collectionSize; uint256 internal immutable maxBatchSize; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev * `maxBatchSize` refers to how much a minter can mint at a time. * `collectionSize_` refers to how many tokens are in the collection. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_, uint256 collectionSize_ ) { require( collectionSize_ > 0, "ERC721A: collection must have a nonzero supply" ); require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; collectionSize = collectionSize_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get token of owner by index"); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721A: balance query for the zero address"); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); uint256 lowestTokenToCheck; if (tokenId >= maxBatchSize) { lowestTokenToCheck = tokenId - maxBatchSize + 1; } for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } revert("ERC721A: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721A: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: 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 override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: 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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - there must be `quantity` tokens remaining unminted in the total collection. * - `to` cannot be the zero address. * - `quantity` cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the zero address"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > collectionSize - 1) { endIndex = collectionSize - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721A: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity >=0.6.0 <0.8.8; /** * @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; } } // Baby Coterie // Art by ebbanosen pragma solidity ^0.8.0; pragma abicoder v2; contract BabyCoterie is ERC721A, Ownable { using SafeMath for uint256; string public BABY_PROVENANCE = ""; // IPFS URL WILL BE ADDED WHEN BABIES 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 babyPrice = 20000000000000000; // 0.02 ETH uint public constant maxBabyPurchase = 20; uint public freeBabiesClaimed = 0; uint256 public constant MAX_BABIES = 10000; bool public saleIsActive = false; bool public whitelistSaleIsActive = false; bool public uriIsFrozen = false; bool public bypassMintLimit = false; address public constant ADDRESS_DEV = 0x7DF76FDEedE91d3cB80e4a86158dD9f6D206c98E; address public constant ADDRESS_ART = 0xE1F04a8e7609482B0A96a4636bb2d0211e3A4fF9; address public ADDRESS_TEAM = 0x0709C9feEeA75ad21153808fB0094a3aE2F44e94; mapping(address => bool) blacklistedAddresses; event licenseisLocked(string _licenseText); constructor() ERC721A("Baby Coterie", "BABY", 20, 10000) { } function withdraw() public { uint balance = address(this).balance; uint dev_cut = balance/20; uint art_cut = balance/10; payable(ADDRESS_DEV).transfer(dev_cut); payable(ADDRESS_ART).transfer(art_cut); payable(ADDRESS_TEAM).transfer(address(this).balance); } function setProvenanceHash(string memory provenanceHash) public onlyOwner { BABY_PROVENANCE = provenanceHash; } function setBabyPrice(uint256 _babyPrice) public onlyOwner { babyPrice = _babyPrice; } string private _baseTokenURI; function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string calldata baseURI) external onlyOwner { require(uriIsFrozen == false, "The BaseURI has been frozen and can not be changed."); _baseTokenURI = baseURI; } function freezeBaseURI() public onlyOwner { require(uriIsFrozen == false, "The BaseURI has already been frozen."); uriIsFrozen = true; } function flipSaleState() public onlyOwner { saleIsActive = !saleIsActive; } function flipBypassMintLimit() public onlyOwner { bypassMintLimit = !bypassMintLimit; } function flipWhitelistSaleState() public onlyOwner { whitelistSaleIsActive = !whitelistSaleIsActive; } function setTeamAddress(address teamAddress) public onlyOwner { ADDRESS_TEAM = teamAddress; } 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(uint _id) public view returns(string memory) { require(_id < totalSupply(), "CHOOSE A BABY 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 publicMintBaby(uint numberOfTokens) public payable { require(saleIsActive, "Sale must be active to mint a Baby"); require(numberOfTokens > 0 && numberOfTokens <= maxBabyPurchase, "Can only mint 20 tokens at a time"); //Reserved for OG whitelist require(totalSupply().add(numberOfTokens) <= MAX_BABIES-300 || bypassMintLimit == true, "Purchase would exceed max supply of Babies, 300 are reserved for the team"); require(totalSupply().add(numberOfTokens) <= MAX_BABIES, "Purchase would exceed max supply of Babies" ); require(msg.value >= babyPrice.mul(numberOfTokens), "Ether value sent is not correct"); _safeMint(msg.sender, numberOfTokens); } function ownerMintBaby(address _receiver, uint numberOfTokens) public onlyOwner { require(totalSupply().add(numberOfTokens) <= MAX_BABIES, "Minting would exceed max supply of Babies" ); _safeMint(_receiver, numberOfTokens); } function whitelistMintBaby() public { require(blacklistedAddresses[msg.sender] == false, "You have already minted your free baby"); require(whitelistSaleIsActive, "Sale must be active to mint a Baby"); require(totalSupply().add(1) <= MAX_BABIES, "Purchase would exceed max supply of Babies"); require(freeBabiesClaimed < 750, "All 750 free babies have already been minted"); _safeMint(msg.sender,1); blacklistedAddresses[msg.sender] = true; freeBabiesClaimed++; } }
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":"string","name":"_licenseText","type":"string"}],"name":"licenseisLocked","type":"event"},{"inputs":[],"name":"ADDRESS_ART","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ADDRESS_DEV","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ADDRESS_TEAM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BABY_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LICENSE_TEXT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BABIES","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":[],"name":"babyPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bypassMintLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_license","type":"string"}],"name":"changeLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipBypassMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipWhitelistSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeBabiesClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freezeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxBabyPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"ownerMintBaby","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"publicMintBaby","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_babyPrice","type":"uint256"}],"name":"setBabyPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"teamAddress","type":"address"}],"name":"setTeamAddress","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":"uriIsFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMintBaby","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040526000600155600060085560405180602001604052806000815250600a9080519060200190620000359291906200044a565b5060405180602001604052806000815250600b90805190602001906200005d9291906200044a565b506000600c60006101000a81548160ff02191690831515021790555066470de4df820000600d556000600e556000600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff0219169083151502179055506000600f60026101000a81548160ff0219169083151502179055506000600f60036101000a81548160ff021916908315150217905550730709c9feeea75ad21153808fb0094a3ae2f44e94600f60046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200015757600080fd5b506040518060400160405280600c81526020017f4261627920436f746572696500000000000000000000000000000000000000008152506040518060400160405280600481526020017f42414259000000000000000000000000000000000000000000000000000000008152506014612710620001e16301ffc9a760e01b6200036a60201b60201c565b6000811162000227576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200021e90620005b3565b60405180910390fd5b600082116200026d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002649062000591565b60405180910390fd5b8360029080519060200190620002859291906200044a565b5082600390805190602001906200029e9291906200044a565b508160a081815250508060808181525050505050506000620002c56200044260201b60201c565b905080600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35062000712565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620003d6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003cd906200056f565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b8280546200045890620005e6565b90600052602060002090601f0160209004810192826200047c5760008555620004c8565b82601f106200049757805160ff1916838001178555620004c8565b82800160010185558215620004c8579182015b82811115620004c7578251825591602001919060010190620004aa565b5b509050620004d79190620004db565b5090565b5b80821115620004f6576000816000905550600101620004dc565b5090565b600062000509601c83620005d5565b915062000516826200064b565b602082019050919050565b600062000530602783620005d5565b91506200053d8262000674565b604082019050919050565b600062000557602e83620005d5565b91506200056482620006c3565b604082019050919050565b600060208201905081810360008301526200058a81620004fa565b9050919050565b60006020820190508181036000830152620005ac8162000521565b9050919050565b60006020820190508181036000830152620005ce8162000548565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620005ff57607f821691505b602082108114156200061657620006156200061c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4552433136353a20696e76616c696420696e7465726661636520696400000000600082015250565b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b60805160a051615dee620007436000396000818161319f015281816131c80152613827015260005050615dee6000f3fe6080604052600436106102ae5760003560e01c8063715018a611610175578063b88d4fde116100dc578063d7224ba011610095578063e985e9c51161006f578063e985e9c514610a1f578063eb8d244414610a5c578063f2fde38b14610a87578063ffe4760b14610ab0576102ae565b8063d7224ba0146109a0578063d9b137b2146109cb578063e7bc820814610a08576102ae565b8063b88d4fde146108ca578063bf4702fc146108f3578063c87b56dd1461090a578063d1beca6414610947578063d21354441461095e578063d56d7ff114610989576102ae565b80639c3e72bd1161012e5780639c3e72bd146107cc578063a0021918146107f7578063a22cb46514610822578063b09904b51461084b578063b105a3d114610874578063b749b7391461089f576102ae565b8063715018a6146106db5780637adc794f146106f25780638462151c1461070e5780638612bbbc1461074b5780638da5cb5b1461077657806395d89b41146107a1576102ae565b80632f745c59116102195780634cc647e5116101d25780634cc647e5146105a95780634f6ccce7146105d257806355f804b31461060f5780636352211e146106385780636690864e1461067557806370a082311461069e576102ae565b80632f745c59146104d357806334918dfd146105105780633ccfd60b146105275780633dc464d61461053e57806342842e0e14610569578063445064e114610592576102ae565b806318160ddd1161026b57806318160ddd146103d55780631a0e96b3146104005780631e837a7f1461042b578063206855ea1461045657806323b872dd1461047f57806328cd8e68146104a8576102ae565b806301ffc9a7146102b357806306fdde03146102f0578063081812fc1461031b578063095ea7b314610358578063109695231461038157806310b5454d146103aa575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d59190614129565b610adb565b6040516102e7919061496e565b60405180910390f35b3480156102fc57600080fd5b50610305610c25565b6040516103129190614989565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190614219565b610cb7565b60405161034f91906148e5565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a91906140e9565b610d3c565b005b34801561038d57600080fd5b506103a860048036038101906103a391906141d0565b610e55565b005b3480156103b657600080fd5b506103bf610eeb565b6040516103cc919061496e565b60405180910390f35b3480156103e157600080fd5b506103ea610efe565b6040516103f79190614e0d565b60405180910390f35b34801561040c57600080fd5b50610415610f08565b60405161042291906148e5565b60405180910390f35b34801561043757600080fd5b50610440610f20565b60405161044d9190614e0d565b60405180910390f35b34801561046257600080fd5b5061047d600480360381019061047891906140e9565b610f26565b005b34801561048b57600080fd5b506104a660048036038101906104a19190613fd3565b61100e565b005b3480156104b457600080fd5b506104bd61101e565b6040516104ca919061496e565b60405180910390f35b3480156104df57600080fd5b506104fa60048036038101906104f591906140e9565b611031565b6040516105079190614e0d565b60405180910390f35b34801561051c57600080fd5b5061052561122f565b005b34801561053357600080fd5b5061053c6112d7565b005b34801561054a57600080fd5b50610553611422565b604051610560919061496e565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b9190613fd3565b611435565b005b34801561059e57600080fd5b506105a7611455565b005b3480156105b557600080fd5b506105d060048036038101906105cb9190614219565b6114fd565b005b3480156105de57600080fd5b506105f960048036038101906105f49190614219565b611583565b6040516106069190614e0d565b60405180910390f35b34801561061b57600080fd5b5061063660048036038101906106319190614183565b6115d6565b005b34801561064457600080fd5b5061065f600480360381019061065a9190614219565b6116be565b60405161066c91906148e5565b60405180910390f35b34801561068157600080fd5b5061069c60048036038101906106979190613f66565b6116d4565b005b3480156106aa57600080fd5b506106c560048036038101906106c09190613f66565b611794565b6040516106d29190614e0d565b60405180910390f35b3480156106e757600080fd5b506106f061187d565b005b61070c60048036038101906107079190614219565b6119ba565b005b34801561071a57600080fd5b5061073560048036038101906107309190613f66565b611ba4565b604051610742919061494c565b60405180910390f35b34801561075757600080fd5b50610760611cae565b60405161076d91906148e5565b60405180910390f35b34801561078257600080fd5b5061078b611cd4565b60405161079891906148e5565b60405180910390f35b3480156107ad57600080fd5b506107b6611cfe565b6040516107c39190614989565b60405180910390f35b3480156107d857600080fd5b506107e1611d90565b6040516107ee9190614989565b60405180910390f35b34801561080357600080fd5b5061080c611e1e565b60405161081991906148e5565b60405180910390f35b34801561082e57600080fd5b50610849600480360381019061084491906140a9565b611e36565b005b34801561085757600080fd5b50610872600480360381019061086d91906141d0565b611fb7565b005b34801561088057600080fd5b506108896120a3565b6040516108969190614e0d565b60405180910390f35b3480156108ab57600080fd5b506108b46120a8565b6040516108c19190614e0d565b60405180910390f35b3480156108d657600080fd5b506108f160048036038101906108ec9190614026565b6120ae565b005b3480156108ff57600080fd5b5061090861210a565b005b34801561091657600080fd5b50610931600480360381019061092c9190614219565b6121db565b60405161093e9190614989565b60405180910390f35b34801561095357600080fd5b5061095c612282565b005b34801561096a57600080fd5b5061097361232a565b6040516109809190614989565b60405180910390f35b34801561099557600080fd5b5061099e6123b8565b005b3480156109ac57600080fd5b506109b56125bc565b6040516109c29190614e0d565b60405180910390f35b3480156109d757600080fd5b506109f260048036038101906109ed9190614219565b6125c2565b6040516109ff9190614989565b60405180910390f35b348015610a1457600080fd5b50610a1d61269f565b005b348015610a2b57600080fd5b50610a466004803603810190610a419190613f93565b61278e565b604051610a53919061496e565b60405180910390f35b348015610a6857600080fd5b50610a71612822565b604051610a7e919061496e565b60405180910390f35b348015610a9357600080fd5b50610aae6004803603810190610aa99190613f66565b612835565b005b348015610abc57600080fd5b50610ac56129e1565b604051610ad29190614e0d565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ba657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c0e57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c1e5750610c1d826129e7565b5b9050919050565b606060028054610c34906151cb565b80601f0160208091040260200160405190810160405280929190818152602001828054610c60906151cb565b8015610cad5780601f10610c8257610100808354040283529160200191610cad565b820191906000526020600020905b815481529060010190602001808311610c9057829003601f168201915b5050505050905090565b6000610cc282612a4e565b610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf890614dcd565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d47826116be565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610db8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610daf90614cad565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dd7612a5c565b73ffffffffffffffffffffffffffffffffffffffff161480610e065750610e0581610e00612a5c565b61278e565b5b610e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3c90614b4d565b60405180910390fd5b610e50838383612a64565b505050565b610e5d612a5c565b73ffffffffffffffffffffffffffffffffffffffff16610e7b611cd4565b73ffffffffffffffffffffffffffffffffffffffff1614610ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec890614c0d565b60405180910390fd5b80600a9080519060200190610ee7929190613c64565b5050565b600f60019054906101000a900460ff1681565b6000600154905090565b73e1f04a8e7609482b0a96a4636bb2d0211e3a4ff981565b600e5481565b610f2e612a5c565b73ffffffffffffffffffffffffffffffffffffffff16610f4c611cd4565b73ffffffffffffffffffffffffffffffffffffffff1614610fa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9990614c0d565b60405180910390fd5b612710610fbf82610fb1610efe565b612b1690919063ffffffff16565b1115611000576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff790614aed565b60405180910390fd5b61100a8282612b74565b5050565b611019838383612b92565b505050565b600f60039054906101000a900460ff1681565b600061103c83611794565b821061107d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611074906149cd565b60405180910390fd5b6000611087610efe565b905060008060005b838110156111ed576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461118157806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156111d957868414156111ca578195505050505050611229565b83806111d59061522e565b9450505b5080806111e59061522e565b91505061108f565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122090614d6d565b60405180910390fd5b92915050565b611237612a5c565b73ffffffffffffffffffffffffffffffffffffffff16611255611cd4565b73ffffffffffffffffffffffffffffffffffffffff16146112ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a290614c0d565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600047905060006014826112eb9190614fdc565b90506000600a836112fc9190614fdc565b9050737df76fdeede91d3cb80e4a86158dd9f6d206c98e73ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611358573d6000803e3d6000fd5b5073e1f04a8e7609482b0a96a4636bb2d0211e3a4ff973ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156113b3573d6000803e3d6000fd5b50600f60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561141c573d6000803e3d6000fd5b50505050565b600f60029054906101000a900460ff1681565b611450838383604051806020016040528060008152506120ae565b505050565b61145d612a5c565b73ffffffffffffffffffffffffffffffffffffffff1661147b611cd4565b73ffffffffffffffffffffffffffffffffffffffff16146114d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c890614c0d565b60405180910390fd5b600f60039054906101000a900460ff1615600f60036101000a81548160ff021916908315150217905550565b611505612a5c565b73ffffffffffffffffffffffffffffffffffffffff16611523611cd4565b73ffffffffffffffffffffffffffffffffffffffff1614611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090614c0d565b60405180910390fd5b80600d8190555050565b600061158d610efe565b82106115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c590614a6d565b60405180910390fd5b819050919050565b6115de612a5c565b73ffffffffffffffffffffffffffffffffffffffff166115fc611cd4565b73ffffffffffffffffffffffffffffffffffffffff1614611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164990614c0d565b60405180910390fd5b60001515600f60029054906101000a900460ff161515146116a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169f90614b6d565b60405180910390fd5b8181601191906116b9929190613cea565b505050565b60006116c98261314b565b600001519050919050565b6116dc612a5c565b73ffffffffffffffffffffffffffffffffffffffff166116fa611cd4565b73ffffffffffffffffffffffffffffffffffffffff1614611750576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174790614c0d565b60405180910390fd5b80600f60046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fc90614bad565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611885612a5c565b73ffffffffffffffffffffffffffffffffffffffff166118a3611cd4565b73ffffffffffffffffffffffffffffffffffffffff16146118f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f090614c0d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600f60009054906101000a900460ff16611a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a00906149ed565b60405180910390fd5b600081118015611a1a575060148111155b611a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5090614acd565b60405180910390fd5b61012c612710611a69919061509b565b611a8382611a75610efe565b612b1690919063ffffffff16565b111580611aa3575060011515600f60039054906101000a900460ff161515145b611ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad990614b2d565b60405180910390fd5b612710611aff82611af1610efe565b612b1690919063ffffffff16565b1115611b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3790614b0d565b60405180910390fd5b611b5581600d5461334e90919063ffffffff16565b341015611b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8e90614aad565b60405180910390fd5b611ba13382612b74565b50565b60606000611bb183611794565b90506000811415611c0e57600067ffffffffffffffff811115611bd757611bd6615364565b5b604051908082528060200260200182016040528015611c055781602001602082028036833780820191505090505b50915050611ca9565b60008167ffffffffffffffff811115611c2a57611c29615364565b5b604051908082528060200260200182016040528015611c585781602001602082028036833780820191505090505b50905060005b82811015611ca257611c708582611031565b828281518110611c8357611c82615335565b5b6020026020010181815250508080611c9a9061522e565b915050611c5e565b8193505050505b919050565b600f60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611d0d906151cb565b80601f0160208091040260200160405190810160405280929190818152602001828054611d39906151cb565b8015611d865780601f10611d5b57610100808354040283529160200191611d86565b820191906000526020600020905b815481529060010190602001808311611d6957829003601f168201915b5050505050905090565b600b8054611d9d906151cb565b80601f0160208091040260200160405190810160405280929190818152602001828054611dc9906151cb565b8015611e165780601f10611deb57610100808354040283529160200191611e16565b820191906000526020600020905b815481529060010190602001808311611df957829003601f168201915b505050505081565b737df76fdeede91d3cb80e4a86158dd9f6d206c98e81565b611e3e612a5c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea390614c4d565b60405180910390fd5b8060076000611eb9612a5c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f66612a5c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fab919061496e565b60405180910390a35050565b611fbf612a5c565b73ffffffffffffffffffffffffffffffffffffffff16611fdd611cd4565b73ffffffffffffffffffffffffffffffffffffffff1614612033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202a90614c0d565b60405180910390fd5b60001515600c60009054906101000a900460ff16151514612089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208090614ccd565b60405180910390fd5b80600b908051906020019061209f929190613c64565b5050565b601481565b61271081565b6120b9848484612b92565b6120c5848484846133c9565b612104576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fb90614d0d565b60405180910390fd5b50505050565b612112612a5c565b73ffffffffffffffffffffffffffffffffffffffff16612130611cd4565b73ffffffffffffffffffffffffffffffffffffffff1614612186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217d90614c0d565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055507f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b0600b6040516121d191906149ab565b60405180910390a1565b60606121e682612a4e565b612225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221c90614c2d565b60405180910390fd5b600061222f613560565b9050600081511161224f576040518060200160405280600081525061227a565b80612259846135f2565b60405160200161226a9291906148c1565b6040516020818303038152906040525b915050919050565b61228a612a5c565b73ffffffffffffffffffffffffffffffffffffffff166122a8611cd4565b73ffffffffffffffffffffffffffffffffffffffff16146122fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f590614c0d565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b600a8054612337906151cb565b80601f0160208091040260200160405190810160405280929190818152602001828054612363906151cb565b80156123b05780601f10612385576101008083540402835291602001916123b0565b820191906000526020600020905b81548152906001019060200180831161239357829003601f168201915b505050505081565b60001515601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461244b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244290614ced565b60405180910390fd5b600f60019054906101000a900460ff1661249a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612491906149ed565b60405180910390fd5b6127106124b860016124aa610efe565b612b1690919063ffffffff16565b11156124f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f090614b0d565b60405180910390fd5b6102ee600e541061253f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253690614c8d565b60405180910390fd5b61254a336001612b74565b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600e60008154809291906125b59061522e565b9190505550565b60085481565b60606125cc610efe565b821061260d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260490614dad565b60405180910390fd5b600b805461261a906151cb565b80601f0160208091040260200160405190810160405280929190818152602001828054612646906151cb565b80156126935780601f1061266857610100808354040283529160200191612693565b820191906000526020600020905b81548152906001019060200180831161267657829003601f168201915b50505050509050919050565b6126a7612a5c565b73ffffffffffffffffffffffffffffffffffffffff166126c5611cd4565b73ffffffffffffffffffffffffffffffffffffffff161461271b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271290614c0d565b60405180910390fd5b60001515600f60029054906101000a900460ff16151514612771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276890614b8d565b60405180910390fd5b6001600f60026101000a81548160ff021916908315150217905550565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f60009054906101000a900460ff1681565b61283d612a5c565b73ffffffffffffffffffffffffffffffffffffffff1661285b611cd4565b73ffffffffffffffffffffffffffffffffffffffff16146128b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a890614c0d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291890614a0d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d5481565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000808284612b259190614f86565b905083811015612b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6190614a4d565b60405180910390fd5b8091505092915050565b612b8e828260405180602001604052806000815250613765565b5050565b6000612b9d8261314b565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612bc4612a5c565b73ffffffffffffffffffffffffffffffffffffffff161480612c205750612be9612a5c565b73ffffffffffffffffffffffffffffffffffffffff16612c0884610cb7565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c3c5750612c3b8260000151612c36612a5c565b61278e565b5b905080612c7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7590614c6d565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce790614bed565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612d60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5790614a8d565b60405180910390fd5b612d6d8585856001613c45565b612d7d6000848460000151612a64565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612deb9190615067565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612e8f9190614f40565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612f959190614f86565b9050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156130db5761300b81612a4e565b156130da576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506004600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131438686866001613c4b565b505050505050565b613153613d70565b61315c82612a4e565b61319b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319290614a2d565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106131ff5760017f0000000000000000000000000000000000000000000000000000000000000000846131f2919061509b565b6131fc9190614f86565b90505b60008390505b81811061330d576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146132f957809350505050613349565b508080613305906151a1565b915050613205565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334090614d8d565b60405180910390fd5b919050565b60008083141561336157600090506133c3565b6000828461336f919061500d565b905082848261337e9190614fdc565b146133be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b590614bcd565b60405180910390fd5b809150505b92915050565b60006133ea8473ffffffffffffffffffffffffffffffffffffffff16613c51565b15613553578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613413612a5c565b8786866040518563ffffffff1660e01b81526004016134359493929190614900565b602060405180830381600087803b15801561344f57600080fd5b505af192505050801561348057506040513d601f19601f8201168201806040525081019061347d9190614156565b60015b613503573d80600081146134b0576040519150601f19603f3d011682016040523d82523d6000602084013e6134b5565b606091505b506000815114156134fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f290614d0d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613558565b600190505b949350505050565b60606011805461356f906151cb565b80601f016020809104026020016040519081016040528092919081815260200182805461359b906151cb565b80156135e85780601f106135bd576101008083540402835291602001916135e8565b820191906000526020600020905b8154815290600101906020018083116135cb57829003601f168201915b5050505050905090565b6060600082141561363a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613760565b600082905060005b6000821461366c5780806136559061522e565b915050600a826136659190614fdc565b9150613642565b60008167ffffffffffffffff81111561368857613687615364565b5b6040519080825280601f01601f1916602001820160405280156136ba5781602001600182028036833780820191505090505b50905060006001836136cc919061509b565b90508593505b6000841461375857600a846136e79190615277565b60306136f39190614f86565b60f81b828280613702906151a1565b93508151811061371557613714615335565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a846137519190614fdc565b93506136d2565b819450505050505b919050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156137dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137d390614d4d565b60405180910390fd5b6137e581612a4e565b15613825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161381c90614d2d565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000831115613888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161387f90614ded565b60405180910390fd5b6138956000858386613c45565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516139929190614f40565b6fffffffffffffffffffffffffffffffff1681526020018583602001516139b99190614f40565b6fffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015613c2857818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613bc860008884886133c9565b613c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bfe90614d0d565b60405180910390fd5b8180613c129061522e565b9250508080613c209061522e565b915050613b57565b5080600181905550613c3d6000878588613c4b565b505050505050565b50505050565b50505050565b600080823b905060008111915050919050565b828054613c70906151cb565b90600052602060002090601f016020900481019282613c925760008555613cd9565b82601f10613cab57805160ff1916838001178555613cd9565b82800160010185558215613cd9579182015b82811115613cd8578251825591602001919060010190613cbd565b5b509050613ce69190613daa565b5090565b828054613cf6906151cb565b90600052602060002090601f016020900481019282613d185760008555613d5f565b82601f10613d3157803560ff1916838001178555613d5f565b82800160010185558215613d5f579182015b82811115613d5e578235825591602001919060010190613d43565b5b509050613d6c9190613daa565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613dc3576000816000905550600101613dab565b5090565b6000613dda613dd584614e4d565b614e28565b905082815260208101848484011115613df657613df56153a2565b5b613e0184828561515f565b509392505050565b6000613e1c613e1784614e7e565b614e28565b905082815260208101848484011115613e3857613e376153a2565b5b613e4384828561515f565b509392505050565b600081359050613e5a81615d5c565b92915050565b600081359050613e6f81615d73565b92915050565b600081359050613e8481615d8a565b92915050565b600081519050613e9981615d8a565b92915050565b600082601f830112613eb457613eb3615398565b5b8135613ec4848260208601613dc7565b91505092915050565b60008083601f840112613ee357613ee2615398565b5b8235905067ffffffffffffffff811115613f0057613eff615393565b5b602083019150836001820283011115613f1c57613f1b61539d565b5b9250929050565b600082601f830112613f3857613f37615398565b5b8135613f48848260208601613e09565b91505092915050565b600081359050613f6081615da1565b92915050565b600060208284031215613f7c57613f7b6153ac565b5b6000613f8a84828501613e4b565b91505092915050565b60008060408385031215613faa57613fa96153ac565b5b6000613fb885828601613e4b565b9250506020613fc985828601613e4b565b9150509250929050565b600080600060608486031215613fec57613feb6153ac565b5b6000613ffa86828701613e4b565b935050602061400b86828701613e4b565b925050604061401c86828701613f51565b9150509250925092565b600080600080608085870312156140405761403f6153ac565b5b600061404e87828801613e4b565b945050602061405f87828801613e4b565b935050604061407087828801613f51565b925050606085013567ffffffffffffffff811115614091576140906153a7565b5b61409d87828801613e9f565b91505092959194509250565b600080604083850312156140c0576140bf6153ac565b5b60006140ce85828601613e4b565b92505060206140df85828601613e60565b9150509250929050565b60008060408385031215614100576140ff6153ac565b5b600061410e85828601613e4b565b925050602061411f85828601613f51565b9150509250929050565b60006020828403121561413f5761413e6153ac565b5b600061414d84828501613e75565b91505092915050565b60006020828403121561416c5761416b6153ac565b5b600061417a84828501613e8a565b91505092915050565b6000806020838503121561419a576141996153ac565b5b600083013567ffffffffffffffff8111156141b8576141b76153a7565b5b6141c485828601613ecd565b92509250509250929050565b6000602082840312156141e6576141e56153ac565b5b600082013567ffffffffffffffff811115614204576142036153a7565b5b61421084828501613f23565b91505092915050565b60006020828403121561422f5761422e6153ac565b5b600061423d84828501613f51565b91505092915050565b600061425283836148a3565b60208301905092915050565b614267816150cf565b82525050565b600061427882614ed4565b6142828185614f02565b935061428d83614eaf565b8060005b838110156142be5781516142a58882614246565b97506142b083614ef5565b925050600181019050614291565b5085935050505092915050565b6142d4816150e1565b82525050565b60006142e582614edf565b6142ef8185614f13565b93506142ff81856020860161516e565b614308816153b1565b840191505092915050565b600061431e82614eea565b6143288185614f24565b935061433881856020860161516e565b614341816153b1565b840191505092915050565b600061435782614eea565b6143618185614f35565b935061437181856020860161516e565b80840191505092915050565b6000815461438a816151cb565b6143948186614f24565b945060018216600081146143af57600181146143c1576143f4565b60ff19831686526020860193506143f4565b6143ca85614ebf565b60005b838110156143ec578154818901526001820191506020810190506143cd565b808801955050505b50505092915050565b600061440a602283614f24565b9150614415826153c2565b604082019050919050565b600061442d602283614f24565b915061443882615411565b604082019050919050565b6000614450602683614f24565b915061445b82615460565b604082019050919050565b6000614473602a83614f24565b915061447e826154af565b604082019050919050565b6000614496601b83614f24565b91506144a1826154fe565b602082019050919050565b60006144b9602383614f24565b91506144c482615527565b604082019050919050565b60006144dc602583614f24565b91506144e782615576565b604082019050919050565b60006144ff601f83614f24565b915061450a826155c5565b602082019050919050565b6000614522602183614f24565b915061452d826155ee565b604082019050919050565b6000614545602983614f24565b91506145508261563d565b604082019050919050565b6000614568602a83614f24565b91506145738261568c565b604082019050919050565b600061458b604983614f24565b9150614596826156db565b606082019050919050565b60006145ae603983614f24565b91506145b982615750565b604082019050919050565b60006145d1603383614f24565b91506145dc8261579f565b604082019050919050565b60006145f4602483614f24565b91506145ff826157ee565b604082019050919050565b6000614617602b83614f24565b91506146228261583d565b604082019050919050565b600061463a602183614f24565b91506146458261588c565b604082019050919050565b600061465d602683614f24565b9150614668826158db565b604082019050919050565b6000614680602083614f24565b915061468b8261592a565b602082019050919050565b60006146a3602f83614f24565b91506146ae82615953565b604082019050919050565b60006146c6601a83614f24565b91506146d1826159a2565b602082019050919050565b60006146e9603283614f24565b91506146f4826159cb565b604082019050919050565b600061470c602c83614f24565b915061471782615a1a565b604082019050919050565b600061472f602283614f24565b915061473a82615a69565b604082019050919050565b6000614752601683614f24565b915061475d82615ab8565b602082019050919050565b6000614775602683614f24565b915061478082615ae1565b604082019050919050565b6000614798603383614f24565b91506147a382615b30565b604082019050919050565b60006147bb601d83614f24565b91506147c682615b7f565b602082019050919050565b60006147de602183614f24565b91506147e982615ba8565b604082019050919050565b6000614801602e83614f24565b915061480c82615bf7565b604082019050919050565b6000614824602f83614f24565b915061482f82615c46565b604082019050919050565b6000614847601a83614f24565b915061485282615c95565b602082019050919050565b600061486a602d83614f24565b915061487582615cbe565b604082019050919050565b600061488d602283614f24565b915061489882615d0d565b604082019050919050565b6148ac81615155565b82525050565b6148bb81615155565b82525050565b60006148cd828561434c565b91506148d9828461434c565b91508190509392505050565b60006020820190506148fa600083018461425e565b92915050565b6000608082019050614915600083018761425e565b614922602083018661425e565b61492f60408301856148b2565b818103606083015261494181846142da565b905095945050505050565b60006020820190508181036000830152614966818461426d565b905092915050565b600060208201905061498360008301846142cb565b92915050565b600060208201905081810360008301526149a38184614313565b905092915050565b600060208201905081810360008301526149c5818461437d565b905092915050565b600060208201905081810360008301526149e6816143fd565b9050919050565b60006020820190508181036000830152614a0681614420565b9050919050565b60006020820190508181036000830152614a2681614443565b9050919050565b60006020820190508181036000830152614a4681614466565b9050919050565b60006020820190508181036000830152614a6681614489565b9050919050565b60006020820190508181036000830152614a86816144ac565b9050919050565b60006020820190508181036000830152614aa6816144cf565b9050919050565b60006020820190508181036000830152614ac6816144f2565b9050919050565b60006020820190508181036000830152614ae681614515565b9050919050565b60006020820190508181036000830152614b0681614538565b9050919050565b60006020820190508181036000830152614b268161455b565b9050919050565b60006020820190508181036000830152614b468161457e565b9050919050565b60006020820190508181036000830152614b66816145a1565b9050919050565b60006020820190508181036000830152614b86816145c4565b9050919050565b60006020820190508181036000830152614ba6816145e7565b9050919050565b60006020820190508181036000830152614bc68161460a565b9050919050565b60006020820190508181036000830152614be68161462d565b9050919050565b60006020820190508181036000830152614c0681614650565b9050919050565b60006020820190508181036000830152614c2681614673565b9050919050565b60006020820190508181036000830152614c4681614696565b9050919050565b60006020820190508181036000830152614c66816146b9565b9050919050565b60006020820190508181036000830152614c86816146dc565b9050919050565b60006020820190508181036000830152614ca6816146ff565b9050919050565b60006020820190508181036000830152614cc681614722565b9050919050565b60006020820190508181036000830152614ce681614745565b9050919050565b60006020820190508181036000830152614d0681614768565b9050919050565b60006020820190508181036000830152614d268161478b565b9050919050565b60006020820190508181036000830152614d46816147ae565b9050919050565b60006020820190508181036000830152614d66816147d1565b9050919050565b60006020820190508181036000830152614d86816147f4565b9050919050565b60006020820190508181036000830152614da681614817565b9050919050565b60006020820190508181036000830152614dc68161483a565b9050919050565b60006020820190508181036000830152614de68161485d565b9050919050565b60006020820190508181036000830152614e0681614880565b9050919050565b6000602082019050614e2260008301846148b2565b92915050565b6000614e32614e43565b9050614e3e82826151fd565b919050565b6000604051905090565b600067ffffffffffffffff821115614e6857614e67615364565b5b614e71826153b1565b9050602081019050919050565b600067ffffffffffffffff821115614e9957614e98615364565b5b614ea2826153b1565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f4b82615119565b9150614f5683615119565b9250826fffffffffffffffffffffffffffffffff03821115614f7b57614f7a6152a8565b5b828201905092915050565b6000614f9182615155565b9150614f9c83615155565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614fd157614fd06152a8565b5b828201905092915050565b6000614fe782615155565b9150614ff283615155565b925082615002576150016152d7565b5b828204905092915050565b600061501882615155565b915061502383615155565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561505c5761505b6152a8565b5b828202905092915050565b600061507282615119565b915061507d83615119565b9250828210156150905761508f6152a8565b5b828203905092915050565b60006150a682615155565b91506150b183615155565b9250828210156150c4576150c36152a8565b5b828203905092915050565b60006150da82615135565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561518c578082015181840152602081019050615171565b8381111561519b576000848401525b50505050565b60006151ac82615155565b915060008214156151c0576151bf6152a8565b5b600182039050919050565b600060028204905060018216806151e357607f821691505b602082108114156151f7576151f6615306565b5b50919050565b615206826153b1565b810181811067ffffffffffffffff8211171561522557615224615364565b5b80604052505050565b600061523982615155565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561526c5761526b6152a8565b5b600182019050919050565b600061528282615155565b915061528d83615155565b92508261529d5761529c6152d7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206d7573742062652061637469766520746f206d696e74206120426160008201527f6279000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e6720776f756c6420657863656564206d617820737570706c792060008201527f6f66204261626965730000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f662042616269657300000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f66204261626965732c203330302061726520726573657276656420666f7260208201527f20746865207465616d0000000000000000000000000000000000000000000000604082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f546865204261736555524920686173206265656e2066726f7a656e20616e642060008201527f63616e206e6f74206265206368616e6765642e00000000000000000000000000602082015250565b7f54686520426173655552492068617320616c7265616479206265656e2066726f60008201527f7a656e2e00000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f416c6c20373530206672656520626162696573206861766520616c726561647960008201527f206265656e206d696e7465640000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f4c6963656e736520616c7265616479206c6f636b656400000000000000000000600082015250565b7f596f75206861766520616c7265616479206d696e74656420796f75722066726560008201527f6520626162790000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f43484f4f5345204120424142592057495448494e2052414e4745000000000000600082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b615d65816150cf565b8114615d7057600080fd5b50565b615d7c816150e1565b8114615d8757600080fd5b50565b615d93816150ed565b8114615d9e57600080fd5b50565b615daa81615155565b8114615db557600080fd5b5056fea264697066735822122045d8b5d4618563ced12653584871921013ec34b72137493a12d40dabf8dbc70f64736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102ae5760003560e01c8063715018a611610175578063b88d4fde116100dc578063d7224ba011610095578063e985e9c51161006f578063e985e9c514610a1f578063eb8d244414610a5c578063f2fde38b14610a87578063ffe4760b14610ab0576102ae565b8063d7224ba0146109a0578063d9b137b2146109cb578063e7bc820814610a08576102ae565b8063b88d4fde146108ca578063bf4702fc146108f3578063c87b56dd1461090a578063d1beca6414610947578063d21354441461095e578063d56d7ff114610989576102ae565b80639c3e72bd1161012e5780639c3e72bd146107cc578063a0021918146107f7578063a22cb46514610822578063b09904b51461084b578063b105a3d114610874578063b749b7391461089f576102ae565b8063715018a6146106db5780637adc794f146106f25780638462151c1461070e5780638612bbbc1461074b5780638da5cb5b1461077657806395d89b41146107a1576102ae565b80632f745c59116102195780634cc647e5116101d25780634cc647e5146105a95780634f6ccce7146105d257806355f804b31461060f5780636352211e146106385780636690864e1461067557806370a082311461069e576102ae565b80632f745c59146104d357806334918dfd146105105780633ccfd60b146105275780633dc464d61461053e57806342842e0e14610569578063445064e114610592576102ae565b806318160ddd1161026b57806318160ddd146103d55780631a0e96b3146104005780631e837a7f1461042b578063206855ea1461045657806323b872dd1461047f57806328cd8e68146104a8576102ae565b806301ffc9a7146102b357806306fdde03146102f0578063081812fc1461031b578063095ea7b314610358578063109695231461038157806310b5454d146103aa575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d59190614129565b610adb565b6040516102e7919061496e565b60405180910390f35b3480156102fc57600080fd5b50610305610c25565b6040516103129190614989565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190614219565b610cb7565b60405161034f91906148e5565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a91906140e9565b610d3c565b005b34801561038d57600080fd5b506103a860048036038101906103a391906141d0565b610e55565b005b3480156103b657600080fd5b506103bf610eeb565b6040516103cc919061496e565b60405180910390f35b3480156103e157600080fd5b506103ea610efe565b6040516103f79190614e0d565b60405180910390f35b34801561040c57600080fd5b50610415610f08565b60405161042291906148e5565b60405180910390f35b34801561043757600080fd5b50610440610f20565b60405161044d9190614e0d565b60405180910390f35b34801561046257600080fd5b5061047d600480360381019061047891906140e9565b610f26565b005b34801561048b57600080fd5b506104a660048036038101906104a19190613fd3565b61100e565b005b3480156104b457600080fd5b506104bd61101e565b6040516104ca919061496e565b60405180910390f35b3480156104df57600080fd5b506104fa60048036038101906104f591906140e9565b611031565b6040516105079190614e0d565b60405180910390f35b34801561051c57600080fd5b5061052561122f565b005b34801561053357600080fd5b5061053c6112d7565b005b34801561054a57600080fd5b50610553611422565b604051610560919061496e565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b9190613fd3565b611435565b005b34801561059e57600080fd5b506105a7611455565b005b3480156105b557600080fd5b506105d060048036038101906105cb9190614219565b6114fd565b005b3480156105de57600080fd5b506105f960048036038101906105f49190614219565b611583565b6040516106069190614e0d565b60405180910390f35b34801561061b57600080fd5b5061063660048036038101906106319190614183565b6115d6565b005b34801561064457600080fd5b5061065f600480360381019061065a9190614219565b6116be565b60405161066c91906148e5565b60405180910390f35b34801561068157600080fd5b5061069c60048036038101906106979190613f66565b6116d4565b005b3480156106aa57600080fd5b506106c560048036038101906106c09190613f66565b611794565b6040516106d29190614e0d565b60405180910390f35b3480156106e757600080fd5b506106f061187d565b005b61070c60048036038101906107079190614219565b6119ba565b005b34801561071a57600080fd5b5061073560048036038101906107309190613f66565b611ba4565b604051610742919061494c565b60405180910390f35b34801561075757600080fd5b50610760611cae565b60405161076d91906148e5565b60405180910390f35b34801561078257600080fd5b5061078b611cd4565b60405161079891906148e5565b60405180910390f35b3480156107ad57600080fd5b506107b6611cfe565b6040516107c39190614989565b60405180910390f35b3480156107d857600080fd5b506107e1611d90565b6040516107ee9190614989565b60405180910390f35b34801561080357600080fd5b5061080c611e1e565b60405161081991906148e5565b60405180910390f35b34801561082e57600080fd5b50610849600480360381019061084491906140a9565b611e36565b005b34801561085757600080fd5b50610872600480360381019061086d91906141d0565b611fb7565b005b34801561088057600080fd5b506108896120a3565b6040516108969190614e0d565b60405180910390f35b3480156108ab57600080fd5b506108b46120a8565b6040516108c19190614e0d565b60405180910390f35b3480156108d657600080fd5b506108f160048036038101906108ec9190614026565b6120ae565b005b3480156108ff57600080fd5b5061090861210a565b005b34801561091657600080fd5b50610931600480360381019061092c9190614219565b6121db565b60405161093e9190614989565b60405180910390f35b34801561095357600080fd5b5061095c612282565b005b34801561096a57600080fd5b5061097361232a565b6040516109809190614989565b60405180910390f35b34801561099557600080fd5b5061099e6123b8565b005b3480156109ac57600080fd5b506109b56125bc565b6040516109c29190614e0d565b60405180910390f35b3480156109d757600080fd5b506109f260048036038101906109ed9190614219565b6125c2565b6040516109ff9190614989565b60405180910390f35b348015610a1457600080fd5b50610a1d61269f565b005b348015610a2b57600080fd5b50610a466004803603810190610a419190613f93565b61278e565b604051610a53919061496e565b60405180910390f35b348015610a6857600080fd5b50610a71612822565b604051610a7e919061496e565b60405180910390f35b348015610a9357600080fd5b50610aae6004803603810190610aa99190613f66565b612835565b005b348015610abc57600080fd5b50610ac56129e1565b604051610ad29190614e0d565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ba657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c0e57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c1e5750610c1d826129e7565b5b9050919050565b606060028054610c34906151cb565b80601f0160208091040260200160405190810160405280929190818152602001828054610c60906151cb565b8015610cad5780601f10610c8257610100808354040283529160200191610cad565b820191906000526020600020905b815481529060010190602001808311610c9057829003601f168201915b5050505050905090565b6000610cc282612a4e565b610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf890614dcd565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d47826116be565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610db8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610daf90614cad565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dd7612a5c565b73ffffffffffffffffffffffffffffffffffffffff161480610e065750610e0581610e00612a5c565b61278e565b5b610e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3c90614b4d565b60405180910390fd5b610e50838383612a64565b505050565b610e5d612a5c565b73ffffffffffffffffffffffffffffffffffffffff16610e7b611cd4565b73ffffffffffffffffffffffffffffffffffffffff1614610ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec890614c0d565b60405180910390fd5b80600a9080519060200190610ee7929190613c64565b5050565b600f60019054906101000a900460ff1681565b6000600154905090565b73e1f04a8e7609482b0a96a4636bb2d0211e3a4ff981565b600e5481565b610f2e612a5c565b73ffffffffffffffffffffffffffffffffffffffff16610f4c611cd4565b73ffffffffffffffffffffffffffffffffffffffff1614610fa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9990614c0d565b60405180910390fd5b612710610fbf82610fb1610efe565b612b1690919063ffffffff16565b1115611000576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff790614aed565b60405180910390fd5b61100a8282612b74565b5050565b611019838383612b92565b505050565b600f60039054906101000a900460ff1681565b600061103c83611794565b821061107d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611074906149cd565b60405180910390fd5b6000611087610efe565b905060008060005b838110156111ed576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461118157806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156111d957868414156111ca578195505050505050611229565b83806111d59061522e565b9450505b5080806111e59061522e565b91505061108f565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122090614d6d565b60405180910390fd5b92915050565b611237612a5c565b73ffffffffffffffffffffffffffffffffffffffff16611255611cd4565b73ffffffffffffffffffffffffffffffffffffffff16146112ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a290614c0d565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600047905060006014826112eb9190614fdc565b90506000600a836112fc9190614fdc565b9050737df76fdeede91d3cb80e4a86158dd9f6d206c98e73ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611358573d6000803e3d6000fd5b5073e1f04a8e7609482b0a96a4636bb2d0211e3a4ff973ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156113b3573d6000803e3d6000fd5b50600f60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561141c573d6000803e3d6000fd5b50505050565b600f60029054906101000a900460ff1681565b611450838383604051806020016040528060008152506120ae565b505050565b61145d612a5c565b73ffffffffffffffffffffffffffffffffffffffff1661147b611cd4565b73ffffffffffffffffffffffffffffffffffffffff16146114d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c890614c0d565b60405180910390fd5b600f60039054906101000a900460ff1615600f60036101000a81548160ff021916908315150217905550565b611505612a5c565b73ffffffffffffffffffffffffffffffffffffffff16611523611cd4565b73ffffffffffffffffffffffffffffffffffffffff1614611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090614c0d565b60405180910390fd5b80600d8190555050565b600061158d610efe565b82106115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c590614a6d565b60405180910390fd5b819050919050565b6115de612a5c565b73ffffffffffffffffffffffffffffffffffffffff166115fc611cd4565b73ffffffffffffffffffffffffffffffffffffffff1614611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164990614c0d565b60405180910390fd5b60001515600f60029054906101000a900460ff161515146116a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169f90614b6d565b60405180910390fd5b8181601191906116b9929190613cea565b505050565b60006116c98261314b565b600001519050919050565b6116dc612a5c565b73ffffffffffffffffffffffffffffffffffffffff166116fa611cd4565b73ffffffffffffffffffffffffffffffffffffffff1614611750576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174790614c0d565b60405180910390fd5b80600f60046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fc90614bad565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611885612a5c565b73ffffffffffffffffffffffffffffffffffffffff166118a3611cd4565b73ffffffffffffffffffffffffffffffffffffffff16146118f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f090614c0d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600f60009054906101000a900460ff16611a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a00906149ed565b60405180910390fd5b600081118015611a1a575060148111155b611a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5090614acd565b60405180910390fd5b61012c612710611a69919061509b565b611a8382611a75610efe565b612b1690919063ffffffff16565b111580611aa3575060011515600f60039054906101000a900460ff161515145b611ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad990614b2d565b60405180910390fd5b612710611aff82611af1610efe565b612b1690919063ffffffff16565b1115611b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3790614b0d565b60405180910390fd5b611b5581600d5461334e90919063ffffffff16565b341015611b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8e90614aad565b60405180910390fd5b611ba13382612b74565b50565b60606000611bb183611794565b90506000811415611c0e57600067ffffffffffffffff811115611bd757611bd6615364565b5b604051908082528060200260200182016040528015611c055781602001602082028036833780820191505090505b50915050611ca9565b60008167ffffffffffffffff811115611c2a57611c29615364565b5b604051908082528060200260200182016040528015611c585781602001602082028036833780820191505090505b50905060005b82811015611ca257611c708582611031565b828281518110611c8357611c82615335565b5b6020026020010181815250508080611c9a9061522e565b915050611c5e565b8193505050505b919050565b600f60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611d0d906151cb565b80601f0160208091040260200160405190810160405280929190818152602001828054611d39906151cb565b8015611d865780601f10611d5b57610100808354040283529160200191611d86565b820191906000526020600020905b815481529060010190602001808311611d6957829003601f168201915b5050505050905090565b600b8054611d9d906151cb565b80601f0160208091040260200160405190810160405280929190818152602001828054611dc9906151cb565b8015611e165780601f10611deb57610100808354040283529160200191611e16565b820191906000526020600020905b815481529060010190602001808311611df957829003601f168201915b505050505081565b737df76fdeede91d3cb80e4a86158dd9f6d206c98e81565b611e3e612a5c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea390614c4d565b60405180910390fd5b8060076000611eb9612a5c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f66612a5c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fab919061496e565b60405180910390a35050565b611fbf612a5c565b73ffffffffffffffffffffffffffffffffffffffff16611fdd611cd4565b73ffffffffffffffffffffffffffffffffffffffff1614612033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202a90614c0d565b60405180910390fd5b60001515600c60009054906101000a900460ff16151514612089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208090614ccd565b60405180910390fd5b80600b908051906020019061209f929190613c64565b5050565b601481565b61271081565b6120b9848484612b92565b6120c5848484846133c9565b612104576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fb90614d0d565b60405180910390fd5b50505050565b612112612a5c565b73ffffffffffffffffffffffffffffffffffffffff16612130611cd4565b73ffffffffffffffffffffffffffffffffffffffff1614612186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217d90614c0d565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055507f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b0600b6040516121d191906149ab565b60405180910390a1565b60606121e682612a4e565b612225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221c90614c2d565b60405180910390fd5b600061222f613560565b9050600081511161224f576040518060200160405280600081525061227a565b80612259846135f2565b60405160200161226a9291906148c1565b6040516020818303038152906040525b915050919050565b61228a612a5c565b73ffffffffffffffffffffffffffffffffffffffff166122a8611cd4565b73ffffffffffffffffffffffffffffffffffffffff16146122fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f590614c0d565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b600a8054612337906151cb565b80601f0160208091040260200160405190810160405280929190818152602001828054612363906151cb565b80156123b05780601f10612385576101008083540402835291602001916123b0565b820191906000526020600020905b81548152906001019060200180831161239357829003601f168201915b505050505081565b60001515601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461244b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244290614ced565b60405180910390fd5b600f60019054906101000a900460ff1661249a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612491906149ed565b60405180910390fd5b6127106124b860016124aa610efe565b612b1690919063ffffffff16565b11156124f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f090614b0d565b60405180910390fd5b6102ee600e541061253f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253690614c8d565b60405180910390fd5b61254a336001612b74565b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600e60008154809291906125b59061522e565b9190505550565b60085481565b60606125cc610efe565b821061260d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260490614dad565b60405180910390fd5b600b805461261a906151cb565b80601f0160208091040260200160405190810160405280929190818152602001828054612646906151cb565b80156126935780601f1061266857610100808354040283529160200191612693565b820191906000526020600020905b81548152906001019060200180831161267657829003601f168201915b50505050509050919050565b6126a7612a5c565b73ffffffffffffffffffffffffffffffffffffffff166126c5611cd4565b73ffffffffffffffffffffffffffffffffffffffff161461271b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271290614c0d565b60405180910390fd5b60001515600f60029054906101000a900460ff16151514612771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276890614b8d565b60405180910390fd5b6001600f60026101000a81548160ff021916908315150217905550565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f60009054906101000a900460ff1681565b61283d612a5c565b73ffffffffffffffffffffffffffffffffffffffff1661285b611cd4565b73ffffffffffffffffffffffffffffffffffffffff16146128b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a890614c0d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291890614a0d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d5481565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000808284612b259190614f86565b905083811015612b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6190614a4d565b60405180910390fd5b8091505092915050565b612b8e828260405180602001604052806000815250613765565b5050565b6000612b9d8261314b565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612bc4612a5c565b73ffffffffffffffffffffffffffffffffffffffff161480612c205750612be9612a5c565b73ffffffffffffffffffffffffffffffffffffffff16612c0884610cb7565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c3c5750612c3b8260000151612c36612a5c565b61278e565b5b905080612c7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7590614c6d565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce790614bed565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612d60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5790614a8d565b60405180910390fd5b612d6d8585856001613c45565b612d7d6000848460000151612a64565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612deb9190615067565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612e8f9190614f40565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612f959190614f86565b9050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156130db5761300b81612a4e565b156130da576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506004600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131438686866001613c4b565b505050505050565b613153613d70565b61315c82612a4e565b61319b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319290614a2d565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000001483106131ff5760017f0000000000000000000000000000000000000000000000000000000000000014846131f2919061509b565b6131fc9190614f86565b90505b60008390505b81811061330d576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146132f957809350505050613349565b508080613305906151a1565b915050613205565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334090614d8d565b60405180910390fd5b919050565b60008083141561336157600090506133c3565b6000828461336f919061500d565b905082848261337e9190614fdc565b146133be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b590614bcd565b60405180910390fd5b809150505b92915050565b60006133ea8473ffffffffffffffffffffffffffffffffffffffff16613c51565b15613553578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613413612a5c565b8786866040518563ffffffff1660e01b81526004016134359493929190614900565b602060405180830381600087803b15801561344f57600080fd5b505af192505050801561348057506040513d601f19601f8201168201806040525081019061347d9190614156565b60015b613503573d80600081146134b0576040519150601f19603f3d011682016040523d82523d6000602084013e6134b5565b606091505b506000815114156134fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f290614d0d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613558565b600190505b949350505050565b60606011805461356f906151cb565b80601f016020809104026020016040519081016040528092919081815260200182805461359b906151cb565b80156135e85780601f106135bd576101008083540402835291602001916135e8565b820191906000526020600020905b8154815290600101906020018083116135cb57829003601f168201915b5050505050905090565b6060600082141561363a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613760565b600082905060005b6000821461366c5780806136559061522e565b915050600a826136659190614fdc565b9150613642565b60008167ffffffffffffffff81111561368857613687615364565b5b6040519080825280601f01601f1916602001820160405280156136ba5781602001600182028036833780820191505090505b50905060006001836136cc919061509b565b90508593505b6000841461375857600a846136e79190615277565b60306136f39190614f86565b60f81b828280613702906151a1565b93508151811061371557613714615335565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a846137519190614fdc565b93506136d2565b819450505050505b919050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156137dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137d390614d4d565b60405180910390fd5b6137e581612a4e565b15613825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161381c90614d2d565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000014831115613888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161387f90614ded565b60405180910390fd5b6138956000858386613c45565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516139929190614f40565b6fffffffffffffffffffffffffffffffff1681526020018583602001516139b99190614f40565b6fffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015613c2857818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613bc860008884886133c9565b613c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bfe90614d0d565b60405180910390fd5b8180613c129061522e565b9250508080613c209061522e565b915050613b57565b5080600181905550613c3d6000878588613c4b565b505050505050565b50505050565b50505050565b600080823b905060008111915050919050565b828054613c70906151cb565b90600052602060002090601f016020900481019282613c925760008555613cd9565b82601f10613cab57805160ff1916838001178555613cd9565b82800160010185558215613cd9579182015b82811115613cd8578251825591602001919060010190613cbd565b5b509050613ce69190613daa565b5090565b828054613cf6906151cb565b90600052602060002090601f016020900481019282613d185760008555613d5f565b82601f10613d3157803560ff1916838001178555613d5f565b82800160010185558215613d5f579182015b82811115613d5e578235825591602001919060010190613d43565b5b509050613d6c9190613daa565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613dc3576000816000905550600101613dab565b5090565b6000613dda613dd584614e4d565b614e28565b905082815260208101848484011115613df657613df56153a2565b5b613e0184828561515f565b509392505050565b6000613e1c613e1784614e7e565b614e28565b905082815260208101848484011115613e3857613e376153a2565b5b613e4384828561515f565b509392505050565b600081359050613e5a81615d5c565b92915050565b600081359050613e6f81615d73565b92915050565b600081359050613e8481615d8a565b92915050565b600081519050613e9981615d8a565b92915050565b600082601f830112613eb457613eb3615398565b5b8135613ec4848260208601613dc7565b91505092915050565b60008083601f840112613ee357613ee2615398565b5b8235905067ffffffffffffffff811115613f0057613eff615393565b5b602083019150836001820283011115613f1c57613f1b61539d565b5b9250929050565b600082601f830112613f3857613f37615398565b5b8135613f48848260208601613e09565b91505092915050565b600081359050613f6081615da1565b92915050565b600060208284031215613f7c57613f7b6153ac565b5b6000613f8a84828501613e4b565b91505092915050565b60008060408385031215613faa57613fa96153ac565b5b6000613fb885828601613e4b565b9250506020613fc985828601613e4b565b9150509250929050565b600080600060608486031215613fec57613feb6153ac565b5b6000613ffa86828701613e4b565b935050602061400b86828701613e4b565b925050604061401c86828701613f51565b9150509250925092565b600080600080608085870312156140405761403f6153ac565b5b600061404e87828801613e4b565b945050602061405f87828801613e4b565b935050604061407087828801613f51565b925050606085013567ffffffffffffffff811115614091576140906153a7565b5b61409d87828801613e9f565b91505092959194509250565b600080604083850312156140c0576140bf6153ac565b5b60006140ce85828601613e4b565b92505060206140df85828601613e60565b9150509250929050565b60008060408385031215614100576140ff6153ac565b5b600061410e85828601613e4b565b925050602061411f85828601613f51565b9150509250929050565b60006020828403121561413f5761413e6153ac565b5b600061414d84828501613e75565b91505092915050565b60006020828403121561416c5761416b6153ac565b5b600061417a84828501613e8a565b91505092915050565b6000806020838503121561419a576141996153ac565b5b600083013567ffffffffffffffff8111156141b8576141b76153a7565b5b6141c485828601613ecd565b92509250509250929050565b6000602082840312156141e6576141e56153ac565b5b600082013567ffffffffffffffff811115614204576142036153a7565b5b61421084828501613f23565b91505092915050565b60006020828403121561422f5761422e6153ac565b5b600061423d84828501613f51565b91505092915050565b600061425283836148a3565b60208301905092915050565b614267816150cf565b82525050565b600061427882614ed4565b6142828185614f02565b935061428d83614eaf565b8060005b838110156142be5781516142a58882614246565b97506142b083614ef5565b925050600181019050614291565b5085935050505092915050565b6142d4816150e1565b82525050565b60006142e582614edf565b6142ef8185614f13565b93506142ff81856020860161516e565b614308816153b1565b840191505092915050565b600061431e82614eea565b6143288185614f24565b935061433881856020860161516e565b614341816153b1565b840191505092915050565b600061435782614eea565b6143618185614f35565b935061437181856020860161516e565b80840191505092915050565b6000815461438a816151cb565b6143948186614f24565b945060018216600081146143af57600181146143c1576143f4565b60ff19831686526020860193506143f4565b6143ca85614ebf565b60005b838110156143ec578154818901526001820191506020810190506143cd565b808801955050505b50505092915050565b600061440a602283614f24565b9150614415826153c2565b604082019050919050565b600061442d602283614f24565b915061443882615411565b604082019050919050565b6000614450602683614f24565b915061445b82615460565b604082019050919050565b6000614473602a83614f24565b915061447e826154af565b604082019050919050565b6000614496601b83614f24565b91506144a1826154fe565b602082019050919050565b60006144b9602383614f24565b91506144c482615527565b604082019050919050565b60006144dc602583614f24565b91506144e782615576565b604082019050919050565b60006144ff601f83614f24565b915061450a826155c5565b602082019050919050565b6000614522602183614f24565b915061452d826155ee565b604082019050919050565b6000614545602983614f24565b91506145508261563d565b604082019050919050565b6000614568602a83614f24565b91506145738261568c565b604082019050919050565b600061458b604983614f24565b9150614596826156db565b606082019050919050565b60006145ae603983614f24565b91506145b982615750565b604082019050919050565b60006145d1603383614f24565b91506145dc8261579f565b604082019050919050565b60006145f4602483614f24565b91506145ff826157ee565b604082019050919050565b6000614617602b83614f24565b91506146228261583d565b604082019050919050565b600061463a602183614f24565b91506146458261588c565b604082019050919050565b600061465d602683614f24565b9150614668826158db565b604082019050919050565b6000614680602083614f24565b915061468b8261592a565b602082019050919050565b60006146a3602f83614f24565b91506146ae82615953565b604082019050919050565b60006146c6601a83614f24565b91506146d1826159a2565b602082019050919050565b60006146e9603283614f24565b91506146f4826159cb565b604082019050919050565b600061470c602c83614f24565b915061471782615a1a565b604082019050919050565b600061472f602283614f24565b915061473a82615a69565b604082019050919050565b6000614752601683614f24565b915061475d82615ab8565b602082019050919050565b6000614775602683614f24565b915061478082615ae1565b604082019050919050565b6000614798603383614f24565b91506147a382615b30565b604082019050919050565b60006147bb601d83614f24565b91506147c682615b7f565b602082019050919050565b60006147de602183614f24565b91506147e982615ba8565b604082019050919050565b6000614801602e83614f24565b915061480c82615bf7565b604082019050919050565b6000614824602f83614f24565b915061482f82615c46565b604082019050919050565b6000614847601a83614f24565b915061485282615c95565b602082019050919050565b600061486a602d83614f24565b915061487582615cbe565b604082019050919050565b600061488d602283614f24565b915061489882615d0d565b604082019050919050565b6148ac81615155565b82525050565b6148bb81615155565b82525050565b60006148cd828561434c565b91506148d9828461434c565b91508190509392505050565b60006020820190506148fa600083018461425e565b92915050565b6000608082019050614915600083018761425e565b614922602083018661425e565b61492f60408301856148b2565b818103606083015261494181846142da565b905095945050505050565b60006020820190508181036000830152614966818461426d565b905092915050565b600060208201905061498360008301846142cb565b92915050565b600060208201905081810360008301526149a38184614313565b905092915050565b600060208201905081810360008301526149c5818461437d565b905092915050565b600060208201905081810360008301526149e6816143fd565b9050919050565b60006020820190508181036000830152614a0681614420565b9050919050565b60006020820190508181036000830152614a2681614443565b9050919050565b60006020820190508181036000830152614a4681614466565b9050919050565b60006020820190508181036000830152614a6681614489565b9050919050565b60006020820190508181036000830152614a86816144ac565b9050919050565b60006020820190508181036000830152614aa6816144cf565b9050919050565b60006020820190508181036000830152614ac6816144f2565b9050919050565b60006020820190508181036000830152614ae681614515565b9050919050565b60006020820190508181036000830152614b0681614538565b9050919050565b60006020820190508181036000830152614b268161455b565b9050919050565b60006020820190508181036000830152614b468161457e565b9050919050565b60006020820190508181036000830152614b66816145a1565b9050919050565b60006020820190508181036000830152614b86816145c4565b9050919050565b60006020820190508181036000830152614ba6816145e7565b9050919050565b60006020820190508181036000830152614bc68161460a565b9050919050565b60006020820190508181036000830152614be68161462d565b9050919050565b60006020820190508181036000830152614c0681614650565b9050919050565b60006020820190508181036000830152614c2681614673565b9050919050565b60006020820190508181036000830152614c4681614696565b9050919050565b60006020820190508181036000830152614c66816146b9565b9050919050565b60006020820190508181036000830152614c86816146dc565b9050919050565b60006020820190508181036000830152614ca6816146ff565b9050919050565b60006020820190508181036000830152614cc681614722565b9050919050565b60006020820190508181036000830152614ce681614745565b9050919050565b60006020820190508181036000830152614d0681614768565b9050919050565b60006020820190508181036000830152614d268161478b565b9050919050565b60006020820190508181036000830152614d46816147ae565b9050919050565b60006020820190508181036000830152614d66816147d1565b9050919050565b60006020820190508181036000830152614d86816147f4565b9050919050565b60006020820190508181036000830152614da681614817565b9050919050565b60006020820190508181036000830152614dc68161483a565b9050919050565b60006020820190508181036000830152614de68161485d565b9050919050565b60006020820190508181036000830152614e0681614880565b9050919050565b6000602082019050614e2260008301846148b2565b92915050565b6000614e32614e43565b9050614e3e82826151fd565b919050565b6000604051905090565b600067ffffffffffffffff821115614e6857614e67615364565b5b614e71826153b1565b9050602081019050919050565b600067ffffffffffffffff821115614e9957614e98615364565b5b614ea2826153b1565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f4b82615119565b9150614f5683615119565b9250826fffffffffffffffffffffffffffffffff03821115614f7b57614f7a6152a8565b5b828201905092915050565b6000614f9182615155565b9150614f9c83615155565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614fd157614fd06152a8565b5b828201905092915050565b6000614fe782615155565b9150614ff283615155565b925082615002576150016152d7565b5b828204905092915050565b600061501882615155565b915061502383615155565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561505c5761505b6152a8565b5b828202905092915050565b600061507282615119565b915061507d83615119565b9250828210156150905761508f6152a8565b5b828203905092915050565b60006150a682615155565b91506150b183615155565b9250828210156150c4576150c36152a8565b5b828203905092915050565b60006150da82615135565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561518c578082015181840152602081019050615171565b8381111561519b576000848401525b50505050565b60006151ac82615155565b915060008214156151c0576151bf6152a8565b5b600182039050919050565b600060028204905060018216806151e357607f821691505b602082108114156151f7576151f6615306565b5b50919050565b615206826153b1565b810181811067ffffffffffffffff8211171561522557615224615364565b5b80604052505050565b600061523982615155565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561526c5761526b6152a8565b5b600182019050919050565b600061528282615155565b915061528d83615155565b92508261529d5761529c6152d7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206d7573742062652061637469766520746f206d696e74206120426160008201527f6279000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e6720776f756c6420657863656564206d617820737570706c792060008201527f6f66204261626965730000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f662042616269657300000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f66204261626965732c203330302061726520726573657276656420666f7260208201527f20746865207465616d0000000000000000000000000000000000000000000000604082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f546865204261736555524920686173206265656e2066726f7a656e20616e642060008201527f63616e206e6f74206265206368616e6765642e00000000000000000000000000602082015250565b7f54686520426173655552492068617320616c7265616479206265656e2066726f60008201527f7a656e2e00000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f416c6c20373530206672656520626162696573206861766520616c726561647960008201527f206265656e206d696e7465640000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f4c6963656e736520616c7265616479206c6f636b656400000000000000000000600082015250565b7f596f75206861766520616c7265616479206d696e74656420796f75722066726560008201527f6520626162790000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f43484f4f5345204120424142592057495448494e2052414e4745000000000000600082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b615d65816150cf565b8114615d7057600080fd5b50565b615d7c816150e1565b8114615d8757600080fd5b50565b615d93816150ed565b8114615d9e57600080fd5b50565b615daa81615155565b8114615db557600080fd5b5056fea264697066735822122045d8b5d4618563ced12653584871921013ec34b72137493a12d40dabf8dbc70f64736f6c63430008070033
Deployed Bytecode Sourcemap
65779:5474:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51067:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52793:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54318:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53881:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67286:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66372:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49628:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66599:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66238:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70437:248;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55168:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66466:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50259:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68056:89;;;;;;;;;;;;;:::i;:::-;;66960:316;;;;;;;;;;;;;:::i;:::-;;66426:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55373:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68153:101;;;;;;;;;;;;;:::i;:::-;;67419:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49791:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67680:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52616:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68386:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51493:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65135:148;;;;;;;;;;;;;:::i;:::-;;69694:733;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68511:540;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66692:72;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64484:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52948:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65970:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66510:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54586:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69506:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66188:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66280:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55593:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69342:125;;;;;;;;;;;;;:::i;:::-;;53109:394;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68262:116;;;;;;;;;;;;;:::i;:::-;;65868:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70697:531;;;;;;;;;;;;;:::i;:::-;;60008:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69102:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67887:159;;;;;;;;;;;;;:::i;:::-;;54923:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66331:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65438:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66123:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51067:370;51194:4;51239:25;51224:40;;;:11;:40;;;;:99;;;;51290:33;51275:48;;;:11;:48;;;;51224:99;:160;;;;51349:35;51334:50;;;:11;:50;;;;51224:160;:207;;;;51395:36;51419:11;51395:23;:36::i;:::-;51224:207;51210:221;;51067:370;;;:::o;52793:94::-;52847:13;52876:5;52869:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52793:94;:::o;54318:204::-;54386:7;54410:16;54418:7;54410;:16::i;:::-;54402:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;54492:15;:24;54508:7;54492:24;;;;;;;;;;;;;;;;;;;;;54485:31;;54318:204;;;:::o;53881:379::-;53950:13;53966:24;53982:7;53966:15;:24::i;:::-;53950:40;;54011:5;54005:11;;:2;:11;;;;53997:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;54096:5;54080:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;54105:37;54122:5;54129:12;:10;:12::i;:::-;54105:16;:37::i;:::-;54080:62;54064:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;54226:28;54235:2;54239:7;54248:5;54226:8;:28::i;:::-;53943:317;53881:379;;:::o;67286:125::-;64715:12;:10;:12::i;:::-;64704:23;;:7;:5;:7::i;:::-;:23;;;64696:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67389:14:::1;67371:15;:32;;;;;;;;;;;;:::i;:::-;;67286:125:::0;:::o;66372:41::-;;;;;;;;;;;;;:::o;49628:94::-;49681:7;49704:12;;49697:19;;49628:94;:::o;66599:80::-;66637:42;66599:80;:::o;66238:33::-;;;;:::o;70437:248::-;64715:12;:10;:12::i;:::-;64704:23;;:7;:5;:7::i;:::-;:23;;;64696:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66317:5:::1;70536:33;70554:14;70536:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:47;;70528:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;70641:36;70651:9;70662:14;70641:9;:36::i;:::-;70437:248:::0;;:::o;55168:142::-;55276:28;55286:4;55292:2;55296:7;55276:9;:28::i;:::-;55168:142;;;:::o;66466:35::-;;;;;;;;;;;;;:::o;50259:744::-;50368:7;50403:16;50413:5;50403:9;:16::i;:::-;50395:5;:24;50387:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;50465:22;50490:13;:11;:13::i;:::-;50465:38;;50510:19;50540:25;50590:9;50585:350;50609:14;50605:1;:18;50585:350;;;50639:31;50673:11;:14;50685:1;50673:14;;;;;;;;;;;50639:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50726:1;50700:28;;:9;:14;;;:28;;;50696:89;;50761:9;:14;;;50741:34;;50696:89;50818:5;50797:26;;:17;:26;;;50793:135;;;50855:5;50840:11;:20;50836:59;;;50882:1;50875:8;;;;;;;;;50836:59;50905:13;;;;;:::i;:::-;;;;50793:135;50630:305;50625:3;;;;;:::i;:::-;;;;50585:350;;;;50941:56;;;;;;;;;;:::i;:::-;;;;;;;;50259:744;;;;;:::o;68056:89::-;64715:12;:10;:12::i;:::-;64704:23;;:7;:5;:7::i;:::-;:23;;;64696:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68125:12:::1;;;;;;;;;;;68124:13;68109:12;;:28;;;;;;;;;;;;;;;;;;68056:89::o:0;66960:316::-;66998:12;67013:21;66998:36;;67045:12;67068:2;67060:7;:10;;;;:::i;:::-;67045:25;;67081:12;67104:2;67096:7;:10;;;;:::i;:::-;67081:25;;66548:42;67117:29;;:38;67147:7;67117:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66637:42;67166:29;;:38;67196:7;67166:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67223:12;;;;;;;;;;;67215:30;;:53;67246:21;67215:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66987:289;;;66960:316::o;66426:31::-;;;;;;;;;;;;;:::o;55373:157::-;55485:39;55502:4;55508:2;55512:7;55485:39;;;;;;;;;;;;:16;:39::i;:::-;55373:157;;;:::o;68153:101::-;64715:12;:10;:12::i;:::-;64704:23;;:7;:5;:7::i;:::-;:23;;;64696:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68231:15:::1;;;;;;;;;;;68230:16;68212:15;;:34;;;;;;;;;;;;;;;;;;68153:101::o:0;67419:100::-;64715:12;:10;:12::i;:::-;64704:23;;:7;:5;:7::i;:::-;:23;;;64696:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67501:10:::1;67489:9;:22;;;;67419:100:::0;:::o;49791:177::-;49858:7;49890:13;:11;:13::i;:::-;49882:5;:21;49874:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;49957:5;49950:12;;49791:177;;;:::o;67680:195::-;64715:12;:10;:12::i;:::-;64704:23;;:7;:5;:7::i;:::-;:23;;;64696:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67776:5:::1;67761:20;;:11;;;;;;;;;;;:20;;;67753:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;67862:7;;67846:13;:23;;;;;;;:::i;:::-;;67680:195:::0;;:::o;52616:118::-;52680:7;52703:20;52715:7;52703:11;:20::i;:::-;:25;;;52696:32;;52616:118;;;:::o;68386:107::-;64715:12;:10;:12::i;:::-;64704:23;;:7;:5;:7::i;:::-;:23;;;64696:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68474:11:::1;68459:12;;:26;;;;;;;;;;;;;;;;;;68386:107:::0;:::o;51493:211::-;51557:7;51598:1;51581:19;;:5;:19;;;;51573:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;51670:12;:19;51683:5;51670:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;51662:36;;51655:43;;51493:211;;;:::o;65135:148::-;64715:12;:10;:12::i;:::-;64704:23;;:7;:5;:7::i;:::-;:23;;;64696:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65242:1:::1;65205:40;;65226:6;;;;;;;;;;;65205:40;;;;;;;;;;;;65273:1;65256:6;;:19;;;;;;;;;;;;;;;;;;65135:148::o:0;69694:733::-;69773:12;;;;;;;;;;;69765:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;69860:1;69843:14;:18;:55;;;;;66227:2;69865:14;:33;;69843:55;69835:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;70042:3;66317:5;70031:14;;;;:::i;:::-;69994:33;70012:14;69994:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:51;;:78;;;;70068:4;70049:23;;:15;;;;;;;;;;;:23;;;69994:78;69986:164;;;;;;;;;;;;:::i;:::-;;;;;;;;;66317:5;70179:33;70197:14;70179:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:47;;70171:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;70306:29;70320:14;70306:9;;:13;;:29;;;;:::i;:::-;70293:9;:42;;70285:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;70382:37;70392:10;70404:14;70382:9;:37::i;:::-;69694:733;:::o;68511:540::-;68572:16;68602:18;68623:17;68633:6;68623:9;:17::i;:::-;68602:38;;68669:1;68655:10;:15;68651:393;;;68746:1;68732:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68725:23;;;;;68651:393;68781:23;68821:10;68807:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68781:51;;68847:13;68875:130;68899:10;68891:5;:18;68875:130;;;68955:34;68975:6;68983:5;68955:19;:34::i;:::-;68939:6;68946:5;68939:13;;;;;;;;:::i;:::-;;;;;;;:50;;;;;68911:7;;;;;:::i;:::-;;;;68875:130;;;69026:6;69019:13;;;;;68511:540;;;;:::o;66692:72::-;;;;;;;;;;;;;:::o;64484:87::-;64530:7;64557:6;;;;;;;;;;;64550:13;;64484:87;:::o;52948:98::-;53004:13;53033:7;53026:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52948:98;:::o;65970:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66510:80::-;66548:42;66510:80;:::o;54586:274::-;54689:12;:10;:12::i;:::-;54677:24;;:8;:24;;;;54669:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;54786:8;54741:18;:32;54760:12;:10;:12::i;:::-;54741:32;;;;;;;;;;;;;;;:42;54774:8;54741:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;54835:8;54806:48;;54821:12;:10;:12::i;:::-;54806:48;;;54845:8;54806:48;;;;;;:::i;:::-;;;;;;;;54586:274;;:::o;69506:174::-;64715:12;:10;:12::i;:::-;64704:23;;:7;:5;:7::i;:::-;:23;;;64696:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69606:5:::1;69589:22;;:13;;;;;;;;;;;:22;;;69581:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;69664:8;69649:12;:23;;;;;;;;;;;;:::i;:::-;;69506:174:::0;:::o;66188:41::-;66227:2;66188:41;:::o;66280:42::-;66317:5;66280:42;:::o;55593:311::-;55730:28;55740:4;55746:2;55750:7;55730:9;:28::i;:::-;55781:48;55804:4;55810:2;55814:7;55823:5;55781:22;:48::i;:::-;55765:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;55593:311;;;;:::o;69342:125::-;64715:12;:10;:12::i;:::-;64704:23;;:7;:5;:7::i;:::-;:23;;;64696:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69410:4:::1;69393:13;;:21;;;;;;;;;;;;;;;;;;69430:29;69446:12;69430:29;;;;;;:::i;:::-;;;;;;;;69342:125::o:0;53109:394::-;53207:13;53248:16;53256:7;53248;:16::i;:::-;53232:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;53338:21;53362:10;:8;:10::i;:::-;53338:34;;53417:1;53399:7;53393:21;:25;:104;;;;;;;;;;;;;;;;;53454:7;53463:18;:7;:16;:18::i;:::-;53437:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53393:104;53379:118;;;53109:394;;;:::o;68262:116::-;64715:12;:10;:12::i;:::-;64704:23;;:7;:5;:7::i;:::-;:23;;;64696:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68349:21:::1;;;;;;;;;;;68348:22;68324:21;;:46;;;;;;;;;;;;;;;;;;68262:116::o:0;65868:34::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;70697:531::-;70788:5;70752:41;;:20;:32;70773:10;70752:32;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;70744:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;70855:21;;;;;;;;;;;70847:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66317:5;70934:20;70952:1;70934:13;:11;:13::i;:::-;:17;;:20;;;;:::i;:::-;:34;;70926:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;71054:3;71034:17;;:23;71026:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;71117:23;71127:10;71138:1;71117:9;:23::i;:::-;71186:4;71151:20;:32;71172:10;71151:32;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;71201:17;;:19;;;;;;;;;:::i;:::-;;;;;;70697:531::o;60008:43::-;;;;:::o;69102:174::-;69154:13;69194;:11;:13::i;:::-;69188:3;:19;69180:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;69256:12;69249:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69102:174;;;:::o;67887:159::-;64715:12;:10;:12::i;:::-;64704:23;;:7;:5;:7::i;:::-;:23;;;64696:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67963:5:::1;67948:20;;:11;;;;;;;;;;;:20;;;67940:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;68034:4;68020:11;;:18;;;;;;;;;;;;;;;;;;67887:159::o:0;54923:186::-;55045:4;55068:18;:25;55087:5;55068:25;;;;;;;;;;;;;;;:35;55094:8;55068:35;;;;;;;;;;;;;;;;;;;;;;;;;55061:42;;54923:186;;;;:::o;66331:32::-;;;;;;;;;;;;;:::o;65438:244::-;64715:12;:10;:12::i;:::-;64704:23;;:7;:5;:7::i;:::-;:23;;;64696:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65547:1:::1;65527:22;;:8;:22;;;;65519:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;65637:8;65608:38;;65629:6;;;;;;;;;;;65608:38;;;;;;;;;;;;65666:8;65657:6;;:17;;;;;;;;;;;;;;;;;;65438:244:::0;:::o;66123:44::-;;;;:::o;10288:150::-;10373:4;10397:20;:33;10418:11;10397:33;;;;;;;;;;;;;;;;;;;;;;;;;;;10390:40;;10288:150;;;:::o;56143:105::-;56200:4;56230:12;;56220:7;:22;56213:29;;56143:105;;;:::o;728:98::-;781:7;808:10;801:17;;728:98;:::o;59830:172::-;59954:2;59927:15;:24;59943:7;59927:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;59988:7;59984:2;59968:28;;59977:5;59968:28;;;;;;;;;;;;59830:172;;;:::o;13850:179::-;13908:7;13928:9;13944:1;13940;:5;;;;:::i;:::-;13928:17;;13969:1;13964;:6;;13956:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;14020:1;14013:8;;;13850:179;;;;:::o;56254:98::-;56319:27;56329:2;56333:8;56319:27;;;;;;;;;;;;:9;:27::i;:::-;56254:98;;:::o;58195:1529::-;58292:35;58330:20;58342:7;58330:11;:20::i;:::-;58292:58;;58359:22;58401:13;:18;;;58385:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;58454:12;:10;:12::i;:::-;58430:36;;:20;58442:7;58430:11;:20::i;:::-;:36;;;58385:81;:142;;;;58477:50;58494:13;:18;;;58514:12;:10;:12::i;:::-;58477:16;:50::i;:::-;58385:142;58359:169;;58553:17;58537:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;58685:4;58663:26;;:13;:18;;;:26;;;58647:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;58774:1;58760:16;;:2;:16;;;;58752:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;58827:43;58849:4;58855:2;58859:7;58868:1;58827:21;:43::i;:::-;58927:49;58944:1;58948:7;58957:13;:18;;;58927:8;:49::i;:::-;59015:1;58985:12;:18;58998:4;58985:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;59051:1;59023:12;:16;59036:2;59023:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;59082:43;;;;;;;;59097:2;59082:43;;;;;;59108:15;59082:43;;;;;59059:11;:20;59071:7;59059:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59353:19;59385:1;59375:7;:11;;;;:::i;:::-;59353:33;;59438:1;59397:43;;:11;:24;59409:11;59397:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;59393:236;;;59455:20;59463:11;59455:7;:20::i;:::-;59451:171;;;59515:97;;;;;;;;59542:13;:18;;;59515:97;;;;;;59573:13;:28;;;59515:97;;;;;59488:11;:24;59500:11;59488:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59451:171;59393:236;59661:7;59657:2;59642:27;;59651:4;59642:27;;;;;;;;;;;;59676:42;59697:4;59703:2;59707:7;59716:1;59676:20;:42::i;:::-;58285:1439;;;58195:1529;;;:::o;51956:606::-;52032:21;;:::i;:::-;52073:16;52081:7;52073;:16::i;:::-;52065:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;52145:26;52193:12;52182:7;:23;52178:93;;52262:1;52247:12;52237:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;52216:47;;52178:93;52284:12;52299:7;52284:22;;52279:212;52316:18;52308:4;:26;52279:212;;52353:31;52387:11;:17;52399:4;52387:17;;;;;;;;;;;52353:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52443:1;52417:28;;:9;:14;;;:28;;;52413:71;;52465:9;52458:16;;;;;;;52413:71;52344:147;52336:6;;;;;:::i;:::-;;;;52279:212;;;;52499:57;;;;;;;;;;:::i;:::-;;;;;;;;51956:606;;;;:::o;14729:220::-;14787:7;14816:1;14811;:6;14807:20;;;14826:1;14819:8;;;;14807:20;14838:9;14854:1;14850;:5;;;;:::i;:::-;14838:17;;14883:1;14878;14874;:5;;;;:::i;:::-;:10;14866:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;14940:1;14933:8;;;14729:220;;;;;:::o;61545:690::-;61682:4;61699:15;:2;:13;;;:15::i;:::-;61695:535;;;61754:2;61738:36;;;61775:12;:10;:12::i;:::-;61789:4;61795:7;61804:5;61738:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;61725:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61986:1;61969:6;:13;:18;61965:215;;;62002:61;;;;;;;;;;:::i;:::-;;;;;;;;61965:215;62148:6;62142:13;62133:6;62129:2;62125:15;62118:38;61725:464;61870:45;;;61860:55;;;:6;:55;;;;61853:62;;;;;61695:535;62218:4;62211:11;;61545:690;;;;;;;:::o;67564:108::-;67624:13;67653;67646:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67564:108;:::o;46543:746::-;46599:13;46829:1;46820:5;:10;46816:53;;;46847:10;;;;;;;;;;;;;;;;;;;;;46816:53;46879:12;46894:5;46879:20;;46910:14;46935:78;46950:1;46942:4;:9;46935:78;;46968:8;;;;;:::i;:::-;;;;46999:2;46991:10;;;;;:::i;:::-;;;46935:78;;;47023:19;47055:6;47045:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47023:39;;47073:13;47098:1;47089:6;:10;;;;:::i;:::-;47073:26;;47117:5;47110:12;;47133:117;47148:1;47140:4;:9;47133:117;;47209:2;47202:4;:9;;;;:::i;:::-;47197:2;:14;;;;:::i;:::-;47184:29;;47166:6;47173:7;;;;;:::i;:::-;;;47166:15;;;;;;;;:::i;:::-;;;;;:47;;;;;;;;;;;47236:2;47228:10;;;;;:::i;:::-;;;47133:117;;;47274:6;47260:21;;;;;;46543:746;;;;:::o;56691:1272::-;56796:20;56819:12;;56796:35;;56860:1;56846:16;;:2;:16;;;;56838:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;57037:21;57045:12;57037:7;:21::i;:::-;57036:22;57028:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;57119:12;57107:8;:24;;57099:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;57179:61;57209:1;57213:2;57217:12;57231:8;57179:21;:61::i;:::-;57249:30;57282:12;:16;57295:2;57282:16;;;;;;;;;;;;;;;57249:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57324:119;;;;;;;;57374:8;57344:11;:19;;;:39;;;;:::i;:::-;57324:119;;;;;;57427:8;57392:11;:24;;;:44;;;;:::i;:::-;57324:119;;;;;57305:12;:16;57318:2;57305:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57478:43;;;;;;;;57493:2;57478:43;;;;;;57504:15;57478:43;;;;;57450:11;:25;57462:12;57450:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57530:20;57553:12;57530:35;;57579:9;57574:281;57598:8;57594:1;:12;57574:281;;;57652:12;57648:2;57627:38;;57644:1;57627:38;;;;;;;;;;;;57692:59;57723:1;57727:2;57731:12;57745:5;57692:22;:59::i;:::-;57674:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;57833:14;;;;;:::i;:::-;;;;57608:3;;;;;:::i;:::-;;;;57574:281;;;;57878:12;57863;:27;;;;57897:60;57926:1;57930:2;57934:12;57948:8;57897:20;:60::i;:::-;56789:1174;;;56691:1272;;;:::o;62697:141::-;;;;;:::o;63224:140::-;;;;;:::o;19291:422::-;19351:4;19559:12;19670:7;19658:20;19650:28;;19704:1;19697:4;:8;19690:15;;;19291:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:553::-;1844:8;1854:6;1904:3;1897:4;1889:6;1885:17;1881:27;1871:122;;1912:79;;:::i;:::-;1871:122;2025:6;2012:20;2002:30;;2055:18;2047:6;2044:30;2041:117;;;2077:79;;:::i;:::-;2041:117;2191:4;2183:6;2179:17;2167:29;;2245:3;2237:4;2229:6;2225:17;2215:8;2211:32;2208:41;2205:128;;;2252:79;;:::i;:::-;2205:128;1786:553;;;;;:::o;2359:340::-;2415:5;2464:3;2457:4;2449:6;2445:17;2441:27;2431:122;;2472:79;;:::i;:::-;2431:122;2589:6;2576:20;2614:79;2689:3;2681:6;2674:4;2666:6;2662:17;2614:79;:::i;:::-;2605:88;;2421:278;2359:340;;;;:::o;2705:139::-;2751:5;2789:6;2776:20;2767:29;;2805:33;2832:5;2805:33;:::i;:::-;2705:139;;;;:::o;2850:329::-;2909:6;2958:2;2946:9;2937:7;2933:23;2929:32;2926:119;;;2964:79;;:::i;:::-;2926:119;3084:1;3109:53;3154:7;3145:6;3134:9;3130:22;3109:53;:::i;:::-;3099:63;;3055:117;2850:329;;;;:::o;3185:474::-;3253:6;3261;3310:2;3298:9;3289:7;3285:23;3281:32;3278:119;;;3316:79;;:::i;:::-;3278:119;3436:1;3461:53;3506:7;3497:6;3486:9;3482:22;3461:53;:::i;:::-;3451:63;;3407:117;3563:2;3589:53;3634:7;3625:6;3614:9;3610:22;3589:53;:::i;:::-;3579:63;;3534:118;3185:474;;;;;:::o;3665:619::-;3742:6;3750;3758;3807:2;3795:9;3786:7;3782:23;3778:32;3775:119;;;3813:79;;:::i;:::-;3775:119;3933:1;3958:53;4003:7;3994:6;3983:9;3979:22;3958:53;:::i;:::-;3948:63;;3904:117;4060:2;4086:53;4131:7;4122:6;4111:9;4107:22;4086:53;:::i;:::-;4076:63;;4031:118;4188:2;4214:53;4259:7;4250:6;4239:9;4235:22;4214:53;:::i;:::-;4204:63;;4159:118;3665:619;;;;;:::o;4290:943::-;4385:6;4393;4401;4409;4458:3;4446:9;4437:7;4433:23;4429:33;4426:120;;;4465:79;;:::i;:::-;4426:120;4585:1;4610:53;4655:7;4646:6;4635:9;4631:22;4610:53;:::i;:::-;4600:63;;4556:117;4712:2;4738:53;4783:7;4774:6;4763:9;4759:22;4738:53;:::i;:::-;4728:63;;4683:118;4840:2;4866:53;4911:7;4902:6;4891:9;4887:22;4866:53;:::i;:::-;4856:63;;4811:118;4996:2;4985:9;4981:18;4968:32;5027:18;5019:6;5016:30;5013:117;;;5049:79;;:::i;:::-;5013:117;5154:62;5208:7;5199:6;5188:9;5184:22;5154:62;:::i;:::-;5144:72;;4939:287;4290:943;;;;;;;:::o;5239:468::-;5304:6;5312;5361:2;5349:9;5340:7;5336:23;5332:32;5329:119;;;5367:79;;:::i;:::-;5329:119;5487:1;5512:53;5557:7;5548:6;5537:9;5533:22;5512:53;:::i;:::-;5502:63;;5458:117;5614:2;5640:50;5682:7;5673:6;5662:9;5658:22;5640:50;:::i;:::-;5630:60;;5585:115;5239:468;;;;;:::o;5713:474::-;5781:6;5789;5838:2;5826:9;5817:7;5813:23;5809:32;5806:119;;;5844:79;;:::i;:::-;5806:119;5964:1;5989:53;6034:7;6025:6;6014:9;6010:22;5989:53;:::i;:::-;5979:63;;5935:117;6091:2;6117:53;6162:7;6153:6;6142:9;6138:22;6117:53;:::i;:::-;6107:63;;6062:118;5713:474;;;;;:::o;6193:327::-;6251:6;6300:2;6288:9;6279:7;6275:23;6271:32;6268:119;;;6306:79;;:::i;:::-;6268:119;6426:1;6451:52;6495:7;6486:6;6475:9;6471:22;6451:52;:::i;:::-;6441:62;;6397:116;6193:327;;;;:::o;6526:349::-;6595:6;6644:2;6632:9;6623:7;6619:23;6615:32;6612:119;;;6650:79;;:::i;:::-;6612:119;6770:1;6795:63;6850:7;6841:6;6830:9;6826:22;6795:63;:::i;:::-;6785:73;;6741:127;6526:349;;;;:::o;6881:529::-;6952:6;6960;7009:2;6997:9;6988:7;6984:23;6980:32;6977:119;;;7015:79;;:::i;:::-;6977:119;7163:1;7152:9;7148:17;7135:31;7193:18;7185:6;7182:30;7179:117;;;7215:79;;:::i;:::-;7179:117;7328:65;7385:7;7376:6;7365:9;7361:22;7328:65;:::i;:::-;7310:83;;;;7106:297;6881:529;;;;;:::o;7416:509::-;7485:6;7534:2;7522:9;7513:7;7509:23;7505:32;7502:119;;;7540:79;;:::i;:::-;7502:119;7688:1;7677:9;7673:17;7660:31;7718:18;7710:6;7707:30;7704:117;;;7740:79;;:::i;:::-;7704:117;7845:63;7900:7;7891:6;7880:9;7876:22;7845:63;:::i;:::-;7835:73;;7631:287;7416:509;;;;:::o;7931:329::-;7990:6;8039:2;8027:9;8018:7;8014:23;8010:32;8007:119;;;8045:79;;:::i;:::-;8007:119;8165:1;8190:53;8235:7;8226:6;8215:9;8211:22;8190:53;:::i;:::-;8180:63;;8136:117;7931:329;;;;:::o;8266:179::-;8335:10;8356:46;8398:3;8390:6;8356:46;:::i;:::-;8434:4;8429:3;8425:14;8411:28;;8266:179;;;;:::o;8451:118::-;8538:24;8556:5;8538:24;:::i;:::-;8533:3;8526:37;8451:118;;:::o;8605:732::-;8724:3;8753:54;8801:5;8753:54;:::i;:::-;8823:86;8902:6;8897:3;8823:86;:::i;:::-;8816:93;;8933:56;8983:5;8933:56;:::i;:::-;9012:7;9043:1;9028:284;9053:6;9050:1;9047:13;9028:284;;;9129:6;9123:13;9156:63;9215:3;9200:13;9156:63;:::i;:::-;9149:70;;9242:60;9295:6;9242:60;:::i;:::-;9232:70;;9088:224;9075:1;9072;9068:9;9063:14;;9028:284;;;9032:14;9328:3;9321:10;;8729:608;;;8605:732;;;;:::o;9343:109::-;9424:21;9439:5;9424:21;:::i;:::-;9419:3;9412:34;9343:109;;:::o;9458:360::-;9544:3;9572:38;9604:5;9572:38;:::i;:::-;9626:70;9689:6;9684:3;9626:70;:::i;:::-;9619:77;;9705:52;9750:6;9745:3;9738:4;9731:5;9727:16;9705:52;:::i;:::-;9782:29;9804:6;9782:29;:::i;:::-;9777:3;9773:39;9766:46;;9548:270;9458:360;;;;:::o;9824:364::-;9912:3;9940:39;9973:5;9940:39;:::i;:::-;9995:71;10059:6;10054:3;9995:71;:::i;:::-;9988:78;;10075:52;10120:6;10115:3;10108:4;10101:5;10097:16;10075:52;:::i;:::-;10152:29;10174:6;10152:29;:::i;:::-;10147:3;10143:39;10136:46;;9916:272;9824:364;;;;:::o;10194:377::-;10300:3;10328:39;10361:5;10328:39;:::i;:::-;10383:89;10465:6;10460:3;10383:89;:::i;:::-;10376:96;;10481:52;10526:6;10521:3;10514:4;10507:5;10503:16;10481:52;:::i;:::-;10558:6;10553:3;10549:16;10542:23;;10304:267;10194:377;;;;:::o;10601:802::-;10686:3;10723:5;10717:12;10752:36;10778:9;10752:36;:::i;:::-;10804:71;10868:6;10863:3;10804:71;:::i;:::-;10797:78;;10906:1;10895:9;10891:17;10922:1;10917:135;;;;11066:1;11061:336;;;;10884:513;;10917:135;11001:4;10997:9;10986;10982:25;10977:3;10970:38;11037:4;11032:3;11028:14;11021:21;;10917:135;;11061:336;11128:38;11160:5;11128:38;:::i;:::-;11188:1;11202:154;11216:6;11213:1;11210:13;11202:154;;;11290:7;11284:14;11280:1;11275:3;11271:11;11264:35;11340:1;11331:7;11327:15;11316:26;;11238:4;11235:1;11231:12;11226:17;;11202:154;;;11385:1;11380:3;11376:11;11369:18;;11068:329;;10884:513;;10690:713;;10601:802;;;;:::o;11409:366::-;11551:3;11572:67;11636:2;11631:3;11572:67;:::i;:::-;11565:74;;11648:93;11737:3;11648:93;:::i;:::-;11766:2;11761:3;11757:12;11750:19;;11409:366;;;:::o;11781:::-;11923:3;11944:67;12008:2;12003:3;11944:67;:::i;:::-;11937:74;;12020:93;12109:3;12020:93;:::i;:::-;12138:2;12133:3;12129:12;12122:19;;11781:366;;;:::o;12153:::-;12295:3;12316:67;12380:2;12375:3;12316:67;:::i;:::-;12309:74;;12392:93;12481:3;12392:93;:::i;:::-;12510:2;12505:3;12501:12;12494:19;;12153:366;;;:::o;12525:::-;12667:3;12688:67;12752:2;12747:3;12688:67;:::i;:::-;12681:74;;12764:93;12853:3;12764:93;:::i;:::-;12882:2;12877:3;12873:12;12866:19;;12525:366;;;:::o;12897:::-;13039:3;13060:67;13124:2;13119:3;13060:67;:::i;:::-;13053:74;;13136:93;13225:3;13136:93;:::i;:::-;13254:2;13249:3;13245:12;13238:19;;12897:366;;;:::o;13269:::-;13411:3;13432:67;13496:2;13491:3;13432:67;:::i;:::-;13425:74;;13508:93;13597:3;13508:93;:::i;:::-;13626:2;13621:3;13617:12;13610:19;;13269:366;;;:::o;13641:::-;13783:3;13804:67;13868:2;13863:3;13804:67;:::i;:::-;13797:74;;13880:93;13969:3;13880:93;:::i;:::-;13998:2;13993:3;13989:12;13982:19;;13641:366;;;:::o;14013:::-;14155:3;14176:67;14240:2;14235:3;14176:67;:::i;:::-;14169:74;;14252:93;14341:3;14252:93;:::i;:::-;14370:2;14365:3;14361:12;14354:19;;14013:366;;;:::o;14385:::-;14527:3;14548:67;14612:2;14607:3;14548:67;:::i;:::-;14541:74;;14624:93;14713:3;14624:93;:::i;:::-;14742:2;14737:3;14733:12;14726:19;;14385:366;;;:::o;14757:::-;14899:3;14920:67;14984:2;14979:3;14920:67;:::i;:::-;14913:74;;14996:93;15085:3;14996:93;:::i;:::-;15114:2;15109:3;15105:12;15098:19;;14757:366;;;:::o;15129:::-;15271:3;15292:67;15356:2;15351:3;15292:67;:::i;:::-;15285:74;;15368:93;15457:3;15368:93;:::i;:::-;15486:2;15481:3;15477:12;15470:19;;15129:366;;;:::o;15501:::-;15643:3;15664:67;15728:2;15723:3;15664:67;:::i;:::-;15657:74;;15740:93;15829:3;15740:93;:::i;:::-;15858:2;15853:3;15849:12;15842:19;;15501:366;;;:::o;15873:::-;16015:3;16036:67;16100:2;16095:3;16036:67;:::i;:::-;16029:74;;16112:93;16201:3;16112:93;:::i;:::-;16230:2;16225:3;16221:12;16214:19;;15873:366;;;:::o;16245:::-;16387:3;16408:67;16472:2;16467:3;16408:67;:::i;:::-;16401:74;;16484:93;16573:3;16484:93;:::i;:::-;16602:2;16597:3;16593:12;16586:19;;16245:366;;;:::o;16617:::-;16759:3;16780:67;16844:2;16839:3;16780:67;:::i;:::-;16773:74;;16856:93;16945:3;16856:93;:::i;:::-;16974:2;16969:3;16965:12;16958:19;;16617:366;;;:::o;16989:::-;17131:3;17152:67;17216:2;17211:3;17152:67;:::i;:::-;17145:74;;17228:93;17317:3;17228:93;:::i;:::-;17346:2;17341:3;17337:12;17330:19;;16989:366;;;:::o;17361:::-;17503:3;17524:67;17588:2;17583:3;17524:67;:::i;:::-;17517:74;;17600:93;17689:3;17600:93;:::i;:::-;17718:2;17713:3;17709:12;17702:19;;17361:366;;;:::o;17733:::-;17875:3;17896:67;17960:2;17955:3;17896:67;:::i;:::-;17889:74;;17972:93;18061:3;17972:93;:::i;:::-;18090:2;18085:3;18081:12;18074:19;;17733:366;;;:::o;18105:::-;18247:3;18268:67;18332:2;18327:3;18268:67;:::i;:::-;18261:74;;18344:93;18433:3;18344:93;:::i;:::-;18462:2;18457:3;18453:12;18446:19;;18105:366;;;:::o;18477:::-;18619:3;18640:67;18704:2;18699:3;18640:67;:::i;:::-;18633:74;;18716:93;18805:3;18716:93;:::i;:::-;18834:2;18829:3;18825:12;18818:19;;18477:366;;;:::o;18849:::-;18991:3;19012:67;19076:2;19071:3;19012:67;:::i;:::-;19005:74;;19088:93;19177:3;19088:93;:::i;:::-;19206:2;19201:3;19197:12;19190:19;;18849:366;;;:::o;19221:::-;19363:3;19384:67;19448:2;19443:3;19384:67;:::i;:::-;19377:74;;19460:93;19549:3;19460:93;:::i;:::-;19578:2;19573:3;19569:12;19562:19;;19221:366;;;:::o;19593:::-;19735:3;19756:67;19820:2;19815:3;19756:67;:::i;:::-;19749:74;;19832:93;19921:3;19832:93;:::i;:::-;19950:2;19945:3;19941:12;19934:19;;19593:366;;;:::o;19965:::-;20107:3;20128:67;20192:2;20187:3;20128:67;:::i;:::-;20121:74;;20204:93;20293:3;20204:93;:::i;:::-;20322:2;20317:3;20313:12;20306:19;;19965:366;;;:::o;20337:::-;20479:3;20500:67;20564:2;20559:3;20500:67;:::i;:::-;20493:74;;20576:93;20665:3;20576:93;:::i;:::-;20694:2;20689:3;20685:12;20678:19;;20337:366;;;:::o;20709:::-;20851:3;20872:67;20936:2;20931:3;20872:67;:::i;:::-;20865:74;;20948:93;21037:3;20948:93;:::i;:::-;21066:2;21061:3;21057:12;21050:19;;20709:366;;;:::o;21081:::-;21223:3;21244:67;21308:2;21303:3;21244:67;:::i;:::-;21237:74;;21320:93;21409:3;21320:93;:::i;:::-;21438:2;21433:3;21429:12;21422:19;;21081:366;;;:::o;21453:::-;21595:3;21616:67;21680:2;21675:3;21616:67;:::i;:::-;21609:74;;21692:93;21781:3;21692:93;:::i;:::-;21810:2;21805:3;21801:12;21794:19;;21453:366;;;:::o;21825:::-;21967:3;21988:67;22052:2;22047:3;21988:67;:::i;:::-;21981:74;;22064:93;22153:3;22064:93;:::i;:::-;22182:2;22177:3;22173:12;22166:19;;21825:366;;;:::o;22197:::-;22339:3;22360:67;22424:2;22419:3;22360:67;:::i;:::-;22353:74;;22436:93;22525:3;22436:93;:::i;:::-;22554:2;22549:3;22545:12;22538:19;;22197:366;;;:::o;22569:::-;22711:3;22732:67;22796:2;22791:3;22732:67;:::i;:::-;22725:74;;22808:93;22897:3;22808:93;:::i;:::-;22926:2;22921:3;22917:12;22910:19;;22569:366;;;:::o;22941:::-;23083:3;23104:67;23168:2;23163:3;23104:67;:::i;:::-;23097:74;;23180:93;23269:3;23180:93;:::i;:::-;23298:2;23293:3;23289:12;23282:19;;22941:366;;;:::o;23313:::-;23455:3;23476:67;23540:2;23535:3;23476:67;:::i;:::-;23469:74;;23552:93;23641:3;23552:93;:::i;:::-;23670:2;23665:3;23661:12;23654:19;;23313:366;;;:::o;23685:::-;23827:3;23848:67;23912:2;23907:3;23848:67;:::i;:::-;23841:74;;23924:93;24013:3;23924:93;:::i;:::-;24042:2;24037:3;24033:12;24026:19;;23685:366;;;:::o;24057:108::-;24134:24;24152:5;24134:24;:::i;:::-;24129:3;24122:37;24057:108;;:::o;24171:118::-;24258:24;24276:5;24258:24;:::i;:::-;24253:3;24246:37;24171:118;;:::o;24295:435::-;24475:3;24497:95;24588:3;24579:6;24497:95;:::i;:::-;24490:102;;24609:95;24700:3;24691:6;24609:95;:::i;:::-;24602:102;;24721:3;24714:10;;24295:435;;;;;:::o;24736:222::-;24829:4;24867:2;24856:9;24852:18;24844:26;;24880:71;24948:1;24937:9;24933:17;24924:6;24880:71;:::i;:::-;24736:222;;;;:::o;24964:640::-;25159:4;25197:3;25186:9;25182:19;25174:27;;25211:71;25279:1;25268:9;25264:17;25255:6;25211:71;:::i;:::-;25292:72;25360:2;25349:9;25345:18;25336:6;25292:72;:::i;:::-;25374;25442:2;25431:9;25427:18;25418:6;25374:72;:::i;:::-;25493:9;25487:4;25483:20;25478:2;25467:9;25463:18;25456:48;25521:76;25592:4;25583:6;25521:76;:::i;:::-;25513:84;;24964:640;;;;;;;:::o;25610:373::-;25753:4;25791:2;25780:9;25776:18;25768:26;;25840:9;25834:4;25830:20;25826:1;25815:9;25811:17;25804:47;25868:108;25971:4;25962:6;25868:108;:::i;:::-;25860:116;;25610:373;;;;:::o;25989:210::-;26076:4;26114:2;26103:9;26099:18;26091:26;;26127:65;26189:1;26178:9;26174:17;26165:6;26127:65;:::i;:::-;25989:210;;;;:::o;26205:313::-;26318:4;26356:2;26345:9;26341:18;26333:26;;26405:9;26399:4;26395:20;26391:1;26380:9;26376:17;26369:47;26433:78;26506:4;26497:6;26433:78;:::i;:::-;26425:86;;26205:313;;;;:::o;26524:307::-;26634:4;26672:2;26661:9;26657:18;26649:26;;26721:9;26715:4;26711:20;26707:1;26696:9;26692:17;26685:47;26749:75;26819:4;26810:6;26749:75;:::i;:::-;26741:83;;26524:307;;;;:::o;26837:419::-;27003:4;27041:2;27030:9;27026:18;27018:26;;27090:9;27084:4;27080:20;27076:1;27065:9;27061:17;27054:47;27118:131;27244:4;27118:131;:::i;:::-;27110:139;;26837:419;;;:::o;27262:::-;27428:4;27466:2;27455:9;27451:18;27443:26;;27515:9;27509:4;27505:20;27501:1;27490:9;27486:17;27479:47;27543:131;27669:4;27543:131;:::i;:::-;27535:139;;27262:419;;;:::o;27687:::-;27853:4;27891:2;27880:9;27876:18;27868:26;;27940:9;27934:4;27930:20;27926:1;27915:9;27911:17;27904:47;27968:131;28094:4;27968:131;:::i;:::-;27960:139;;27687:419;;;:::o;28112:::-;28278:4;28316:2;28305:9;28301:18;28293:26;;28365:9;28359:4;28355:20;28351:1;28340:9;28336:17;28329:47;28393:131;28519:4;28393:131;:::i;:::-;28385:139;;28112:419;;;:::o;28537:::-;28703:4;28741:2;28730:9;28726:18;28718:26;;28790:9;28784:4;28780:20;28776:1;28765:9;28761:17;28754:47;28818:131;28944:4;28818:131;:::i;:::-;28810:139;;28537:419;;;:::o;28962:::-;29128:4;29166:2;29155:9;29151:18;29143:26;;29215:9;29209:4;29205:20;29201:1;29190:9;29186:17;29179:47;29243:131;29369:4;29243:131;:::i;:::-;29235:139;;28962:419;;;:::o;29387:::-;29553:4;29591:2;29580:9;29576:18;29568:26;;29640:9;29634:4;29630:20;29626:1;29615:9;29611:17;29604:47;29668:131;29794:4;29668:131;:::i;:::-;29660:139;;29387:419;;;:::o;29812:::-;29978:4;30016:2;30005:9;30001:18;29993:26;;30065:9;30059:4;30055:20;30051:1;30040:9;30036:17;30029:47;30093:131;30219:4;30093:131;:::i;:::-;30085:139;;29812:419;;;:::o;30237:::-;30403:4;30441:2;30430:9;30426:18;30418:26;;30490:9;30484:4;30480:20;30476:1;30465:9;30461:17;30454:47;30518:131;30644:4;30518:131;:::i;:::-;30510:139;;30237:419;;;:::o;30662:::-;30828:4;30866:2;30855:9;30851:18;30843:26;;30915:9;30909:4;30905:20;30901:1;30890:9;30886:17;30879:47;30943:131;31069:4;30943:131;:::i;:::-;30935:139;;30662:419;;;:::o;31087:::-;31253:4;31291:2;31280:9;31276:18;31268:26;;31340:9;31334:4;31330:20;31326:1;31315:9;31311:17;31304:47;31368:131;31494:4;31368:131;:::i;:::-;31360:139;;31087:419;;;:::o;31512:::-;31678:4;31716:2;31705:9;31701:18;31693:26;;31765:9;31759:4;31755:20;31751:1;31740:9;31736:17;31729:47;31793:131;31919:4;31793:131;:::i;:::-;31785:139;;31512:419;;;:::o;31937:::-;32103:4;32141:2;32130:9;32126:18;32118:26;;32190:9;32184:4;32180:20;32176:1;32165:9;32161:17;32154:47;32218:131;32344:4;32218:131;:::i;:::-;32210:139;;31937:419;;;:::o;32362:::-;32528:4;32566:2;32555:9;32551:18;32543:26;;32615:9;32609:4;32605:20;32601:1;32590:9;32586:17;32579:47;32643:131;32769:4;32643:131;:::i;:::-;32635:139;;32362:419;;;:::o;32787:::-;32953:4;32991:2;32980:9;32976:18;32968:26;;33040:9;33034:4;33030:20;33026:1;33015:9;33011:17;33004:47;33068:131;33194:4;33068:131;:::i;:::-;33060:139;;32787:419;;;:::o;33212:::-;33378:4;33416:2;33405:9;33401:18;33393:26;;33465:9;33459:4;33455:20;33451:1;33440:9;33436:17;33429:47;33493:131;33619:4;33493:131;:::i;:::-;33485:139;;33212:419;;;:::o;33637:::-;33803:4;33841:2;33830:9;33826:18;33818:26;;33890:9;33884:4;33880:20;33876:1;33865:9;33861:17;33854:47;33918:131;34044:4;33918:131;:::i;:::-;33910:139;;33637:419;;;:::o;34062:::-;34228:4;34266:2;34255:9;34251:18;34243:26;;34315:9;34309:4;34305:20;34301:1;34290:9;34286:17;34279:47;34343:131;34469:4;34343:131;:::i;:::-;34335:139;;34062:419;;;:::o;34487:::-;34653:4;34691:2;34680:9;34676:18;34668:26;;34740:9;34734:4;34730:20;34726:1;34715:9;34711:17;34704:47;34768:131;34894:4;34768:131;:::i;:::-;34760:139;;34487:419;;;:::o;34912:::-;35078:4;35116:2;35105:9;35101:18;35093:26;;35165:9;35159:4;35155:20;35151:1;35140:9;35136:17;35129:47;35193:131;35319:4;35193:131;:::i;:::-;35185:139;;34912:419;;;:::o;35337:::-;35503:4;35541:2;35530:9;35526:18;35518:26;;35590:9;35584:4;35580:20;35576:1;35565:9;35561:17;35554:47;35618:131;35744:4;35618:131;:::i;:::-;35610:139;;35337:419;;;:::o;35762:::-;35928:4;35966:2;35955:9;35951:18;35943:26;;36015:9;36009:4;36005:20;36001:1;35990:9;35986:17;35979:47;36043:131;36169:4;36043:131;:::i;:::-;36035:139;;35762:419;;;:::o;36187:::-;36353:4;36391:2;36380:9;36376:18;36368:26;;36440:9;36434:4;36430:20;36426:1;36415:9;36411:17;36404:47;36468:131;36594:4;36468:131;:::i;:::-;36460:139;;36187:419;;;:::o;36612:::-;36778:4;36816:2;36805:9;36801:18;36793:26;;36865:9;36859:4;36855:20;36851:1;36840:9;36836:17;36829:47;36893:131;37019:4;36893:131;:::i;:::-;36885:139;;36612:419;;;:::o;37037:::-;37203:4;37241:2;37230:9;37226:18;37218:26;;37290:9;37284:4;37280:20;37276:1;37265:9;37261:17;37254:47;37318:131;37444:4;37318:131;:::i;:::-;37310:139;;37037:419;;;:::o;37462:::-;37628:4;37666:2;37655:9;37651:18;37643:26;;37715:9;37709:4;37705:20;37701:1;37690:9;37686:17;37679:47;37743:131;37869:4;37743:131;:::i;:::-;37735:139;;37462:419;;;:::o;37887:::-;38053:4;38091:2;38080:9;38076:18;38068:26;;38140:9;38134:4;38130:20;38126:1;38115:9;38111:17;38104:47;38168:131;38294:4;38168:131;:::i;:::-;38160:139;;37887:419;;;:::o;38312:::-;38478:4;38516:2;38505:9;38501:18;38493:26;;38565:9;38559:4;38555:20;38551:1;38540:9;38536:17;38529:47;38593:131;38719:4;38593:131;:::i;:::-;38585:139;;38312:419;;;:::o;38737:::-;38903:4;38941:2;38930:9;38926:18;38918:26;;38990:9;38984:4;38980:20;38976:1;38965:9;38961:17;38954:47;39018:131;39144:4;39018:131;:::i;:::-;39010:139;;38737:419;;;:::o;39162:::-;39328:4;39366:2;39355:9;39351:18;39343:26;;39415:9;39409:4;39405:20;39401:1;39390:9;39386:17;39379:47;39443:131;39569:4;39443:131;:::i;:::-;39435:139;;39162:419;;;:::o;39587:::-;39753:4;39791:2;39780:9;39776:18;39768:26;;39840:9;39834:4;39830:20;39826:1;39815:9;39811:17;39804:47;39868:131;39994:4;39868:131;:::i;:::-;39860:139;;39587:419;;;:::o;40012:::-;40178:4;40216:2;40205:9;40201:18;40193:26;;40265:9;40259:4;40255:20;40251:1;40240:9;40236:17;40229:47;40293:131;40419:4;40293:131;:::i;:::-;40285:139;;40012:419;;;:::o;40437:::-;40603:4;40641:2;40630:9;40626:18;40618:26;;40690:9;40684:4;40680:20;40676:1;40665:9;40661:17;40654:47;40718:131;40844:4;40718:131;:::i;:::-;40710:139;;40437:419;;;:::o;40862:::-;41028:4;41066:2;41055:9;41051:18;41043:26;;41115:9;41109:4;41105:20;41101:1;41090:9;41086:17;41079:47;41143:131;41269:4;41143:131;:::i;:::-;41135:139;;40862:419;;;:::o;41287:222::-;41380:4;41418:2;41407:9;41403:18;41395:26;;41431:71;41499:1;41488:9;41484:17;41475:6;41431:71;:::i;:::-;41287:222;;;;:::o;41515:129::-;41549:6;41576:20;;:::i;:::-;41566:30;;41605:33;41633:4;41625:6;41605:33;:::i;:::-;41515:129;;;:::o;41650:75::-;41683:6;41716:2;41710:9;41700:19;;41650:75;:::o;41731:307::-;41792:4;41882:18;41874:6;41871:30;41868:56;;;41904:18;;:::i;:::-;41868:56;41942:29;41964:6;41942:29;:::i;:::-;41934:37;;42026:4;42020;42016:15;42008:23;;41731:307;;;:::o;42044:308::-;42106:4;42196:18;42188:6;42185:30;42182:56;;;42218:18;;:::i;:::-;42182:56;42256:29;42278:6;42256:29;:::i;:::-;42248:37;;42340:4;42334;42330:15;42322:23;;42044:308;;;:::o;42358:132::-;42425:4;42448:3;42440:11;;42478:4;42473:3;42469:14;42461:22;;42358:132;;;:::o;42496:141::-;42545:4;42568:3;42560:11;;42591:3;42588:1;42581:14;42625:4;42622:1;42612:18;42604:26;;42496:141;;;:::o;42643:114::-;42710:6;42744:5;42738:12;42728:22;;42643:114;;;:::o;42763:98::-;42814:6;42848:5;42842:12;42832:22;;42763:98;;;:::o;42867:99::-;42919:6;42953:5;42947:12;42937:22;;42867:99;;;:::o;42972:113::-;43042:4;43074;43069:3;43065:14;43057:22;;42972:113;;;:::o;43091:184::-;43190:11;43224:6;43219:3;43212:19;43264:4;43259:3;43255:14;43240:29;;43091:184;;;;:::o;43281:168::-;43364:11;43398:6;43393:3;43386:19;43438:4;43433:3;43429:14;43414:29;;43281:168;;;;:::o;43455:169::-;43539:11;43573:6;43568:3;43561:19;43613:4;43608:3;43604:14;43589:29;;43455:169;;;;:::o;43630:148::-;43732:11;43769:3;43754:18;;43630:148;;;;:::o;43784:273::-;43824:3;43843:20;43861:1;43843:20;:::i;:::-;43838:25;;43877:20;43895:1;43877:20;:::i;:::-;43872:25;;43999:1;43963:34;43959:42;43956:1;43953:49;43950:75;;;44005:18;;:::i;:::-;43950:75;44049:1;44046;44042:9;44035:16;;43784:273;;;;:::o;44063:305::-;44103:3;44122:20;44140:1;44122:20;:::i;:::-;44117:25;;44156:20;44174:1;44156:20;:::i;:::-;44151:25;;44310:1;44242:66;44238:74;44235:1;44232:81;44229:107;;;44316:18;;:::i;:::-;44229:107;44360:1;44357;44353:9;44346:16;;44063:305;;;;:::o;44374:185::-;44414:1;44431:20;44449:1;44431:20;:::i;:::-;44426:25;;44465:20;44483:1;44465:20;:::i;:::-;44460:25;;44504:1;44494:35;;44509:18;;:::i;:::-;44494:35;44551:1;44548;44544:9;44539:14;;44374:185;;;;:::o;44565:348::-;44605:7;44628:20;44646:1;44628:20;:::i;:::-;44623:25;;44662:20;44680:1;44662:20;:::i;:::-;44657:25;;44850:1;44782:66;44778:74;44775:1;44772:81;44767:1;44760:9;44753:17;44749:105;44746:131;;;44857:18;;:::i;:::-;44746:131;44905:1;44902;44898:9;44887:20;;44565:348;;;;:::o;44919:191::-;44959:4;44979:20;44997:1;44979:20;:::i;:::-;44974:25;;45013:20;45031:1;45013:20;:::i;:::-;45008:25;;45052:1;45049;45046:8;45043:34;;;45057:18;;:::i;:::-;45043:34;45102:1;45099;45095:9;45087:17;;44919:191;;;;:::o;45116:::-;45156:4;45176:20;45194:1;45176:20;:::i;:::-;45171:25;;45210:20;45228:1;45210:20;:::i;:::-;45205:25;;45249:1;45246;45243:8;45240:34;;;45254:18;;:::i;:::-;45240:34;45299:1;45296;45292:9;45284:17;;45116:191;;;;:::o;45313:96::-;45350:7;45379:24;45397:5;45379:24;:::i;:::-;45368:35;;45313:96;;;:::o;45415:90::-;45449:7;45492:5;45485:13;45478:21;45467:32;;45415:90;;;:::o;45511:149::-;45547:7;45587:66;45580:5;45576:78;45565:89;;45511:149;;;:::o;45666:118::-;45703:7;45743:34;45736:5;45732:46;45721:57;;45666:118;;;:::o;45790:126::-;45827:7;45867:42;45860:5;45856:54;45845:65;;45790:126;;;:::o;45922:77::-;45959:7;45988:5;45977:16;;45922:77;;;:::o;46005:154::-;46089:6;46084:3;46079;46066:30;46151:1;46142:6;46137:3;46133:16;46126:27;46005:154;;;:::o;46165:307::-;46233:1;46243:113;46257:6;46254:1;46251:13;46243:113;;;46342:1;46337:3;46333:11;46327:18;46323:1;46318:3;46314:11;46307:39;46279:2;46276:1;46272:10;46267:15;;46243:113;;;46374:6;46371:1;46368:13;46365:101;;;46454:1;46445:6;46440:3;46436:16;46429:27;46365:101;46214:258;46165:307;;;:::o;46478:171::-;46517:3;46540:24;46558:5;46540:24;:::i;:::-;46531:33;;46586:4;46579:5;46576:15;46573:41;;;46594:18;;:::i;:::-;46573:41;46641:1;46634:5;46630:13;46623:20;;46478:171;;;:::o;46655:320::-;46699:6;46736:1;46730:4;46726:12;46716:22;;46783:1;46777:4;46773:12;46804:18;46794:81;;46860:4;46852:6;46848:17;46838:27;;46794:81;46922:2;46914:6;46911:14;46891:18;46888:38;46885:84;;;46941:18;;:::i;:::-;46885:84;46706:269;46655:320;;;:::o;46981:281::-;47064:27;47086:4;47064:27;:::i;:::-;47056:6;47052:40;47194:6;47182:10;47179:22;47158:18;47146:10;47143:34;47140:62;47137:88;;;47205:18;;:::i;:::-;47137:88;47245:10;47241:2;47234:22;47024:238;46981:281;;:::o;47268:233::-;47307:3;47330:24;47348:5;47330:24;:::i;:::-;47321:33;;47376:66;47369:5;47366:77;47363:103;;;47446:18;;:::i;:::-;47363:103;47493:1;47486:5;47482:13;47475:20;;47268:233;;;:::o;47507:176::-;47539:1;47556:20;47574:1;47556:20;:::i;:::-;47551:25;;47590:20;47608:1;47590:20;:::i;:::-;47585:25;;47629:1;47619:35;;47634:18;;:::i;:::-;47619:35;47675:1;47672;47668:9;47663:14;;47507:176;;;;:::o;47689:180::-;47737:77;47734:1;47727:88;47834:4;47831:1;47824:15;47858:4;47855:1;47848:15;47875:180;47923:77;47920:1;47913:88;48020:4;48017:1;48010:15;48044:4;48041:1;48034:15;48061:180;48109:77;48106:1;48099:88;48206:4;48203:1;48196:15;48230:4;48227:1;48220:15;48247:180;48295:77;48292:1;48285:88;48392:4;48389:1;48382:15;48416:4;48413:1;48406:15;48433:180;48481:77;48478:1;48471:88;48578:4;48575:1;48568:15;48602:4;48599:1;48592:15;48619:117;48728:1;48725;48718:12;48742:117;48851:1;48848;48841:12;48865:117;48974:1;48971;48964:12;48988:117;49097:1;49094;49087:12;49111:117;49220:1;49217;49210:12;49234:117;49343:1;49340;49333:12;49357:102;49398:6;49449:2;49445:7;49440:2;49433:5;49429:14;49425:28;49415:38;;49357:102;;;:::o;49465:221::-;49605:34;49601:1;49593:6;49589:14;49582:58;49674:4;49669:2;49661:6;49657:15;49650:29;49465:221;:::o;49692:::-;49832:34;49828:1;49820:6;49816:14;49809:58;49901:4;49896:2;49888:6;49884:15;49877:29;49692:221;:::o;49919:225::-;50059:34;50055:1;50047:6;50043:14;50036:58;50128:8;50123:2;50115:6;50111:15;50104:33;49919:225;:::o;50150:229::-;50290:34;50286:1;50278:6;50274:14;50267:58;50359:12;50354:2;50346:6;50342:15;50335:37;50150:229;:::o;50385:177::-;50525:29;50521:1;50513:6;50509:14;50502:53;50385:177;:::o;50568:222::-;50708:34;50704:1;50696:6;50692:14;50685:58;50777:5;50772:2;50764:6;50760:15;50753:30;50568:222;:::o;50796:224::-;50936:34;50932:1;50924:6;50920:14;50913:58;51005:7;51000:2;50992:6;50988:15;50981:32;50796:224;:::o;51026:181::-;51166:33;51162:1;51154:6;51150:14;51143:57;51026:181;:::o;51213:220::-;51353:34;51349:1;51341:6;51337:14;51330:58;51422:3;51417:2;51409:6;51405:15;51398:28;51213:220;:::o;51439:228::-;51579:34;51575:1;51567:6;51563:14;51556:58;51648:11;51643:2;51635:6;51631:15;51624:36;51439:228;:::o;51673:229::-;51813:34;51809:1;51801:6;51797:14;51790:58;51882:12;51877:2;51869:6;51865:15;51858:37;51673:229;:::o;51908:297::-;52048:34;52044:1;52036:6;52032:14;52025:58;52117:34;52112:2;52104:6;52100:15;52093:59;52186:11;52181:2;52173:6;52169:15;52162:36;51908:297;:::o;52211:244::-;52351:34;52347:1;52339:6;52335:14;52328:58;52420:27;52415:2;52407:6;52403:15;52396:52;52211:244;:::o;52461:238::-;52601:34;52597:1;52589:6;52585:14;52578:58;52670:21;52665:2;52657:6;52653:15;52646:46;52461:238;:::o;52705:223::-;52845:34;52841:1;52833:6;52829:14;52822:58;52914:6;52909:2;52901:6;52897:15;52890:31;52705:223;:::o;52934:230::-;53074:34;53070:1;53062:6;53058:14;53051:58;53143:13;53138:2;53130:6;53126:15;53119:38;52934:230;:::o;53170:220::-;53310:34;53306:1;53298:6;53294:14;53287:58;53379:3;53374:2;53366:6;53362:15;53355:28;53170:220;:::o;53396:225::-;53536:34;53532:1;53524:6;53520:14;53513:58;53605:8;53600:2;53592:6;53588:15;53581:33;53396:225;:::o;53627:182::-;53767:34;53763:1;53755:6;53751:14;53744:58;53627:182;:::o;53815:234::-;53955:34;53951:1;53943:6;53939:14;53932:58;54024:17;54019:2;54011:6;54007:15;54000:42;53815:234;:::o;54055:176::-;54195:28;54191:1;54183:6;54179:14;54172:52;54055:176;:::o;54237:237::-;54377:34;54373:1;54365:6;54361:14;54354:58;54446:20;54441:2;54433:6;54429:15;54422:45;54237:237;:::o;54480:231::-;54620:34;54616:1;54608:6;54604:14;54597:58;54689:14;54684:2;54676:6;54672:15;54665:39;54480:231;:::o;54717:221::-;54857:34;54853:1;54845:6;54841:14;54834:58;54926:4;54921:2;54913:6;54909:15;54902:29;54717:221;:::o;54944:172::-;55084:24;55080:1;55072:6;55068:14;55061:48;54944:172;:::o;55122:225::-;55262:34;55258:1;55250:6;55246:14;55239:58;55331:8;55326:2;55318:6;55314:15;55307:33;55122:225;:::o;55353:238::-;55493:34;55489:1;55481:6;55477:14;55470:58;55562:21;55557:2;55549:6;55545:15;55538:46;55353:238;:::o;55597:179::-;55737:31;55733:1;55725:6;55721:14;55714:55;55597:179;:::o;55782:220::-;55922:34;55918:1;55910:6;55906:14;55899:58;55991:3;55986:2;55978:6;55974:15;55967:28;55782:220;:::o;56008:233::-;56148:34;56144:1;56136:6;56132:14;56125:58;56217:16;56212:2;56204:6;56200:15;56193:41;56008:233;:::o;56247:234::-;56387:34;56383:1;56375:6;56371:14;56364:58;56456:17;56451:2;56443:6;56439:15;56432:42;56247:234;:::o;56487:176::-;56627:28;56623:1;56615:6;56611:14;56604:52;56487:176;:::o;56669:232::-;56809:34;56805:1;56797:6;56793:14;56786:58;56878:15;56873:2;56865:6;56861:15;56854:40;56669:232;:::o;56907:221::-;57047:34;57043:1;57035:6;57031:14;57024:58;57116:4;57111:2;57103:6;57099:15;57092:29;56907:221;:::o;57134:122::-;57207:24;57225:5;57207:24;:::i;:::-;57200:5;57197:35;57187:63;;57246:1;57243;57236:12;57187:63;57134:122;:::o;57262:116::-;57332:21;57347:5;57332:21;:::i;:::-;57325:5;57322:32;57312:60;;57368:1;57365;57358:12;57312:60;57262:116;:::o;57384:120::-;57456:23;57473:5;57456:23;:::i;:::-;57449:5;57446:34;57436:62;;57494:1;57491;57484:12;57436:62;57384:120;:::o;57510:122::-;57583:24;57601:5;57583:24;:::i;:::-;57576:5;57573:35;57563:63;;57622:1;57619;57612:12;57563:63;57510:122;:::o
Swarm Source
ipfs://45d8b5d4618563ced12653584871921013ec34b72137493a12d40dabf8dbc70f
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.