Source Code
Overview
ETH Balance
0.08 ETH
Eth Value
$175.22 (@ $2,190.20/ETH)More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 15 from a total of 15 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Adopt Donkey | 14882272 | 1381 days ago | IN | 0 ETH | 0.00933516 | ||||
| Adopt Donkey | 14368571 | 1462 days ago | IN | 0 ETH | 0.0112104 | ||||
| Adopt Donkey | 14362502 | 1463 days ago | IN | 0 ETH | 0.01145951 | ||||
| Adopt Donkey | 14349073 | 1465 days ago | IN | 0 ETH | 0.02857361 | ||||
| Adopt Donkey | 14348694 | 1465 days ago | IN | 0 ETH | 0.02437589 | ||||
| Adopt Donkey | 14348529 | 1465 days ago | IN | 0 ETH | 0.01707903 | ||||
| Start Public Sal... | 14341620 | 1466 days ago | IN | 0 ETH | 0.00097802 | ||||
| Set Donkey Price | 14340188 | 1466 days ago | IN | 0 ETH | 0.00082275 | ||||
| Set Base URI | 14217648 | 1485 days ago | IN | 0 ETH | 0.00215358 | ||||
| Pause Public Sal... | 13939986 | 1528 days ago | IN | 0 ETH | 0.00277096 | ||||
| Set Provenance H... | 13907836 | 1533 days ago | IN | 0 ETH | 0.00863291 | ||||
| Adopt Donkey | 13907643 | 1533 days ago | IN | 0.08 ETH | 0.02890088 | ||||
| Start Public Sal... | 13907365 | 1533 days ago | IN | 0 ETH | 0.00338471 | ||||
| Set Base URI | 13907315 | 1533 days ago | IN | 0 ETH | 0.01126128 | ||||
| Set Miniature Do... | 13907297 | 1533 days ago | IN | 0 ETH | 0.00622324 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
DeformedDonkeys
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-12-30
*/
// SPDX-License-Identifier: GPL-3.0
/*
“I love NFT Twitter because it’s half 20-tweet threads about how blockchains will
be the Medicis of a new artistic renaissance and half guys trying to convince you
to spend $10,000 on stuff called, like, Darryl’s Deformed Donkeys.”
– Technology writer and New York Times columnist Kevin Roose, 28/09/2021
!heehaw CC0
*/
/* @@
@@@@@@.
/@@@@@@@@
@@@@@@@ @@@@@@@@@@@
@@@@@@@@@ @@@@@@@@@@@@
@@@@@@@@@@@ @@@@@@@@@@@@@.
@@@@@@@@@@@@ .@@@@@@ @@@@@@.
@@@@@@@@@@@@@@ #@@@@@@ @@@@@@@
@@@@@@@@@@@@@@@ @@@@@@@ @@@@@@&
@@@@@ @@@@@@@@@ @@@@@@@ @@@@@@.
@@@@@ @@@@@@@@@@ @@@@@@@/ @@@@@@.
@@@@@ @@@@@@@@@@ @@@@@@@@ *@@@@@@
@@@@. @@@@@@@@@@@ #@@@@@@@@ @@@@@@@
@@@@@ @@@@@@@@@@@ @@@@@@@@@ /@@@@@@#
@@@@@ @@@@@@@@@@@, @@@@@@@@@ @@@@@@@
(@@@@@ .@@@@@@@@@@@% @@@@@@@@@ @@@@@@@@
@@@@@ &@@@@@@@@@@@@ @@@@@@@@@ &@@@@@@@
@@@@@ @@@@@@@@@@@@@ &@@@@@@@@& @@@@@@@@
@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@ %@@@@@@@,
@@@@@@ &@@@@@@@@@@@@@ @@@@@@@@@ @@@@@@@@#
@@@@@@ @@@@@@@@@@@@@ (@@@@@@@@& @@@@@@@@.
@@@@@@ @@@@@@@@@@@@@@ @@@@@@@@@ @@@@@@@@
@@@@@* @@@@@@@@@@@@@@@ @@@@@@@@@@/ @@@@@@@@@
/@@@@@. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@, @@@@@@@@@
,@@@@@@(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%
@@@@@@@@@@@@@@@@@@@@@@@@@@ ,@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@ ,@@@@@@@@@@
.@@@@@@ @@@@@@@@ @@@@@@@@@@
@@@@@ @@@@@ @@@@@@@@@@
@@@@ ,@@@/@@@# %@@@@@ @@@@@@@@@@,
.@@@ %@@@@@@@@@ @@@@@@@ @@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@* @@@@@ @@@@@@@@@@@@
@@@@@ /@@@@@@( #@@@@@@@@@@@@@@@@@@@(
&@@@@@@ .@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@&@@@@ @@@@@@@( @@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@ @@ &@@@ #@@@@@@@@@@@@@@@@@@@@@@
@@/ @@@@ @@@ @@@@@@@@@@@@@@@@@@@@@
@@@ /@@@@ @@@@@@@ @@@@@@@@@
@@@@@@ @@@@@@ @@ @@@@@@@@@@@
@@@/(@@@@ %@@@@@&@ @@ @@@@@@@@@@@@@
@@@ @@@@@@% %@@@@@@@ #@ @@@@@@@@@@@@@@@@(
@@@ @@@ @@@@@@@@ @@@@@@@@@@@@@ @@ @@@@@@@@@@@@@@@@@@@@
@@@@.@@ %@@@@@@@@@@@@@% @@ @@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@* @@@ @@ @@@@@@@ @( @@@@@@@@@@@@
@@@@@@ @@@ @@@@@@@.@@@% .@@@@ @# @@@@@@@@@
@@@@ @@@ @@@@@ (@@ @@@ @@ @@@@@@
&@@@@@@* @@@ @@@@@@@@@ @@ @@ @ @@@.
@@@@@@@@@@@@@@@@########@@@@@@@@@@# @@@@ @ @@% @ @@@
@@@@* @@@@@@@@@@@@@@@@@@@@@@( @@@@@@@@@ & @@% @ @@
&@@@@/ @@@@@@@@@@@@@@ @@@@@@@@@@@@ @@@ @@.
@@@@@@@# (@@@@@@@@@@@@@@@@ @@@ &@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@ @@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ @@@* @@%
@@@@@@@@@@@@@@@@@@@@@@@@ *@ @@@@& @@@,
@@@@@@@@@@@@@@@@@@@@ @@ @@ @@% &@@
.@@ @ @@& @@@@@ &@@@
@@@ @@ &&@@&
@@@@@/ /@@@
&&&&&&&&& &&& &&& &&& ''''
&& &&& #&&&&&&& &&&& && && ,&&&& ### &&& #&& '' #&*
&& && &&& &&& &&& #&&& && &&& &&& #&& ' && .&&
&& && #&& &&& (&& &&& &&% (&& %&&
&& &&& &&&''&&&& &&& (&& &&&( &&& #&& &&&&&
&&&&&&&&& &&&,,&&&& %&& .&/ &&& #&& & &&#
#& &&& %&& &&&&&&&
%&&&&&&# ,&&&&&& &&&,.&&& ,
&&&&/ &&* &&# &&.%&% ## &&''&& /&
&&& &&, &&&& *&&&&&&& &&&&&&& &&& && &&&,,&& &&&&&
,&& &&, &&#,,,&& &&. && &&& && &&&''&&&''&&& && ,, (&& &&
&&. &&, && &&* && &&& && && &&& &&% &&&&&& && &&
#&&& &&/ .&& &&* &&* &&&&#&&& && && &&# &&( &&( &&&
*&&&&&&&&( '' &&* &&
&&# && && &&
&&&&&&&&& &&&&&& && %&& .&&&&&&&&& && && &&&&
&& &&&& && %&& &&& && *&& %&& && &&&& *&& &&&
&& &&, &&/ &&& &&&&, && .&& %&& && && &&&
&& &&# &&, &&& && #&& && &&&&( &&&&&&&& && '&&&&&
&& &&& %&& && && &&%&& && %&& && && &&&
&&,,/&&&&& &&&&&&&& &&. /&&& *&& &&& &&&&&&&&&& &&& &&
&&&&& '' &&&%*/
// GO TO LINE 1988 TO SEE WHERE THE Deformed Donkeys CONTRACT STARTS
// File: @openzeppelin/contracts/utils/Context.sol
pragma solidity >=0.6.0 <0.8.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File: @openzeppelin/contracts/introspection/IERC165.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
pragma solidity >=0.6.2 <0.8.0;
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}
// File: @openzeppelin/contracts/token/ERC721/IERC721Metadata.sol
pragma solidity >=0.6.2 <0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File: @openzeppelin/contracts/token/ERC721/IERC721Enumerable.sol
pragma solidity >=0.6.2 <0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Enumerable is IERC721 {
/**
* @dev Returns the total amount of tokens stored by the contract.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns a token ID owned by `owner` at a given `index` of its token list.
* Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);
/**
* @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
* Use along with {totalSupply} to enumerate all tokens.
*/
function tokenByIndex(uint256 index) external view returns (uint256);
}
// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
*/
function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}
// File: @openzeppelin/contracts/introspection/ERC165.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts may inherit from this and call {_registerInterface} to declare
* their support of an interface.
*/
abstract contract ERC165 is IERC165 {
/*
* bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
*/
bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;
/**
* @dev Mapping of interface ids to whether or not it's supported.
*/
mapping(bytes4 => bool) private _supportedInterfaces;
constructor () internal {
// Derived contracts need only register support for their own interfaces,
// we register support for ERC165 itself here
_registerInterface(_INTERFACE_ID_ERC165);
}
/**
* @dev See {IERC165-supportsInterface}.
*
* Time complexity O(1), guaranteed to always use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return _supportedInterfaces[interfaceId];
}
/**
* @dev Registers the contract as an implementer of the interface defined by
* `interfaceId`. Support of the actual ERC165 interface is automatic and
* registering its interface id is not required.
*
* See {IERC165-supportsInterface}.
*
* Requirements:
*
* - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
*/
function _registerInterface(bytes4 interfaceId) internal virtual {
require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
_supportedInterfaces[interfaceId] = true;
}
}
// File: @openzeppelin/contracts/math/SafeMath.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b > a) return (false, 0);
return (true, a - b);
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a / b);
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a % b);
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, "SafeMath: subtraction overflow");
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) return 0;
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: division by zero");
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: modulo by zero");
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
return a - b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryDiv}.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a % b;
}
}
// File: @openzeppelin/contracts/utils/Address.sol
pragma solidity >=0.6.2 <0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: @openzeppelin/contracts/utils/EnumerableSet.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping (bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) { // Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
// When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
// so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.
bytes32 lastvalue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastvalue;
// Update the index for the moved value
set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
require(set._values.length > index, "EnumerableSet: index out of bounds");
return set._values[index];
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
}
// File: @openzeppelin/contracts/utils/EnumerableMap.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Library for managing an enumerable variant of Solidity's
* https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]
* type.
*
* Maps have the following properties:
*
* - Entries are added, removed, and checked for existence in constant time
* (O(1)).
* - Entries are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableMap for EnumerableMap.UintToAddressMap;
*
* // Declare a set state variable
* EnumerableMap.UintToAddressMap private myMap;
* }
* ```
*
* As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are
* supported.
*/
library EnumerableMap {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Map type with
// bytes32 keys and values.
// The Map implementation uses private functions, and user-facing
// implementations (such as Uint256ToAddressMap) are just wrappers around
// the underlying Map.
// This means that we can only create new EnumerableMaps for types that fit
// in bytes32.
struct MapEntry {
bytes32 _key;
bytes32 _value;
}
struct Map {
// Storage of map keys and values
MapEntry[] _entries;
// Position of the entry defined by a key in the `entries` array, plus 1
// because index 0 means a key is not in the map.
mapping (bytes32 => uint256) _indexes;
}
/**
* @dev Adds a key-value pair to a map, or updates the value for an existing
* key. O(1).
*
* Returns true if the key was added to the map, that is if it was not
* already present.
*/
function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
// We read and store the key's index to prevent multiple reads from the same storage slot
uint256 keyIndex = map._indexes[key];
if (keyIndex == 0) { // Equivalent to !contains(map, key)
map._entries.push(MapEntry({ _key: key, _value: value }));
// The entry is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
map._indexes[key] = map._entries.length;
return true;
} else {
map._entries[keyIndex - 1]._value = value;
return false;
}
}
/**
* @dev Removes a key-value pair from a map. O(1).
*
* Returns true if the key was removed from the map, that is if it was present.
*/
function _remove(Map storage map, bytes32 key) private returns (bool) {
// We read and store the key's index to prevent multiple reads from the same storage slot
uint256 keyIndex = map._indexes[key];
if (keyIndex != 0) { // Equivalent to contains(map, key)
// To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one
// in the array, and then remove the last entry (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = keyIndex - 1;
uint256 lastIndex = map._entries.length - 1;
// When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs
// so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.
MapEntry storage lastEntry = map._entries[lastIndex];
// Move the last entry to the index where the entry to delete is
map._entries[toDeleteIndex] = lastEntry;
// Update the index for the moved entry
map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based
// Delete the slot where the moved entry was stored
map._entries.pop();
// Delete the index for the deleted slot
delete map._indexes[key];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the key is in the map. O(1).
*/
function _contains(Map storage map, bytes32 key) private view returns (bool) {
return map._indexes[key] != 0;
}
/**
* @dev Returns the number of key-value pairs in the map. O(1).
*/
function _length(Map storage map) private view returns (uint256) {
return map._entries.length;
}
/**
* @dev Returns the key-value pair stored at position `index` in the map. O(1).
*
* Note that there are no guarantees on the ordering of entries inside the
* array, and it may change when more entries are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
require(map._entries.length > index, "EnumerableMap: index out of bounds");
MapEntry storage entry = map._entries[index];
return (entry._key, entry._value);
}
/**
* @dev Tries to returns the value associated with `key`. O(1).
* Does not revert if `key` is not in the map.
*/
function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
uint256 keyIndex = map._indexes[key];
if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)
return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based
}
/**
* @dev Returns the value associated with `key`. O(1).
*
* Requirements:
*
* - `key` must be in the map.
*/
function _get(Map storage map, bytes32 key) private view returns (bytes32) {
uint256 keyIndex = map._indexes[key];
require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key)
return map._entries[keyIndex - 1]._value; // All indexes are 1-based
}
/**
* @dev Same as {_get}, with a custom error message when `key` is not in the map.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {_tryGet}.
*/
function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
uint256 keyIndex = map._indexes[key];
require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)
return map._entries[keyIndex - 1]._value; // All indexes are 1-based
}
// UintToAddressMap
struct UintToAddressMap {
Map _inner;
}
/**
* @dev Adds a key-value pair to a map, or updates the value for an existing
* key. O(1).
*
* Returns true if the key was added to the map, that is if it was not
* already present.
*/
function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the key was removed from the map, that is if it was present.
*/
function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {
return _remove(map._inner, bytes32(key));
}
/**
* @dev Returns true if the key is in the map. O(1).
*/
function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {
return _contains(map._inner, bytes32(key));
}
/**
* @dev Returns the number of elements in the map. O(1).
*/
function length(UintToAddressMap storage map) internal view returns (uint256) {
return _length(map._inner);
}
/**
* @dev Returns the element stored at position `index` in the set. O(1).
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
(bytes32 key, bytes32 value) = _at(map._inner, index);
return (uint256(key), address(uint160(uint256(value))));
}
/**
* @dev Tries to returns the value associated with `key`. O(1).
* Does not revert if `key` is not in the map.
*
* _Available since v3.4._
*/
function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
(bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
return (success, address(uint160(uint256(value))));
}
/**
* @dev Returns the value associated with `key`. O(1).
*
* Requirements:
*
* - `key` must be in the map.
*/
function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
return address(uint160(uint256(_get(map._inner, bytes32(key)))));
}
/**
* @dev Same as {get}, with a custom error message when `key` is not in the map.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryGet}.
*/
function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
}
}
// File: @openzeppelin/contracts/utils/Strings.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev String operations.
*/
library Strings {
/**
* @dev Converts a `uint256` to its ASCII `string` representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
uint256 index = digits - 1;
temp = value;
while (temp != 0) {
buffer[index--] = bytes1(uint8(48 + temp % 10));
temp /= 10;
}
return string(buffer);
}
}
// File: @openzeppelin/contracts/token/ERC721/ERC721.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @title ERC721 Non-Fungible Token Standard basic implementation
* @dev see https://eips.ethereum.org/EIPS/eip-721
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
using SafeMath for uint256;
using Address for address;
using EnumerableSet for EnumerableSet.UintSet;
using EnumerableMap for EnumerableMap.UintToAddressMap;
using Strings for uint256;
// Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
// which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;
// Mapping from holder address to their (enumerable) set of owned tokens
mapping (address => EnumerableSet.UintSet) private _holderTokens;
// Enumerable mapping from token ids to their owners
EnumerableMap.UintToAddressMap private _tokenOwners;
// Mapping from token ID to approved address
mapping (uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping (address => mapping (address => bool)) private _operatorApprovals;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Optional mapping for token URIs
mapping (uint256 => string) private _tokenURIs;
// mapping for token generation
mapping (uint256 => uint256) private _tokenGen;
// Base URI
string private _baseURI;
uint private _startingIndex;
/*
* bytes4(keccak256('balanceOf(address)')) == 0x70a08231
* bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
* bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
* bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
* bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
* bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
* bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
* bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
* bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
*
* => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
* 0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
*/
bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;
/*
* bytes4(keccak256('name()')) == 0x06fdde03
* bytes4(keccak256('symbol()')) == 0x95d89b41
* bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
*
* => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
*/
bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;
/*
* bytes4(keccak256('totalSupply()')) == 0x18160ddd
* bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
* bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
*
* => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
*/
bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor (string memory name_, string memory symbol_) public {
_name = name_;
_symbol = symbol_;
// register the supported interfaces to conform to ERC721 via ERC165
_registerInterface(_INTERFACE_ID_ERC721);
_registerInterface(_INTERFACE_ID_ERC721_METADATA);
_registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: balance query for the zero address");
return _holderTokens[owner].length();
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token");
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
string memory _tokenURI = _tokenURIs[tokenId];
string memory base = baseURI();
// If there is no base URI, return the token URI.
if (bytes(base).length == 0) {
return _tokenURI;
}
// If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
if (bytes(_tokenURI).length > 0) {
return string(abi.encodePacked(base, _tokenURI));
}
// If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
return string(abi.encodePacked(base, tokenId.toString()));
}
/**
* @dev Returns the base URI set via {_setBaseURI}. This will be
* automatically added as a prefix in {tokenURI} to each token's URI, or
* to the token ID if no specific URI is set for that token ID.
*/
function baseURI() public view virtual returns (string memory) {
return _baseURI;
}
function startingIndex() public view virtual returns (uint) {
return _startingIndex;
}
function splitSignature(bytes memory sig)
pure
internal
returns (uint8 v, bytes32 r, bytes32 s)
{
require(sig.length == 65 , "invalid length");
assembly {
r := mload(add(sig, 32))
s := mload(add(sig, 64))
v := byte(0, mload(add(sig, 96)))
}
if (v < 27) {
v += 27;
}
require(v == 27 || v == 28 , "value of v ");
return (v, r, s);
}
/**
* @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
return _holderTokens[owner].at(index);
}
/**
* @dev See {IERC721Enumerable-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
// _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds
return _tokenOwners.length();
}
/**
* @dev See {IERC721Enumerable-tokenByIndex}.
*/
function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
(uint256 tokenId, ) = _tokenOwners.at(index);
return tokenId;
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(_msgSender() == owner || ERC721.isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not owner nor approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
require(_exists(tokenId), "ERC721: approved query for nonexistent token");
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
require(operator != _msgSender(), "ERC721: approve to caller");
_operatorApprovals[_msgSender()][operator] = approved;
emit ApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(address from, address to, uint256 tokenId) public virtual override {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_transfer(from, to, tokenId);
}
function getTokenGeneration(uint256 tokenId) public view returns (uint256) {
return _tokenGen[tokenId];
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_safeTransfer(from, to, tokenId, _data);
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* `_data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
* and stop existing when they are burned (`_burn`).
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _tokenOwners.contains(tokenId);
}
/**
* @dev Returns whether `spender` is allowed to manage `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
require(_exists(tokenId), "ERC721: operator query for nonexistent token");
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender));
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
d*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {
_mint(to, tokenId);
require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId);
_holderTokens[to].add(tokenId);
_tokenOwners.set(tokenId, to);
emit Transfer(address(0), to, tokenId);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(address from, address to, uint256 tokenId) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); // internal owner
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId);
// Clear approvals from the previous owner
_approve(address(0), tokenId);
_holderTokens[from].remove(tokenId);
_holderTokens[to].add(tokenId);
_tokenOwners.set(tokenId, to);
_tokenGen[tokenId] = _tokenGen[tokenId] + 1;
emit Transfer(from, to, tokenId);
}
/**
* @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
_tokenURIs[tokenId] = _tokenURI;
}
/**
* @dev Internal function to set the base URI for all token IDs. It is
* automatically added as a prefix to the value returned in {tokenURI},
* or to the token ID if {tokenURI} is empty.
*/
function _setBaseURI(string memory baseURI_) internal virtual {
_baseURI = baseURI_;
}
function _setStartingIndex(uint startingIndex_) internal virtual {
_startingIndex = startingIndex_;
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param _data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
private returns (bool)
{
if (!to.isContract()) {
return true;
}
bytes memory returndata = to.functionCall(abi.encodeWithSelector(
IERC721Receiver(to).onERC721Received.selector,
_msgSender(),
from,
tokenId,
_data
), "ERC721: transfer to non ERC721Receiver implementer");
bytes4 retval = abi.decode(returndata, (bytes4));
return (retval == _ERC721_RECEIVED);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits an {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId); // internal owner
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { }
}
// File: @openzeppelin/contracts/access/Ownable.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor () internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
pragma solidity ^0.7.0;
pragma abicoder v2;
interface DarrylsDeformedMiniatureDonkeys {
function sendDonkey(uint numberOfTokens, address _to) external;
}
contract DeformedDonkeys is ERC721, Ownable {
using SafeMath for uint256;
string public DONKEY_PROVENANCE = "";
address miniatureDonkeysAddress;
// Public sale params
bool public publicSaleIsActive = false;
uint256 public collectionStartingIndexBlock;
// sell ending price
uint256 public donkeyPrice = 80000000000000000; // 0.080 ETH
uint public constant maxDonkeyPurchase = 20;
uint256 public MAX_DONKEY = 10000; // to save gas, some place used value instead of var, so be careful during changing this value
uint public donkeyReserve = 35;
bool private earlyRevealed = false;
// ############################# constructor #############################
constructor() ERC721("DeformedDonkeys", "DDD") { }
// ############################# function section #############################
// ***************************** internal : Start *****************************
function getPrefixedHash(bytes32 messageHash) internal pure returns (bytes32) {
bytes memory hashPrefix = "\x19Ethereum Signed Message:\n32";
return keccak256(abi.encodePacked(hashPrefix, messageHash));
}
function validateEligibilityKey(address accountAddress, bytes memory eligibilityKey) internal pure returns (bool) {
bytes32 messageHash = keccak256(abi.encodePacked("Donkey-", accountAddress));
(uint8 v, bytes32 r, bytes32 s) = splitSignature(eligibilityKey);
bytes32 msgHash = getPrefixedHash(messageHash);
return ecrecover(msgHash, v, r, s) == 0x20Ff11c0383C3E84D2D251Ab77eBBaD667c2964C;
}
// ***************************** internal : End *****************************
// ***************************** onlyOwner : Start *****************************
function withdraw() public onlyOwner {
uint balance = address(this).balance;
msg.sender.transfer(balance);
}
function reserveDonkeys(address _to, uint256 _reserveAmount) public onlyOwner {
require(_reserveAmount > 0 && _reserveAmount <= donkeyReserve, "Not enough reserve left");
uint256 mintIndex = totalSupply();
for (uint i = 0; i < _reserveAmount; i++) {
if (mintIndex + i < 10000) {
_safeMint(_to, mintIndex + i);
}
}
DarrylsDeformedMiniatureDonkeys miniatureDonkeys = DarrylsDeformedMiniatureDonkeys(miniatureDonkeysAddress);
miniatureDonkeys.sendDonkey(_reserveAmount, _to);
donkeyReserve = donkeyReserve.sub(_reserveAmount);
}
function setProvenanceHash(string memory provenanceHash) public onlyOwner {
DONKEY_PROVENANCE = provenanceHash;
}
function setBaseURI(string memory baseURI) public onlyOwner {
_setBaseURI(baseURI);
}
function setDonkeyPrice(uint256 price) public onlyOwner {
donkeyPrice = price;
}
function pausePublicSale() external onlyOwner {
publicSaleIsActive = false;
}
function setMiniatureDonkeysAddress(address newMiniatureDonkeysAddress) external onlyOwner {
miniatureDonkeysAddress = newMiniatureDonkeysAddress;
}
function isRevealed() public view returns(bool) {
if(earlyRevealed){
return earlyRevealed;
}
return MAX_DONKEY == totalSupply();
}
function setEarlyRevealed() public onlyOwner {
require(startingIndex() > 0, "Starting index is not set");
earlyRevealed = true;
}
/**
* Set the starting index block for the collection, essentially unblocking
* setting starting index
*/
function emergencySetStartingIndexBlock() public onlyOwner {
require(startingIndex() == 0, "Starting index is already set");
collectionStartingIndexBlock = block.number;
}
function startPublicSale()
external
onlyOwner
{
require(!publicSaleIsActive, "Public sale has already begun");
publicSaleIsActive = true;
}
// ***************************** onlyOwner : End *****************************
// ***************************** public view : Start ****************************
function tokensOfOwner(address _owner) public view returns(uint256[] memory ) {
uint256 tokenCount = balanceOf(_owner);
if (tokenCount == 0) {
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;
}
}
function adoptDonkey(uint numberOfTokens, bytes memory adoptionKey) public payable {
uint256 currentTotalSupply = totalSupply();
require(publicSaleIsActive, "Sale must be active to adopt Donkey");
require(numberOfTokens < 21, "Can only mint 20 tokens at a time");
require(currentTotalSupply.add(numberOfTokens) < 10001, "Purchase would exceed max supply of Donkeys"); // ref MAX_DONKEY
uint256 costToMint = donkeyPrice * numberOfTokens;
require(costToMint <= msg.value, "Ether value sent is not correct");
bool isValidEligibilityKey = validateEligibilityKey(msg.sender, adoptionKey);
require(isValidEligibilityKey, "Eligibility key is not valid");
if (currentTotalSupply == 0) {
collectionStartingIndexBlock = block.number;
}
for(uint i = 0; i < numberOfTokens; i++) {
uint256 mintIndex = totalSupply();
if (mintIndex < 10000) {
_safeMint(msg.sender, mintIndex);
}
}
// If you are here and reading this contract then you know you will get a surprise miniature donKEY !heehaw
DarrylsDeformedMiniatureDonkeys miniatureDonkeys = DarrylsDeformedMiniatureDonkeys(miniatureDonkeysAddress);
miniatureDonkeys.sendDonkey(numberOfTokens, msg.sender);
}
// Set the starting index for the collection
function setStartingIndex() public {
require(startingIndex() == 0, "Starting index is already set");
require(collectionStartingIndexBlock != 0, "Starting index block must be set");
uint newStartingIndex = 0;
newStartingIndex = uint(blockhash(collectionStartingIndexBlock)) % MAX_DONKEY;
// Just a sanity case in the worst case if this function is called late (EVM only stores last 256 block hashes)
if (block.number.sub(collectionStartingIndexBlock) > 255) {
newStartingIndex = uint(blockhash(block.number - 1)) % MAX_DONKEY;
}
// Prevent default sequence
if (newStartingIndex == 0) {
newStartingIndex = newStartingIndex.add(1);
}
_setStartingIndex(newStartingIndex);
}
// ***************************** public view : End ****************************
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DONKEY_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_DONKEY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"bytes","name":"adoptionKey","type":"bytes"}],"name":"adoptDonkey","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionStartingIndexBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"donkeyPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"donkeyReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencySetStartingIndexBlock","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":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenGeneration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDonkeyPurchase","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":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pausePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"publicSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reserveDonkeys","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setDonkeyPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setEarlyRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMiniatureDonkeysAddress","type":"address"}],"name":"setMiniatureDonkeysAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405260405180602001604052806000815250600d90805190602001906200002b9291906200031e565b506000600e60146101000a81548160ff02191690831515021790555067011c37937e08000060105561271060115560236012556000601360006101000a81548160ff0219169083151502179055503480156200008657600080fd5b506040518060400160405280600f81526020017f4465666f726d6564446f6e6b65797300000000000000000000000000000000008152506040518060400160405280600381526020017f44444400000000000000000000000000000000000000000000000000000000008152506200010b6301ffc9a760e01b6200023e60201b60201c565b8160069080519060200190620001239291906200031e565b5080600790805190602001906200013c9291906200031e565b50620001556380ac58cd60e01b6200023e60201b60201c565b6200016d635b5e139f60e01b6200023e60201b60201c565b6200018563780e9d6360e01b6200023e60201b60201c565b50506000620001996200031660201b60201c565b905080600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35062000449565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620002aa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002a19062000416565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620003565760008555620003a2565b82601f106200037157805160ff1916838001178555620003a2565b82800160010185558215620003a2579182015b82811115620003a157825182559160200191906001019062000384565b5b509050620003b19190620003b5565b5090565b5b80821115620003d0576000816000905550600101620003b6565b5090565b6000620003e3601c8362000438565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b600060208201905081810360008301526200043181620003d4565b9050919050565b600082825260208201905092915050565b61525780620004596000396000f3fe60806040526004361061025c5760003560e01c80636c0360eb11610144578063b88d4fde116100b6578063d474f2121161007a578063d474f212146108a3578063d920aa8f146108ce578063e985e9c5146108f7578063e986655014610934578063f2fde38b1461094b578063f3e4c247146109745761025c565b8063b88d4fde146107be578063c45de1cf146107e7578063c87b56dd14610812578063cad69e7b1461084f578063cb774d47146108785761025c565b80638da5cb5b116101085780638da5cb5b146106ac57806391785e6d146106d757806395d89b4114610714578063a22cb4651461073f578063a230b90c14610768578063a855903f146107935761025c565b80636c0360eb146105d957806370a0823114610604578063715018a6146106415780637d17fcbe146106585780638462151c1461066f5761025c565b806323b872dd116101dd5780634f6ccce7116101a15780634f6ccce7146104c95780635190863f1461050657806354214f691461053157806355f804b31461055c5780636352211e146105855780636a6c8267146105c25761025c565b806323b872dd146103f85780632f2eda31146104215780632f745c591461044c5780633ccfd60b1461048957806342842e0e146104a05761025c565b80630c41f497116102245780630c41f497146103465780630fcf2e751461035d578063109695231461038857806316fbe8de146103b157806318160ddd146103cd5761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b3146103065780630c1c972a1461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613ac8565b61099d565b60405161029591906149e0565b60405180910390f35b3480156102aa57600080fd5b506102b3610a04565b6040516102c09190614a40565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613b5b565b610aa6565b6040516102fd9190614957565b60405180910390f35b34801561031257600080fd5b5061032d60048036038101906103289190613a8c565b610b2b565b005b34801561033b57600080fd5b50610344610c43565b005b34801561035257600080fd5b5061035b610d2c565b005b34801561036957600080fd5b50610372610dc5565b60405161037f91906149e0565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa9190613b1a565b610dd8565b005b6103cb60048036038101906103c69190613b84565b610e6e565b005b3480156103d957600080fd5b506103e26110e4565b6040516103ef9190614e82565b60405180910390f35b34801561040457600080fd5b5061041f600480360381019061041a9190613986565b6110f5565b005b34801561042d57600080fd5b50610436611155565b6040516104439190614e82565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e9190613a8c565b61115b565b6040516104809190614e82565b60405180910390f35b34801561049557600080fd5b5061049e6111b6565b005b3480156104ac57600080fd5b506104c760048036038101906104c29190613986565b611281565b005b3480156104d557600080fd5b506104f060048036038101906104eb9190613b5b565b6112a1565b6040516104fd9190614e82565b60405180910390f35b34801561051257600080fd5b5061051b6112c4565b6040516105289190614e82565b60405180910390f35b34801561053d57600080fd5b506105466112ca565b60405161055391906149e0565b60405180910390f35b34801561056857600080fd5b50610583600480360381019061057e9190613b1a565b61130a565b005b34801561059157600080fd5b506105ac60048036038101906105a79190613b5b565b611392565b6040516105b99190614957565b60405180910390f35b3480156105ce57600080fd5b506105d76113c9565b005b3480156105e557600080fd5b506105ee6114ac565b6040516105fb9190614a40565b60405180910390f35b34801561061057600080fd5b5061062b60048036038101906106269190613921565b61154e565b6040516106389190614e82565b60405180910390f35b34801561064d57600080fd5b5061065661160d565b005b34801561066457600080fd5b5061066d61174a565b005b34801561067b57600080fd5b5061069660048036038101906106919190613921565b611819565b6040516106a391906149be565b60405180910390f35b3480156106b857600080fd5b506106c1611912565b6040516106ce9190614957565b60405180910390f35b3480156106e357600080fd5b506106fe60048036038101906106f99190613b5b565b61193c565b60405161070b9190614e82565b60405180910390f35b34801561072057600080fd5b50610729611959565b6040516107369190614a40565b60405180910390f35b34801561074b57600080fd5b5061076660048036038101906107619190613a50565b6119fb565b005b34801561077457600080fd5b5061077d611b7c565b60405161078a9190614e82565b60405180910390f35b34801561079f57600080fd5b506107a8611b82565b6040516107b59190614e82565b60405180910390f35b3480156107ca57600080fd5b506107e560048036038101906107e091906139d5565b611b87565b005b3480156107f357600080fd5b506107fc611be9565b6040516108099190614a40565b60405180910390f35b34801561081e57600080fd5b5061083960048036038101906108349190613b5b565b611c87565b6040516108469190614a40565b60405180910390f35b34801561085b57600080fd5b5061087660048036038101906108719190613a8c565b611e0a565b005b34801561088457600080fd5b5061088d611fca565b60405161089a9190614e82565b60405180910390f35b3480156108af57600080fd5b506108b8611fd4565b6040516108c59190614e82565b60405180910390f35b3480156108da57600080fd5b506108f560048036038101906108f09190613b5b565b611fda565b005b34801561090357600080fd5b5061091e6004803603810190610919919061394a565b612060565b60405161092b91906149e0565b60405180910390f35b34801561094057600080fd5b506109496120f4565b005b34801561095757600080fd5b50610972600480360381019061096d9190613921565b6121f9565b005b34801561098057600080fd5b5061099b60048036038101906109969190613921565b6123a5565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a9c5780601f10610a7157610100808354040283529160200191610a9c565b820191906000526020600020905b815481529060010190602001808311610a7f57829003601f168201915b5050505050905090565b6000610ab182612465565b610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae790614ce2565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b3682611392565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9e90614d82565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc6612482565b73ffffffffffffffffffffffffffffffffffffffff161480610bf55750610bf481610bef612482565b612060565b5b610c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2b90614c62565b60405180910390fd5b610c3e838361248a565b505050565b610c4b612482565b73ffffffffffffffffffffffffffffffffffffffff16610c69611912565b73ffffffffffffffffffffffffffffffffffffffff1614610cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb690614d02565b60405180910390fd5b600e60149054906101000a900460ff1615610d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0690614a82565b60405180910390fd5b6001600e60146101000a81548160ff021916908315150217905550565b610d34612482565b73ffffffffffffffffffffffffffffffffffffffff16610d52611912565b73ffffffffffffffffffffffffffffffffffffffff1614610da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9f90614d02565b60405180910390fd5b6000600e60146101000a81548160ff021916908315150217905550565b600e60149054906101000a900460ff1681565b610de0612482565b73ffffffffffffffffffffffffffffffffffffffff16610dfe611912565b73ffffffffffffffffffffffffffffffffffffffff1614610e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4b90614d02565b60405180910390fd5b80600d9080519060200190610e6a92919061373d565b5050565b6000610e786110e4565b9050600e60149054906101000a900460ff16610ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec090614da2565b60405180910390fd5b60158310610f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0390614c02565b60405180910390fd5b612711610f22848361254390919063ffffffff16565b10610f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5990614ae2565b60405180910390fd5b60008360105402905034811115610fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa590614b82565b60405180910390fd5b6000610fba3385612598565b905080610ffc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff390614e22565b60405180910390fd5b600083141561100d5743600f819055505b60005b858110156110475760006110226110e4565b9050612710811015611039576110383382612683565b5b508080600101915050611010565b506000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663ff2b806487336040518363ffffffff1660e01b81526004016110aa929190614ec6565b600060405180830381600087803b1580156110c457600080fd5b505af11580156110d8573d6000803e3d6000fd5b50505050505050505050565b60006110f060026126a1565b905090565b611106611100612482565b826126b6565b611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614de2565b60405180910390fd5b611150838383612794565b505050565b600f5481565b60006111ae82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206129d990919063ffffffff16565b905092915050565b6111be612482565b73ffffffffffffffffffffffffffffffffffffffff166111dc611912565b73ffffffffffffffffffffffffffffffffffffffff1614611232576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122990614d02565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561127d573d6000803e3d6000fd5b5050565b61129c83838360405180602001604052806000815250611b87565b505050565b6000806112b88360026129f390919063ffffffff16565b50905080915050919050565b60105481565b6000601360009054906101000a900460ff16156112f857601360009054906101000a900460ff169050611307565b6113006110e4565b6011541490505b90565b611312612482565b73ffffffffffffffffffffffffffffffffffffffff16611330611912565b73ffffffffffffffffffffffffffffffffffffffff1614611386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137d90614d02565b60405180910390fd5b61138f81612a1f565b50565b60006113c2826040518060600160405280602981526020016151f9602991396002612a399092919063ffffffff16565b9050919050565b6113d1612482565b73ffffffffffffffffffffffffffffffffffffffff166113ef611912565b73ffffffffffffffffffffffffffffffffffffffff1614611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c90614d02565b60405180910390fd5b600061144f611fca565b1161148f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148690614c22565b60405180910390fd5b6001601360006101000a81548160ff021916908315150217905550565b6060600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115445780601f1061151957610100808354040283529160200191611544565b820191906000526020600020905b81548152906001019060200180831161152757829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b690614c82565b60405180910390fd5b611606600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612a58565b9050919050565b611615612482565b73ffffffffffffffffffffffffffffffffffffffff16611633611912565b73ffffffffffffffffffffffffffffffffffffffff1614611689576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168090614d02565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611752612482565b73ffffffffffffffffffffffffffffffffffffffff16611770611912565b73ffffffffffffffffffffffffffffffffffffffff16146117c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bd90614d02565b60405180910390fd5b60006117d0611fca565b14611810576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180790614c42565b60405180910390fd5b43600f81905550565b606060006118268361154e565b9050600081141561188157600067ffffffffffffffff8111801561184957600080fd5b506040519080825280602002602001820160405280156118785781602001602082028036833780820191505090505b5091505061190d565b60008167ffffffffffffffff8111801561189a57600080fd5b506040519080825280602002602001820160405280156118c95781602001602082028036833780820191505090505b50905060005b82811015611906576118e1858261115b565b8282815181106118ed57fe5b60200260200101818152505080806001019150506118cf565b8193505050505b919050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600060096000838152602001908152602001600020549050919050565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119f15780601f106119c6576101008083540402835291602001916119f1565b820191906000526020600020905b8154815290600101906020018083116119d457829003601f168201915b5050505050905090565b611a03612482565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6890614b62565b60405180910390fd5b8060056000611a7e612482565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b2b612482565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b7091906149e0565b60405180910390a35050565b60125481565b601481565b611b98611b92612482565b836126b6565b611bd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bce90614de2565b60405180910390fd5b611be384848484612a6d565b50505050565b600d8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611c7f5780601f10611c5457610100808354040283529160200191611c7f565b820191906000526020600020905b815481529060010190602001808311611c6257829003601f168201915b505050505081565b6060611c9282612465565b611cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc890614d42565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d7a5780601f10611d4f57610100808354040283529160200191611d7a565b820191906000526020600020905b815481529060010190602001808311611d5d57829003601f168201915b505050505090506000611d8b6114ac565b9050600081511415611da1578192505050611e05565b600082511115611dd6578082604051602001611dbe92919061490d565b60405160208183030381529060405292505050611e05565b80611de085612ac9565b604051602001611df192919061490d565b604051602081830303815290604052925050505b919050565b611e12612482565b73ffffffffffffffffffffffffffffffffffffffff16611e30611912565b73ffffffffffffffffffffffffffffffffffffffff1614611e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7d90614d02565b60405180910390fd5b600081118015611e9857506012548111155b611ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ece90614d62565b60405180910390fd5b6000611ee16110e4565b905060005b82811015611f14576127108183011015611f0757611f0684828401612683565b5b8080600101915050611ee6565b506000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663ff2b806484866040518363ffffffff1660e01b8152600401611f77929190614e9d565b600060405180830381600087803b158015611f9157600080fd5b505af1158015611fa5573d6000803e3d6000fd5b50505050611fbe83601254612c1090919063ffffffff16565b60128190555050505050565b6000600b54905090565b60115481565b611fe2612482565b73ffffffffffffffffffffffffffffffffffffffff16612000611912565b73ffffffffffffffffffffffffffffffffffffffff1614612056576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204d90614d02565b60405180910390fd5b8060108190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006120fe611fca565b1461213e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213590614c42565b60405180910390fd5b6000600f541415612184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217b90614dc2565b60405180910390fd5b6000601154600f544060001c8161219757fe5b06905060ff6121b1600f5443612c1090919063ffffffff16565b11156121cd57601154600143034060001c816121c957fe5b0690505b60008114156121ed576121ea60018261254390919063ffffffff16565b90505b6121f681612c60565b50565b612201612482565b73ffffffffffffffffffffffffffffffffffffffff1661221f611912565b73ffffffffffffffffffffffffffffffffffffffff1614612275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226c90614d02565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122dc90614ac2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6123ad612482565b73ffffffffffffffffffffffffffffffffffffffff166123cb611912565b73ffffffffffffffffffffffffffffffffffffffff1614612421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241890614d02565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061247b826002612c6a90919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124fd83611392565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008082840190508381101561258e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258590614b22565b60405180910390fd5b8091505092915050565b600080836040516020016125ac9190614931565b60405160208183030381529060405280519060200120905060008060006125d286612c84565b92509250925060006125e385612d53565b90507320ff11c0383c3e84d2d251ab77ebbad667c2964c73ffffffffffffffffffffffffffffffffffffffff166001828686866040516000815260200160405260405161263394939291906149fb565b6020604051602081039080840390855afa158015612655573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16149550505050505092915050565b61269d828260405180602001604052806000815250612dbf565b5050565b60006126af82600001612e1a565b9050919050565b60006126c182612465565b612700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f790614be2565b60405180910390fd5b600061270b83611392565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061277a57508373ffffffffffffffffffffffffffffffffffffffff1661276284610aa6565b73ffffffffffffffffffffffffffffffffffffffff16145b8061278b575061278a8185612060565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127b482611392565b73ffffffffffffffffffffffffffffffffffffffff161461280a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280190614d22565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561287a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287190614b42565b60405180910390fd5b612885838383612e2b565b61289060008261248a565b6128e181600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e3090919063ffffffff16565b5061293381600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e4a90919063ffffffff16565b5061294a81836002612e649092919063ffffffff16565b5060016009600083815260200190815260200160002054016009600083815260200190815260200160002081905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006129e88360000183612e99565b60001c905092915050565b600080600080612a068660000186612f06565b915091508160001c8160001c9350935050509250929050565b80600a9080519060200190612a3592919061373d565b5050565b6000612a4c846000018460001b84612f89565b60001c90509392505050565b6000612a668260000161301a565b9050919050565b612a78848484612794565b612a848484848461302b565b612ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aba90614aa2565b60405180910390fd5b50505050565b60606000821415612b11576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c0b565b600082905060005b60008214612b3b578080600101915050600a8281612b3357fe5b049150612b19565b60008167ffffffffffffffff81118015612b5457600080fd5b506040519080825280601f01601f191660200182016040528015612b875781602001600182028036833780820191505090505b50905060006001830390508593505b60008414612c0357600a8481612ba857fe5b0660300160f81b82828060019003935081518110612bc257fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481612bfb57fe5b049350612b96565b819450505050505b919050565b600082821115612c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4c90614ba2565b60405180910390fd5b818303905092915050565b80600b8190555050565b6000612c7c836000018360001b61318f565b905092915050565b60008060006041845114612ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc490614e62565b60405180910390fd5b6020840151915060408401519050606084015160001a9250601b8360ff161015612cf857601b830192505b601b8360ff161480612d0d5750601c8360ff16145b612d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4390614e42565b60405180910390fd5b9193909250565b6000806040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a33320000000081525090508083604051602001612da19291906148e5565b60405160208183030381529060405280519060200120915050919050565b612dc983836131b2565b612dd6600084848461302b565b612e15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0c90614aa2565b60405180910390fd5b505050565b600081600001805490509050919050565b505050565b6000612e42836000018360001b613340565b905092915050565b6000612e5c836000018360001b613428565b905092915050565b6000612e90846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613498565b90509392505050565b600081836000018054905011612ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612edb90614a62565b60405180910390fd5b826000018281548110612ef357fe5b9060005260206000200154905092915050565b60008082846000018054905011612f52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4990614ca2565b60405180910390fd5b6000846000018481548110612f6357fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe29190614a40565b60405180910390fd5b50846000016001820381548110612ffe57fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b600061304c8473ffffffffffffffffffffffffffffffffffffffff16613574565b6130595760019050613187565b600061312063150b7a0260e01b61306e612482565b8887876040516024016130849493929190614972565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518060600160405280603281526020016151c7603291398773ffffffffffffffffffffffffffffffffffffffff166135879092919063ffffffff16565b90506000818060200190518101906131389190613af1565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321990614cc2565b60405180910390fd5b61322b81612465565b1561326b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326290614b02565b60405180910390fd5b61327760008383612e2b565b6132c881600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e4a90919063ffffffff16565b506132df81836002612e649092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000808360010160008481526020019081526020016000205490506000811461341c576000600182039050600060018660000180549050039050600086600001828154811061338b57fe5b90600052602060002001549050808760000184815481106133a857fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806133e057fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613422565b60009150505b92915050565b6000613434838361359f565b61348d578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613492565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561353f5784600001604051806040016040528086815260200185815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050846000018054905085600101600086815260200190815260200160002081905550600191505061356d565b8285600001600183038154811061355257fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600080823b905060008111915050919050565b606061359684846000856135c2565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b606082471015613607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135fe90614bc2565b60405180910390fd5b61361085613574565b61364f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161364690614e02565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161367891906148ce565b60006040518083038185875af1925050503d80600081146136b5576040519150601f19603f3d011682016040523d82523d6000602084013e6136ba565b606091505b50915091506136ca8282866136d6565b92505050949350505050565b606083156136e657829050613736565b6000835111156136f95782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372d9190614a40565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261377357600085556137ba565b82601f1061378c57805160ff19168380011785556137ba565b828001600101855582156137ba579182015b828111156137b957825182559160200191906001019061379e565b5b5090506137c791906137cb565b5090565b5b808211156137e45760008160009055506001016137cc565b5090565b60006137fb6137f684614f20565b614eef565b90508281526020810184848401111561381357600080fd5b61381e8482856150da565b509392505050565b600061383961383484614f50565b614eef565b90508281526020810184848401111561385157600080fd5b61385c8482856150da565b509392505050565b6000813590506138738161516a565b92915050565b60008135905061388881615181565b92915050565b60008135905061389d81615198565b92915050565b6000815190506138b281615198565b92915050565b600082601f8301126138c957600080fd5b81356138d98482602086016137e8565b91505092915050565b600082601f8301126138f357600080fd5b8135613903848260208601613826565b91505092915050565b60008135905061391b816151af565b92915050565b60006020828403121561393357600080fd5b600061394184828501613864565b91505092915050565b6000806040838503121561395d57600080fd5b600061396b85828601613864565b925050602061397c85828601613864565b9150509250929050565b60008060006060848603121561399b57600080fd5b60006139a986828701613864565b93505060206139ba86828701613864565b92505060406139cb8682870161390c565b9150509250925092565b600080600080608085870312156139eb57600080fd5b60006139f987828801613864565b9450506020613a0a87828801613864565b9350506040613a1b8782880161390c565b925050606085013567ffffffffffffffff811115613a3857600080fd5b613a44878288016138b8565b91505092959194509250565b60008060408385031215613a6357600080fd5b6000613a7185828601613864565b9250506020613a8285828601613879565b9150509250929050565b60008060408385031215613a9f57600080fd5b6000613aad85828601613864565b9250506020613abe8582860161390c565b9150509250929050565b600060208284031215613ada57600080fd5b6000613ae88482850161388e565b91505092915050565b600060208284031215613b0357600080fd5b6000613b11848285016138a3565b91505092915050565b600060208284031215613b2c57600080fd5b600082013567ffffffffffffffff811115613b4657600080fd5b613b52848285016138e2565b91505092915050565b600060208284031215613b6d57600080fd5b6000613b7b8482850161390c565b91505092915050565b60008060408385031215613b9757600080fd5b6000613ba58582860161390c565b925050602083013567ffffffffffffffff811115613bc257600080fd5b613bce858286016138b8565b9150509250929050565b6000613be483836148a1565b60208301905092915050565b613bf9816150a4565b82525050565b613c0881615019565b82525050565b613c1781615007565b82525050565b613c2e613c2982615007565b61511c565b82525050565b6000613c3f82614f90565b613c498185614fbe565b9350613c5483614f80565b8060005b83811015613c85578151613c6c8882613bd8565b9750613c7783614fb1565b925050600181019050613c58565b5085935050505092915050565b613c9b8161502b565b82525050565b613caa81615037565b82525050565b613cc1613cbc82615037565b61512e565b82525050565b6000613cd282614f9b565b613cdc8185614fcf565b9350613cec8185602086016150e9565b613cf58161514c565b840191505092915050565b6000613d0b82614f9b565b613d158185614fe0565b9350613d258185602086016150e9565b80840191505092915050565b6000613d3c82614fa6565b613d468185614feb565b9350613d568185602086016150e9565b613d5f8161514c565b840191505092915050565b6000613d7582614fa6565b613d7f8185614ffc565b9350613d8f8185602086016150e9565b80840191505092915050565b6000613da8602283614feb565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e0e600783614ffc565b91507f446f6e6b65792d000000000000000000000000000000000000000000000000006000830152600782019050919050565b6000613e4e601d83614feb565b91507f5075626c69632073616c652068617320616c726561647920626567756e0000006000830152602082019050919050565b6000613e8e603283614feb565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613ef4602683614feb565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f5a602b83614feb565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620446f6e6b6579730000000000000000000000000000000000000000006020830152604082019050919050565b6000613fc0601c83614feb565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000614000601b83614feb565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000614040602483614feb565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140a6601983614feb565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006140e6601f83614feb565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000614126601e83614feb565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b6000614166602683614feb565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141cc602c83614feb565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614232602183614feb565b91507f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614298601983614feb565b91507f5374617274696e6720696e646578206973206e6f7420736574000000000000006000830152602082019050919050565b60006142d8601d83614feb565b91507f5374617274696e6720696e64657820697320616c7265616479207365740000006000830152602082019050919050565b6000614318603883614feb565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061437e602a83614feb565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006143e4602283614feb565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061444a602083614feb565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061448a602c83614feb565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006144f0602083614feb565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614530602983614feb565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614596602f83614feb565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006145fc601783614feb565b91507f4e6f7420656e6f7567682072657365727665206c6566740000000000000000006000830152602082019050919050565b600061463c602183614feb565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146a2602383614feb565b91507f53616c65206d7573742062652061637469766520746f2061646f707420446f6e60008301527f6b657900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614708602083614feb565b91507f5374617274696e6720696e64657820626c6f636b206d757374206265207365746000830152602082019050919050565b6000614748603183614feb565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006147ae601d83614feb565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b60006147ee601c83614feb565b91507f456c69676962696c697479206b6579206973206e6f742076616c6964000000006000830152602082019050919050565b600061482e600b83614feb565b91507f76616c7565206f662076200000000000000000000000000000000000000000006000830152602082019050919050565b600061486e600e83614feb565b91507f696e76616c6964206c656e6774680000000000000000000000000000000000006000830152602082019050919050565b6148aa8161508d565b82525050565b6148b98161508d565b82525050565b6148c881615097565b82525050565b60006148da8284613d00565b915081905092915050565b60006148f18285613d00565b91506148fd8284613cb0565b6020820191508190509392505050565b60006149198285613d6a565b91506149258284613d6a565b91508190509392505050565b600061493c82613e01565b91506149488284613c1d565b60148201915081905092915050565b600060208201905061496c6000830184613c0e565b92915050565b60006080820190506149876000830187613bff565b6149946020830186613c0e565b6149a160408301856148b0565b81810360608301526149b38184613cc7565b905095945050505050565b600060208201905081810360008301526149d88184613c34565b905092915050565b60006020820190506149f56000830184613c92565b92915050565b6000608082019050614a106000830187613ca1565b614a1d60208301866148bf565b614a2a6040830185613ca1565b614a376060830184613ca1565b95945050505050565b60006020820190508181036000830152614a5a8184613d31565b905092915050565b60006020820190508181036000830152614a7b81613d9b565b9050919050565b60006020820190508181036000830152614a9b81613e41565b9050919050565b60006020820190508181036000830152614abb81613e81565b9050919050565b60006020820190508181036000830152614adb81613ee7565b9050919050565b60006020820190508181036000830152614afb81613f4d565b9050919050565b60006020820190508181036000830152614b1b81613fb3565b9050919050565b60006020820190508181036000830152614b3b81613ff3565b9050919050565b60006020820190508181036000830152614b5b81614033565b9050919050565b60006020820190508181036000830152614b7b81614099565b9050919050565b60006020820190508181036000830152614b9b816140d9565b9050919050565b60006020820190508181036000830152614bbb81614119565b9050919050565b60006020820190508181036000830152614bdb81614159565b9050919050565b60006020820190508181036000830152614bfb816141bf565b9050919050565b60006020820190508181036000830152614c1b81614225565b9050919050565b60006020820190508181036000830152614c3b8161428b565b9050919050565b60006020820190508181036000830152614c5b816142cb565b9050919050565b60006020820190508181036000830152614c7b8161430b565b9050919050565b60006020820190508181036000830152614c9b81614371565b9050919050565b60006020820190508181036000830152614cbb816143d7565b9050919050565b60006020820190508181036000830152614cdb8161443d565b9050919050565b60006020820190508181036000830152614cfb8161447d565b9050919050565b60006020820190508181036000830152614d1b816144e3565b9050919050565b60006020820190508181036000830152614d3b81614523565b9050919050565b60006020820190508181036000830152614d5b81614589565b9050919050565b60006020820190508181036000830152614d7b816145ef565b9050919050565b60006020820190508181036000830152614d9b8161462f565b9050919050565b60006020820190508181036000830152614dbb81614695565b9050919050565b60006020820190508181036000830152614ddb816146fb565b9050919050565b60006020820190508181036000830152614dfb8161473b565b9050919050565b60006020820190508181036000830152614e1b816147a1565b9050919050565b60006020820190508181036000830152614e3b816147e1565b9050919050565b60006020820190508181036000830152614e5b81614821565b9050919050565b60006020820190508181036000830152614e7b81614861565b9050919050565b6000602082019050614e9760008301846148b0565b92915050565b6000604082019050614eb260008301856148b0565b614ebf6020830184613c0e565b9392505050565b6000604082019050614edb60008301856148b0565b614ee86020830184613bf0565b9392505050565b6000604051905081810181811067ffffffffffffffff82111715614f1657614f1561514a565b5b8060405250919050565b600067ffffffffffffffff821115614f3b57614f3a61514a565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f6b57614f6a61514a565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006150128261506d565b9050919050565b60006150248261506d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006150af826150b6565b9050919050565b60006150c1826150c8565b9050919050565b60006150d38261506d565b9050919050565b82818337600083830152505050565b60005b838110156151075780820151818401526020810190506150ec565b83811115615116576000848401525b50505050565b600061512782615138565b9050919050565b6000819050919050565b60006151438261515d565b9050919050565bfe5b6000601f19601f8301169050919050565b60008160601b9050919050565b61517381615007565b811461517e57600080fd5b50565b61518a8161502b565b811461519557600080fd5b50565b6151a181615041565b81146151ac57600080fd5b50565b6151b88161508d565b81146151c357600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220d5746d898db65409984b54a72028ffc7b4a35c38a290b6fe04b1c91554b7ec0f64736f6c63430007060033
Deployed Bytecode
0x60806040526004361061025c5760003560e01c80636c0360eb11610144578063b88d4fde116100b6578063d474f2121161007a578063d474f212146108a3578063d920aa8f146108ce578063e985e9c5146108f7578063e986655014610934578063f2fde38b1461094b578063f3e4c247146109745761025c565b8063b88d4fde146107be578063c45de1cf146107e7578063c87b56dd14610812578063cad69e7b1461084f578063cb774d47146108785761025c565b80638da5cb5b116101085780638da5cb5b146106ac57806391785e6d146106d757806395d89b4114610714578063a22cb4651461073f578063a230b90c14610768578063a855903f146107935761025c565b80636c0360eb146105d957806370a0823114610604578063715018a6146106415780637d17fcbe146106585780638462151c1461066f5761025c565b806323b872dd116101dd5780634f6ccce7116101a15780634f6ccce7146104c95780635190863f1461050657806354214f691461053157806355f804b31461055c5780636352211e146105855780636a6c8267146105c25761025c565b806323b872dd146103f85780632f2eda31146104215780632f745c591461044c5780633ccfd60b1461048957806342842e0e146104a05761025c565b80630c41f497116102245780630c41f497146103465780630fcf2e751461035d578063109695231461038857806316fbe8de146103b157806318160ddd146103cd5761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b3146103065780630c1c972a1461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613ac8565b61099d565b60405161029591906149e0565b60405180910390f35b3480156102aa57600080fd5b506102b3610a04565b6040516102c09190614a40565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613b5b565b610aa6565b6040516102fd9190614957565b60405180910390f35b34801561031257600080fd5b5061032d60048036038101906103289190613a8c565b610b2b565b005b34801561033b57600080fd5b50610344610c43565b005b34801561035257600080fd5b5061035b610d2c565b005b34801561036957600080fd5b50610372610dc5565b60405161037f91906149e0565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa9190613b1a565b610dd8565b005b6103cb60048036038101906103c69190613b84565b610e6e565b005b3480156103d957600080fd5b506103e26110e4565b6040516103ef9190614e82565b60405180910390f35b34801561040457600080fd5b5061041f600480360381019061041a9190613986565b6110f5565b005b34801561042d57600080fd5b50610436611155565b6040516104439190614e82565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e9190613a8c565b61115b565b6040516104809190614e82565b60405180910390f35b34801561049557600080fd5b5061049e6111b6565b005b3480156104ac57600080fd5b506104c760048036038101906104c29190613986565b611281565b005b3480156104d557600080fd5b506104f060048036038101906104eb9190613b5b565b6112a1565b6040516104fd9190614e82565b60405180910390f35b34801561051257600080fd5b5061051b6112c4565b6040516105289190614e82565b60405180910390f35b34801561053d57600080fd5b506105466112ca565b60405161055391906149e0565b60405180910390f35b34801561056857600080fd5b50610583600480360381019061057e9190613b1a565b61130a565b005b34801561059157600080fd5b506105ac60048036038101906105a79190613b5b565b611392565b6040516105b99190614957565b60405180910390f35b3480156105ce57600080fd5b506105d76113c9565b005b3480156105e557600080fd5b506105ee6114ac565b6040516105fb9190614a40565b60405180910390f35b34801561061057600080fd5b5061062b60048036038101906106269190613921565b61154e565b6040516106389190614e82565b60405180910390f35b34801561064d57600080fd5b5061065661160d565b005b34801561066457600080fd5b5061066d61174a565b005b34801561067b57600080fd5b5061069660048036038101906106919190613921565b611819565b6040516106a391906149be565b60405180910390f35b3480156106b857600080fd5b506106c1611912565b6040516106ce9190614957565b60405180910390f35b3480156106e357600080fd5b506106fe60048036038101906106f99190613b5b565b61193c565b60405161070b9190614e82565b60405180910390f35b34801561072057600080fd5b50610729611959565b6040516107369190614a40565b60405180910390f35b34801561074b57600080fd5b5061076660048036038101906107619190613a50565b6119fb565b005b34801561077457600080fd5b5061077d611b7c565b60405161078a9190614e82565b60405180910390f35b34801561079f57600080fd5b506107a8611b82565b6040516107b59190614e82565b60405180910390f35b3480156107ca57600080fd5b506107e560048036038101906107e091906139d5565b611b87565b005b3480156107f357600080fd5b506107fc611be9565b6040516108099190614a40565b60405180910390f35b34801561081e57600080fd5b5061083960048036038101906108349190613b5b565b611c87565b6040516108469190614a40565b60405180910390f35b34801561085b57600080fd5b5061087660048036038101906108719190613a8c565b611e0a565b005b34801561088457600080fd5b5061088d611fca565b60405161089a9190614e82565b60405180910390f35b3480156108af57600080fd5b506108b8611fd4565b6040516108c59190614e82565b60405180910390f35b3480156108da57600080fd5b506108f560048036038101906108f09190613b5b565b611fda565b005b34801561090357600080fd5b5061091e6004803603810190610919919061394a565b612060565b60405161092b91906149e0565b60405180910390f35b34801561094057600080fd5b506109496120f4565b005b34801561095757600080fd5b50610972600480360381019061096d9190613921565b6121f9565b005b34801561098057600080fd5b5061099b60048036038101906109969190613921565b6123a5565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a9c5780601f10610a7157610100808354040283529160200191610a9c565b820191906000526020600020905b815481529060010190602001808311610a7f57829003601f168201915b5050505050905090565b6000610ab182612465565b610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae790614ce2565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b3682611392565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9e90614d82565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc6612482565b73ffffffffffffffffffffffffffffffffffffffff161480610bf55750610bf481610bef612482565b612060565b5b610c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2b90614c62565b60405180910390fd5b610c3e838361248a565b505050565b610c4b612482565b73ffffffffffffffffffffffffffffffffffffffff16610c69611912565b73ffffffffffffffffffffffffffffffffffffffff1614610cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb690614d02565b60405180910390fd5b600e60149054906101000a900460ff1615610d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0690614a82565b60405180910390fd5b6001600e60146101000a81548160ff021916908315150217905550565b610d34612482565b73ffffffffffffffffffffffffffffffffffffffff16610d52611912565b73ffffffffffffffffffffffffffffffffffffffff1614610da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9f90614d02565b60405180910390fd5b6000600e60146101000a81548160ff021916908315150217905550565b600e60149054906101000a900460ff1681565b610de0612482565b73ffffffffffffffffffffffffffffffffffffffff16610dfe611912565b73ffffffffffffffffffffffffffffffffffffffff1614610e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4b90614d02565b60405180910390fd5b80600d9080519060200190610e6a92919061373d565b5050565b6000610e786110e4565b9050600e60149054906101000a900460ff16610ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec090614da2565b60405180910390fd5b60158310610f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0390614c02565b60405180910390fd5b612711610f22848361254390919063ffffffff16565b10610f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5990614ae2565b60405180910390fd5b60008360105402905034811115610fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa590614b82565b60405180910390fd5b6000610fba3385612598565b905080610ffc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff390614e22565b60405180910390fd5b600083141561100d5743600f819055505b60005b858110156110475760006110226110e4565b9050612710811015611039576110383382612683565b5b508080600101915050611010565b506000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663ff2b806487336040518363ffffffff1660e01b81526004016110aa929190614ec6565b600060405180830381600087803b1580156110c457600080fd5b505af11580156110d8573d6000803e3d6000fd5b50505050505050505050565b60006110f060026126a1565b905090565b611106611100612482565b826126b6565b611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614de2565b60405180910390fd5b611150838383612794565b505050565b600f5481565b60006111ae82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206129d990919063ffffffff16565b905092915050565b6111be612482565b73ffffffffffffffffffffffffffffffffffffffff166111dc611912565b73ffffffffffffffffffffffffffffffffffffffff1614611232576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122990614d02565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561127d573d6000803e3d6000fd5b5050565b61129c83838360405180602001604052806000815250611b87565b505050565b6000806112b88360026129f390919063ffffffff16565b50905080915050919050565b60105481565b6000601360009054906101000a900460ff16156112f857601360009054906101000a900460ff169050611307565b6113006110e4565b6011541490505b90565b611312612482565b73ffffffffffffffffffffffffffffffffffffffff16611330611912565b73ffffffffffffffffffffffffffffffffffffffff1614611386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137d90614d02565b60405180910390fd5b61138f81612a1f565b50565b60006113c2826040518060600160405280602981526020016151f9602991396002612a399092919063ffffffff16565b9050919050565b6113d1612482565b73ffffffffffffffffffffffffffffffffffffffff166113ef611912565b73ffffffffffffffffffffffffffffffffffffffff1614611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c90614d02565b60405180910390fd5b600061144f611fca565b1161148f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148690614c22565b60405180910390fd5b6001601360006101000a81548160ff021916908315150217905550565b6060600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115445780601f1061151957610100808354040283529160200191611544565b820191906000526020600020905b81548152906001019060200180831161152757829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b690614c82565b60405180910390fd5b611606600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612a58565b9050919050565b611615612482565b73ffffffffffffffffffffffffffffffffffffffff16611633611912565b73ffffffffffffffffffffffffffffffffffffffff1614611689576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168090614d02565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611752612482565b73ffffffffffffffffffffffffffffffffffffffff16611770611912565b73ffffffffffffffffffffffffffffffffffffffff16146117c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bd90614d02565b60405180910390fd5b60006117d0611fca565b14611810576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180790614c42565b60405180910390fd5b43600f81905550565b606060006118268361154e565b9050600081141561188157600067ffffffffffffffff8111801561184957600080fd5b506040519080825280602002602001820160405280156118785781602001602082028036833780820191505090505b5091505061190d565b60008167ffffffffffffffff8111801561189a57600080fd5b506040519080825280602002602001820160405280156118c95781602001602082028036833780820191505090505b50905060005b82811015611906576118e1858261115b565b8282815181106118ed57fe5b60200260200101818152505080806001019150506118cf565b8193505050505b919050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600060096000838152602001908152602001600020549050919050565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119f15780601f106119c6576101008083540402835291602001916119f1565b820191906000526020600020905b8154815290600101906020018083116119d457829003601f168201915b5050505050905090565b611a03612482565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6890614b62565b60405180910390fd5b8060056000611a7e612482565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b2b612482565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b7091906149e0565b60405180910390a35050565b60125481565b601481565b611b98611b92612482565b836126b6565b611bd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bce90614de2565b60405180910390fd5b611be384848484612a6d565b50505050565b600d8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611c7f5780601f10611c5457610100808354040283529160200191611c7f565b820191906000526020600020905b815481529060010190602001808311611c6257829003601f168201915b505050505081565b6060611c9282612465565b611cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc890614d42565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d7a5780601f10611d4f57610100808354040283529160200191611d7a565b820191906000526020600020905b815481529060010190602001808311611d5d57829003601f168201915b505050505090506000611d8b6114ac565b9050600081511415611da1578192505050611e05565b600082511115611dd6578082604051602001611dbe92919061490d565b60405160208183030381529060405292505050611e05565b80611de085612ac9565b604051602001611df192919061490d565b604051602081830303815290604052925050505b919050565b611e12612482565b73ffffffffffffffffffffffffffffffffffffffff16611e30611912565b73ffffffffffffffffffffffffffffffffffffffff1614611e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7d90614d02565b60405180910390fd5b600081118015611e9857506012548111155b611ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ece90614d62565b60405180910390fd5b6000611ee16110e4565b905060005b82811015611f14576127108183011015611f0757611f0684828401612683565b5b8080600101915050611ee6565b506000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663ff2b806484866040518363ffffffff1660e01b8152600401611f77929190614e9d565b600060405180830381600087803b158015611f9157600080fd5b505af1158015611fa5573d6000803e3d6000fd5b50505050611fbe83601254612c1090919063ffffffff16565b60128190555050505050565b6000600b54905090565b60115481565b611fe2612482565b73ffffffffffffffffffffffffffffffffffffffff16612000611912565b73ffffffffffffffffffffffffffffffffffffffff1614612056576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204d90614d02565b60405180910390fd5b8060108190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006120fe611fca565b1461213e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213590614c42565b60405180910390fd5b6000600f541415612184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217b90614dc2565b60405180910390fd5b6000601154600f544060001c8161219757fe5b06905060ff6121b1600f5443612c1090919063ffffffff16565b11156121cd57601154600143034060001c816121c957fe5b0690505b60008114156121ed576121ea60018261254390919063ffffffff16565b90505b6121f681612c60565b50565b612201612482565b73ffffffffffffffffffffffffffffffffffffffff1661221f611912565b73ffffffffffffffffffffffffffffffffffffffff1614612275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226c90614d02565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122dc90614ac2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6123ad612482565b73ffffffffffffffffffffffffffffffffffffffff166123cb611912565b73ffffffffffffffffffffffffffffffffffffffff1614612421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241890614d02565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061247b826002612c6a90919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124fd83611392565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008082840190508381101561258e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258590614b22565b60405180910390fd5b8091505092915050565b600080836040516020016125ac9190614931565b60405160208183030381529060405280519060200120905060008060006125d286612c84565b92509250925060006125e385612d53565b90507320ff11c0383c3e84d2d251ab77ebbad667c2964c73ffffffffffffffffffffffffffffffffffffffff166001828686866040516000815260200160405260405161263394939291906149fb565b6020604051602081039080840390855afa158015612655573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16149550505050505092915050565b61269d828260405180602001604052806000815250612dbf565b5050565b60006126af82600001612e1a565b9050919050565b60006126c182612465565b612700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f790614be2565b60405180910390fd5b600061270b83611392565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061277a57508373ffffffffffffffffffffffffffffffffffffffff1661276284610aa6565b73ffffffffffffffffffffffffffffffffffffffff16145b8061278b575061278a8185612060565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127b482611392565b73ffffffffffffffffffffffffffffffffffffffff161461280a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280190614d22565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561287a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287190614b42565b60405180910390fd5b612885838383612e2b565b61289060008261248a565b6128e181600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e3090919063ffffffff16565b5061293381600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e4a90919063ffffffff16565b5061294a81836002612e649092919063ffffffff16565b5060016009600083815260200190815260200160002054016009600083815260200190815260200160002081905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006129e88360000183612e99565b60001c905092915050565b600080600080612a068660000186612f06565b915091508160001c8160001c9350935050509250929050565b80600a9080519060200190612a3592919061373d565b5050565b6000612a4c846000018460001b84612f89565b60001c90509392505050565b6000612a668260000161301a565b9050919050565b612a78848484612794565b612a848484848461302b565b612ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aba90614aa2565b60405180910390fd5b50505050565b60606000821415612b11576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c0b565b600082905060005b60008214612b3b578080600101915050600a8281612b3357fe5b049150612b19565b60008167ffffffffffffffff81118015612b5457600080fd5b506040519080825280601f01601f191660200182016040528015612b875781602001600182028036833780820191505090505b50905060006001830390508593505b60008414612c0357600a8481612ba857fe5b0660300160f81b82828060019003935081518110612bc257fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481612bfb57fe5b049350612b96565b819450505050505b919050565b600082821115612c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4c90614ba2565b60405180910390fd5b818303905092915050565b80600b8190555050565b6000612c7c836000018360001b61318f565b905092915050565b60008060006041845114612ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc490614e62565b60405180910390fd5b6020840151915060408401519050606084015160001a9250601b8360ff161015612cf857601b830192505b601b8360ff161480612d0d5750601c8360ff16145b612d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4390614e42565b60405180910390fd5b9193909250565b6000806040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a33320000000081525090508083604051602001612da19291906148e5565b60405160208183030381529060405280519060200120915050919050565b612dc983836131b2565b612dd6600084848461302b565b612e15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0c90614aa2565b60405180910390fd5b505050565b600081600001805490509050919050565b505050565b6000612e42836000018360001b613340565b905092915050565b6000612e5c836000018360001b613428565b905092915050565b6000612e90846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613498565b90509392505050565b600081836000018054905011612ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612edb90614a62565b60405180910390fd5b826000018281548110612ef357fe5b9060005260206000200154905092915050565b60008082846000018054905011612f52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4990614ca2565b60405180910390fd5b6000846000018481548110612f6357fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe29190614a40565b60405180910390fd5b50846000016001820381548110612ffe57fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b600061304c8473ffffffffffffffffffffffffffffffffffffffff16613574565b6130595760019050613187565b600061312063150b7a0260e01b61306e612482565b8887876040516024016130849493929190614972565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518060600160405280603281526020016151c7603291398773ffffffffffffffffffffffffffffffffffffffff166135879092919063ffffffff16565b90506000818060200190518101906131389190613af1565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321990614cc2565b60405180910390fd5b61322b81612465565b1561326b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326290614b02565b60405180910390fd5b61327760008383612e2b565b6132c881600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e4a90919063ffffffff16565b506132df81836002612e649092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000808360010160008481526020019081526020016000205490506000811461341c576000600182039050600060018660000180549050039050600086600001828154811061338b57fe5b90600052602060002001549050808760000184815481106133a857fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806133e057fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613422565b60009150505b92915050565b6000613434838361359f565b61348d578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613492565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561353f5784600001604051806040016040528086815260200185815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050846000018054905085600101600086815260200190815260200160002081905550600191505061356d565b8285600001600183038154811061355257fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600080823b905060008111915050919050565b606061359684846000856135c2565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b606082471015613607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135fe90614bc2565b60405180910390fd5b61361085613574565b61364f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161364690614e02565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161367891906148ce565b60006040518083038185875af1925050503d80600081146136b5576040519150601f19603f3d011682016040523d82523d6000602084013e6136ba565b606091505b50915091506136ca8282866136d6565b92505050949350505050565b606083156136e657829050613736565b6000835111156136f95782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372d9190614a40565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261377357600085556137ba565b82601f1061378c57805160ff19168380011785556137ba565b828001600101855582156137ba579182015b828111156137b957825182559160200191906001019061379e565b5b5090506137c791906137cb565b5090565b5b808211156137e45760008160009055506001016137cc565b5090565b60006137fb6137f684614f20565b614eef565b90508281526020810184848401111561381357600080fd5b61381e8482856150da565b509392505050565b600061383961383484614f50565b614eef565b90508281526020810184848401111561385157600080fd5b61385c8482856150da565b509392505050565b6000813590506138738161516a565b92915050565b60008135905061388881615181565b92915050565b60008135905061389d81615198565b92915050565b6000815190506138b281615198565b92915050565b600082601f8301126138c957600080fd5b81356138d98482602086016137e8565b91505092915050565b600082601f8301126138f357600080fd5b8135613903848260208601613826565b91505092915050565b60008135905061391b816151af565b92915050565b60006020828403121561393357600080fd5b600061394184828501613864565b91505092915050565b6000806040838503121561395d57600080fd5b600061396b85828601613864565b925050602061397c85828601613864565b9150509250929050565b60008060006060848603121561399b57600080fd5b60006139a986828701613864565b93505060206139ba86828701613864565b92505060406139cb8682870161390c565b9150509250925092565b600080600080608085870312156139eb57600080fd5b60006139f987828801613864565b9450506020613a0a87828801613864565b9350506040613a1b8782880161390c565b925050606085013567ffffffffffffffff811115613a3857600080fd5b613a44878288016138b8565b91505092959194509250565b60008060408385031215613a6357600080fd5b6000613a7185828601613864565b9250506020613a8285828601613879565b9150509250929050565b60008060408385031215613a9f57600080fd5b6000613aad85828601613864565b9250506020613abe8582860161390c565b9150509250929050565b600060208284031215613ada57600080fd5b6000613ae88482850161388e565b91505092915050565b600060208284031215613b0357600080fd5b6000613b11848285016138a3565b91505092915050565b600060208284031215613b2c57600080fd5b600082013567ffffffffffffffff811115613b4657600080fd5b613b52848285016138e2565b91505092915050565b600060208284031215613b6d57600080fd5b6000613b7b8482850161390c565b91505092915050565b60008060408385031215613b9757600080fd5b6000613ba58582860161390c565b925050602083013567ffffffffffffffff811115613bc257600080fd5b613bce858286016138b8565b9150509250929050565b6000613be483836148a1565b60208301905092915050565b613bf9816150a4565b82525050565b613c0881615019565b82525050565b613c1781615007565b82525050565b613c2e613c2982615007565b61511c565b82525050565b6000613c3f82614f90565b613c498185614fbe565b9350613c5483614f80565b8060005b83811015613c85578151613c6c8882613bd8565b9750613c7783614fb1565b925050600181019050613c58565b5085935050505092915050565b613c9b8161502b565b82525050565b613caa81615037565b82525050565b613cc1613cbc82615037565b61512e565b82525050565b6000613cd282614f9b565b613cdc8185614fcf565b9350613cec8185602086016150e9565b613cf58161514c565b840191505092915050565b6000613d0b82614f9b565b613d158185614fe0565b9350613d258185602086016150e9565b80840191505092915050565b6000613d3c82614fa6565b613d468185614feb565b9350613d568185602086016150e9565b613d5f8161514c565b840191505092915050565b6000613d7582614fa6565b613d7f8185614ffc565b9350613d8f8185602086016150e9565b80840191505092915050565b6000613da8602283614feb565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e0e600783614ffc565b91507f446f6e6b65792d000000000000000000000000000000000000000000000000006000830152600782019050919050565b6000613e4e601d83614feb565b91507f5075626c69632073616c652068617320616c726561647920626567756e0000006000830152602082019050919050565b6000613e8e603283614feb565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613ef4602683614feb565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f5a602b83614feb565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620446f6e6b6579730000000000000000000000000000000000000000006020830152604082019050919050565b6000613fc0601c83614feb565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000614000601b83614feb565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000614040602483614feb565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140a6601983614feb565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006140e6601f83614feb565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000614126601e83614feb565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b6000614166602683614feb565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141cc602c83614feb565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614232602183614feb565b91507f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614298601983614feb565b91507f5374617274696e6720696e646578206973206e6f7420736574000000000000006000830152602082019050919050565b60006142d8601d83614feb565b91507f5374617274696e6720696e64657820697320616c7265616479207365740000006000830152602082019050919050565b6000614318603883614feb565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061437e602a83614feb565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006143e4602283614feb565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061444a602083614feb565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061448a602c83614feb565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006144f0602083614feb565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614530602983614feb565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614596602f83614feb565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006145fc601783614feb565b91507f4e6f7420656e6f7567682072657365727665206c6566740000000000000000006000830152602082019050919050565b600061463c602183614feb565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146a2602383614feb565b91507f53616c65206d7573742062652061637469766520746f2061646f707420446f6e60008301527f6b657900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614708602083614feb565b91507f5374617274696e6720696e64657820626c6f636b206d757374206265207365746000830152602082019050919050565b6000614748603183614feb565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006147ae601d83614feb565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b60006147ee601c83614feb565b91507f456c69676962696c697479206b6579206973206e6f742076616c6964000000006000830152602082019050919050565b600061482e600b83614feb565b91507f76616c7565206f662076200000000000000000000000000000000000000000006000830152602082019050919050565b600061486e600e83614feb565b91507f696e76616c6964206c656e6774680000000000000000000000000000000000006000830152602082019050919050565b6148aa8161508d565b82525050565b6148b98161508d565b82525050565b6148c881615097565b82525050565b60006148da8284613d00565b915081905092915050565b60006148f18285613d00565b91506148fd8284613cb0565b6020820191508190509392505050565b60006149198285613d6a565b91506149258284613d6a565b91508190509392505050565b600061493c82613e01565b91506149488284613c1d565b60148201915081905092915050565b600060208201905061496c6000830184613c0e565b92915050565b60006080820190506149876000830187613bff565b6149946020830186613c0e565b6149a160408301856148b0565b81810360608301526149b38184613cc7565b905095945050505050565b600060208201905081810360008301526149d88184613c34565b905092915050565b60006020820190506149f56000830184613c92565b92915050565b6000608082019050614a106000830187613ca1565b614a1d60208301866148bf565b614a2a6040830185613ca1565b614a376060830184613ca1565b95945050505050565b60006020820190508181036000830152614a5a8184613d31565b905092915050565b60006020820190508181036000830152614a7b81613d9b565b9050919050565b60006020820190508181036000830152614a9b81613e41565b9050919050565b60006020820190508181036000830152614abb81613e81565b9050919050565b60006020820190508181036000830152614adb81613ee7565b9050919050565b60006020820190508181036000830152614afb81613f4d565b9050919050565b60006020820190508181036000830152614b1b81613fb3565b9050919050565b60006020820190508181036000830152614b3b81613ff3565b9050919050565b60006020820190508181036000830152614b5b81614033565b9050919050565b60006020820190508181036000830152614b7b81614099565b9050919050565b60006020820190508181036000830152614b9b816140d9565b9050919050565b60006020820190508181036000830152614bbb81614119565b9050919050565b60006020820190508181036000830152614bdb81614159565b9050919050565b60006020820190508181036000830152614bfb816141bf565b9050919050565b60006020820190508181036000830152614c1b81614225565b9050919050565b60006020820190508181036000830152614c3b8161428b565b9050919050565b60006020820190508181036000830152614c5b816142cb565b9050919050565b60006020820190508181036000830152614c7b8161430b565b9050919050565b60006020820190508181036000830152614c9b81614371565b9050919050565b60006020820190508181036000830152614cbb816143d7565b9050919050565b60006020820190508181036000830152614cdb8161443d565b9050919050565b60006020820190508181036000830152614cfb8161447d565b9050919050565b60006020820190508181036000830152614d1b816144e3565b9050919050565b60006020820190508181036000830152614d3b81614523565b9050919050565b60006020820190508181036000830152614d5b81614589565b9050919050565b60006020820190508181036000830152614d7b816145ef565b9050919050565b60006020820190508181036000830152614d9b8161462f565b9050919050565b60006020820190508181036000830152614dbb81614695565b9050919050565b60006020820190508181036000830152614ddb816146fb565b9050919050565b60006020820190508181036000830152614dfb8161473b565b9050919050565b60006020820190508181036000830152614e1b816147a1565b9050919050565b60006020820190508181036000830152614e3b816147e1565b9050919050565b60006020820190508181036000830152614e5b81614821565b9050919050565b60006020820190508181036000830152614e7b81614861565b9050919050565b6000602082019050614e9760008301846148b0565b92915050565b6000604082019050614eb260008301856148b0565b614ebf6020830184613c0e565b9392505050565b6000604082019050614edb60008301856148b0565b614ee86020830184613bf0565b9392505050565b6000604051905081810181811067ffffffffffffffff82111715614f1657614f1561514a565b5b8060405250919050565b600067ffffffffffffffff821115614f3b57614f3a61514a565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f6b57614f6a61514a565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006150128261506d565b9050919050565b60006150248261506d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006150af826150b6565b9050919050565b60006150c1826150c8565b9050919050565b60006150d38261506d565b9050919050565b82818337600083830152505050565b60005b838110156151075780820151818401526020810190506150ec565b83811115615116576000848401525b50505050565b600061512782615138565b9050919050565b6000819050919050565b60006151438261515d565b9050919050565bfe5b6000601f19601f8301169050919050565b60008160601b9050919050565b61517381615007565b811461517e57600080fd5b50565b61518a8161502b565b811461519557600080fd5b50565b6151a181615041565b81146151ac57600080fd5b50565b6151b88161508d565b81146151c357600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220d5746d898db65409984b54a72028ffc7b4a35c38a290b6fe04b1c91554b7ec0f64736f6c63430007060033
Deployed Bytecode Sourcemap
74430:7192:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17445:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58856:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62248:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61778:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78405:185;;;;;;;;;;;;;:::i;:::-;;77444:91;;;;;;;;;;;;;:::i;:::-;;74634:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77096:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79287:1374;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61256:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63138:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74685:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61018:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76305:131;;;;;;;;;;;;;:::i;:::-;;63641:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61544:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74767:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77713:175;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77231:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58612:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77900:152;;;;;;;;;;;;;:::i;:::-;;60231:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58329:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73707:148;;;;;;;;;;;;;:::i;:::-;;78189:204;;;;;;;;;;;;;:::i;:::-;;78779:500;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73056:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63451:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59025:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62541:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75026:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74839:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63863:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74522:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59200:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76444:644;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60340:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74889:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77338:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62907:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80719:809;;;;;;;;;;;;;:::i;:::-;;74010:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77543:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17445:150;17530:4;17554:20;:33;17575:11;17554:33;;;;;;;;;;;;;;;;;;;;;;;;;;;17547:40;;17445:150;;;:::o;58856:100::-;58910:13;58943:5;58936:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58856:100;:::o;62248:221::-;62324:7;62352:16;62360:7;62352;:16::i;:::-;62344:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;62437:15;:24;62453:7;62437:24;;;;;;;;;;;;;;;;;;;;;62430:31;;62248:221;;;:::o;61778:404::-;61859:13;61875:23;61890:7;61875:14;:23::i;:::-;61859:39;;61923:5;61917:11;;:2;:11;;;;61909:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;62003:5;61987:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;62012:44;62036:5;62043:12;:10;:12::i;:::-;62012:23;:44::i;:::-;61987:69;61979:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;62153:21;62162:2;62166:7;62153:8;:21::i;:::-;61778:404;;;:::o;78405:185::-;73287:12;:10;:12::i;:::-;73276:23;;:7;:5;:7::i;:::-;:23;;;73268:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;78494:18:::1;;;;;;;;;;;78493:19;78485:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;78578:4;78557:18;;:25;;;;;;;;;;;;;;;;;;78405:185::o:0;77444:91::-;73287:12;:10;:12::i;:::-;73276:23;;:7;:5;:7::i;:::-;:23;;;73268:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77522:5:::1;77501:18;;:26;;;;;;;;;;;;;;;;;;77444:91::o:0;74634:38::-;;;;;;;;;;;;;:::o;77096:127::-;73287:12;:10;:12::i;:::-;73276:23;;:7;:5;:7::i;:::-;:23;;;73268:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77201:14:::1;77181:17;:34;;;;;;;;;;;;:::i;:::-;;77096:127:::0;:::o;79287:1374::-;79381:26;79410:13;:11;:13::i;:::-;79381:42;;79442:18;;;;;;;;;;;79434:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;79536:2;79519:14;:19;79511:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;79636:5;79595:38;79618:14;79595:18;:22;;:38;;;;:::i;:::-;:46;79587:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;79718:18;79753:14;79739:11;;:28;79718:49;;79800:9;79786:10;:23;;79778:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;79857:26;79886:47;79909:10;79921:11;79886:22;:47::i;:::-;79857:76;;79952:21;79944:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;80055:1;80033:18;:23;80029:99;;;80104:12;80073:28;:43;;;;80029:99;80152:6;80148:205;80168:14;80164:1;:18;80148:205;;;80204:17;80224:13;:11;:13::i;:::-;80204:33;;80268:5;80256:9;:17;80252:90;;;80294:32;80304:10;80316:9;80294;:32::i;:::-;80252:90;80148:205;80184:3;;;;;;;80148:205;;;;80480:48;80563:23;;;;;;;;;;;80480:107;;80598:16;:27;;;80626:14;80642:10;80598:55;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79287:1374;;;;;;:::o;61256:211::-;61317:7;61438:21;:12;:19;:21::i;:::-;61431:28;;61256:211;:::o;63138:305::-;63299:41;63318:12;:10;:12::i;:::-;63332:7;63299:18;:41::i;:::-;63291:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;63407:28;63417:4;63423:2;63427:7;63407:9;:28::i;:::-;63138:305;;;:::o;74685:43::-;;;;:::o;61018:162::-;61115:7;61142:30;61166:5;61142:13;:20;61156:5;61142:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;61135:37;;61018:162;;;;:::o;76305:131::-;73287:12;:10;:12::i;:::-;73276:23;;:7;:5;:7::i;:::-;:23;;;73268:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76353:12:::1;76368:21;76353:36;;76400:10;:19;;:28;76420:7;76400:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;73347:1;76305:131::o:0;63641:151::-;63745:39;63762:4;63768:2;63772:7;63745:39;;;;;;;;;;;;:16;:39::i;:::-;63641:151;;;:::o;61544:172::-;61619:7;61640:15;61661:22;61677:5;61661:12;:15;;:22;;;;:::i;:::-;61639:44;;;61701:7;61694:14;;;61544:172;;;:::o;74767:46::-;;;;:::o;77713:175::-;77755:4;77775:13;;;;;;;;;;;77772:64;;;77811:13;;;;;;;;;;;77804:20;;;;77772:64;77867:13;:11;:13::i;:::-;77853:10;;:27;77846:34;;77713:175;;:::o;77231:99::-;73287:12;:10;:12::i;:::-;73276:23;;:7;:5;:7::i;:::-;:23;;;73268:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77302:20:::1;77314:7;77302:11;:20::i;:::-;77231:99:::0;:::o;58612:177::-;58684:7;58711:70;58728:7;58711:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;58704:77;;58612:177;;;:::o;77900:152::-;73287:12;:10;:12::i;:::-;73276:23;;:7;:5;:7::i;:::-;:23;;;73268:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77982:1:::1;77964:15;:13;:15::i;:::-;:19;77956:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;78040:4;78024:13;;:20;;;;;;;;;;;;;;;;;;77900:152::o:0;60231:97::-;60279:13;60312:8;60305:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60231:97;:::o;58329:221::-;58401:7;58446:1;58429:19;;:5;:19;;;;58421:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;58513:29;:13;:20;58527:5;58513:20;;;;;;;;;;;;;;;:27;:29::i;:::-;58506:36;;58329:221;;;:::o;73707:148::-;73287:12;:10;:12::i;:::-;73276:23;;:7;:5;:7::i;:::-;:23;;;73268:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73814:1:::1;73777:40;;73798:6;;;;;;;;;;;73777:40;;;;;;;;;;;;73845:1;73828:6;;:19;;;;;;;;;;;;;;;;;;73707:148::o:0;78189:204::-;73287:12;:10;:12::i;:::-;73276:23;;:7;:5;:7::i;:::-;:23;;;73268:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;78286:1:::1;78267:15;:13;:15::i;:::-;:20;78259:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;78373:12;78342:28;:43;;;;78189:204::o:0;78779:500::-;78838:16;78868:18;78889:17;78899:6;78889:9;:17::i;:::-;78868:38;;78935:1;78921:10;:15;78917:355;;;78974:1;78960:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78953:23;;;;;78917:355;79009:23;79049:10;79035:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79009:51;;79075:13;79103:130;79127:10;79119:5;:18;79103:130;;;79183:34;79203:6;79211:5;79183:19;:34::i;:::-;79167:6;79174:5;79167:13;;;;;;;;;;;;;:50;;;;;79139:7;;;;;;;79103:130;;;79254:6;79247:13;;;;;78779:500;;;;:::o;73056:87::-;73102:7;73129:6;;;;;;;;;;;73122:13;;73056:87;:::o;63451:119::-;63517:7;63544:9;:18;63554:7;63544:18;;;;;;;;;;;;63537:25;;63451:119;;;:::o;59025:104::-;59081:13;59114:7;59107:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59025:104;:::o;62541:295::-;62656:12;:10;:12::i;:::-;62644:24;;:8;:24;;;;62636:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;62756:8;62711:18;:32;62730:12;:10;:12::i;:::-;62711:32;;;;;;;;;;;;;;;:42;62744:8;62711:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;62809:8;62780:48;;62795:12;:10;:12::i;:::-;62780:48;;;62819:8;62780:48;;;;;;:::i;:::-;;;;;;;;62541:295;;:::o;75026:30::-;;;;:::o;74839:43::-;74880:2;74839:43;:::o;63863:285::-;63995:41;64014:12;:10;:12::i;:::-;64028:7;63995:18;:41::i;:::-;63987:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;64101:39;64115:4;64121:2;64125:7;64134:5;64101:13;:39::i;:::-;63863:285;;;;:::o;74522:36::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59200:792::-;59273:13;59307:16;59315:7;59307;:16::i;:::-;59299:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;59388:23;59414:10;:19;59425:7;59414:19;;;;;;;;;;;59388:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59444:18;59465:9;:7;:9::i;:::-;59444:30;;59572:1;59556:4;59550:18;:23;59546:72;;;59597:9;59590:16;;;;;;59546:72;59748:1;59728:9;59722:23;:27;59718:108;;;59797:4;59803:9;59780:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59766:48;;;;;;59718:108;59958:4;59964:18;:7;:16;:18::i;:::-;59941:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59927:57;;;;59200:792;;;;:::o;76444:644::-;73287:12;:10;:12::i;:::-;73276:23;;:7;:5;:7::i;:::-;:23;;;73268:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76566:1:::1;76549:14;:18;:53;;;;;76589:13;;76571:14;:31;;76549:53;76541:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;76641:17;76661:13;:11;:13::i;:::-;76641:33;;76690:6;76685:159;76706:14;76702:1;:18;76685:159;;;76762:5;76758:1;76746:9;:13;:21;76742:91;;;76788:29;76798:3;76815:1;76803:9;:13;76788:9;:29::i;:::-;76742:91;76722:3;;;;;;;76685:159;;;;76854:48;76937:23;;;;;;;;;;;76854:107;;76972:16;:27;;;77000:14;77016:3;76972:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;77047:33;77065:14;77047:13;;:17;;:33;;;;:::i;:::-;77031:13;:49;;;;73347:1;;76444:644:::0;;:::o;60340:100::-;60394:4;60418:14;;60411:21;;60340:100;:::o;74889:33::-;;;;:::o;77338:94::-;73287:12;:10;:12::i;:::-;73276:23;;:7;:5;:7::i;:::-;:23;;;73268:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77419:5:::1;77405:11;:19;;;;77338:94:::0;:::o;62907:164::-;63004:4;63028:18;:25;63047:5;63028:25;;;;;;;;;;;;;;;:35;63054:8;63028:35;;;;;;;;;;;;;;;;;;;;;;;;;63021:42;;62907:164;;;;:::o;80719:809::-;80792:1;80773:15;:13;:15::i;:::-;:20;80765:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;80878:1;80846:28;;:33;;80838:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;80937:21;81040:10;;81007:28;;80997:39;80992:45;;:58;;;;;;80973:77;;81235:3;81186:46;81203:28;;81186:12;:16;;:46;;;;:::i;:::-;:52;81182:150;;;81310:10;;81304:1;81289:12;:16;81279:27;81274:33;;:46;;;;;;81255:65;;81182:150;81403:1;81383:16;:21;81379:96;;;81440:23;81461:1;81440:16;:20;;:23;;;;:::i;:::-;81421:42;;81379:96;81485:35;81503:16;81485:17;:35::i;:::-;80719:809;:::o;74010:244::-;73287:12;:10;:12::i;:::-;73276:23;;:7;:5;:7::i;:::-;:23;;;73268:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74119:1:::1;74099:22;;:8;:22;;;;74091:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;74209:8;74180:38;;74201:6;;;;;;;;;;;74180:38;;;;;;;;;;;;74238:8;74229:6;;:17;;;;;;;;;;;;;;;;;;74010:244:::0;:::o;77543:162::-;73287:12;:10;:12::i;:::-;73276:23;;:7;:5;:7::i;:::-;:23;;;73268:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77671:26:::1;77645:23;;:52;;;;;;;;;;;;;;;;;;77543:162:::0;:::o;65615:127::-;65680:4;65704:30;65726:7;65704:12;:21;;:30;;;;:::i;:::-;65697:37;;65615:127;;;:::o;7877:106::-;7930:15;7965:10;7958:17;;7877:106;:::o;71040:192::-;71142:2;71115:15;:24;71131:7;71115:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;71198:7;71194:2;71160:46;;71169:23;71184:7;71169:14;:23::i;:::-;71160:46;;;;;;;;;;;;71040:192;;:::o;21007:179::-;21065:7;21085:9;21101:1;21097;:5;21085:17;;21126:1;21121;:6;;21113:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;21177:1;21170:8;;;21007:179;;;;:::o;75679:433::-;75787:4;75804:19;75864:14;75836:43;;;;;;;;:::i;:::-;;;;;;;;;;;;;75826:54;;;;;;75804:76;;75892:7;75901:9;75912;75925:30;75940:14;75925;:30::i;:::-;75891:64;;;;;;75966:15;75984:28;76000:11;75984:15;:28::i;:::-;75966:46;;76062:42;76031:73;;:27;76041:7;76050:1;76053;76056;76031:27;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:73;;;76024:80;;;;;;;75679:433;;;;:::o;66607:110::-;66683:26;66693:2;66697:7;66683:26;;;;;;;;;;;;:9;:26::i;:::-;66607:110;;:::o;51488:123::-;51557:7;51584:19;51592:3;:10;;51584:7;:19::i;:::-;51577:26;;51488:123;;;:::o;65909:355::-;66002:4;66027:16;66035:7;66027;:16::i;:::-;66019:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;66103:13;66119:23;66134:7;66119:14;:23::i;:::-;66103:39;;66172:5;66161:16;;:7;:16;;;:51;;;;66205:7;66181:31;;:20;66193:7;66181:11;:20::i;:::-;:31;;;66161:51;:94;;;;66216:39;66240:5;66247:7;66216:23;:39::i;:::-;66161:94;66153:103;;;65909:355;;;;:::o;68271:653::-;68396:4;68369:31;;:23;68384:7;68369:14;:23::i;:::-;:31;;;68361:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;68497:1;68483:16;;:2;:16;;;;68475:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;68553:39;68574:4;68580:2;68584:7;68553:20;:39::i;:::-;68657:29;68674:1;68678:7;68657:8;:29::i;:::-;68699:35;68726:7;68699:13;:19;68713:4;68699:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;68745:30;68767:7;68745:13;:17;68759:2;68745:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;68788:29;68805:7;68814:2;68788:12;:16;;:29;;;;;:::i;:::-;;68870:1;68849:9;:18;68859:7;68849:18;;;;;;;;;;;;:22;68828:9;:18;68838:7;68828:18;;;;;;;;;;;:43;;;;68908:7;68904:2;68889:27;;68898:4;68889:27;;;;;;;;;;;;68271:653;;;:::o;43279:137::-;43350:7;43385:22;43389:3;:10;;43401:5;43385:3;:22::i;:::-;43377:31;;43370:38;;43279:137;;;;:::o;51950:236::-;52030:7;52039;52060:11;52073:13;52090:22;52094:3;:10;;52106:5;52090:3;:22::i;:::-;52059:53;;;;52139:3;52131:12;;52169:5;52161:14;;52123:55;;;;;;51950:236;;;;;:::o;69525:100::-;69609:8;69598;:19;;;;;;;;;;;;:::i;:::-;;69525:100;:::o;53236:213::-;53343:7;53394:44;53399:3;:10;;53419:3;53411:12;;53425;53394:4;:44::i;:::-;53386:53;;53363:78;;53236:213;;;;;:::o;42821:114::-;42881:7;42908:19;42916:3;:10;;42908:7;:19::i;:::-;42901:26;;42821:114;;;:::o;65030:272::-;65144:28;65154:4;65160:2;65164:7;65144:9;:28::i;:::-;65191:48;65214:4;65220:2;65224:7;65233:5;65191:22;:48::i;:::-;65183:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;65030:272;;;;:::o;53700:746::-;53756:13;53986:1;53977:5;:10;53973:53;;;54004:10;;;;;;;;;;;;;;;;;;;;;53973:53;54036:12;54051:5;54036:20;;54067:14;54092:78;54107:1;54099:4;:9;54092:78;;54125:8;;;;;;;54156:2;54148:10;;;;;;;;;54092:78;;;54180:19;54212:6;54202:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54180:39;;54230:13;54255:1;54246:6;:10;54230:26;;54274:5;54267:12;;54290:117;54305:1;54297:4;:9;54290:117;;54366:2;54359:4;:9;;;;;;54354:2;:14;54341:29;;54323:6;54330:7;;;;;;;54323:15;;;;;;;;;;;:47;;;;;;;;;;;54393:2;54385:10;;;;;;;;;54290:117;;;54431:6;54417:21;;;;;;53700:746;;;;:::o;21469:158::-;21527:7;21560:1;21555;:6;;21547:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;21618:1;21614;:5;21607:12;;21469:158;;;;:::o;69637:115::-;69730:14;69713;:31;;;;69637:115;:::o;51249:151::-;51333:4;51357:35;51367:3;:10;;51387:3;51379:12;;51357:9;:35::i;:::-;51350:42;;51249:151;;;;:::o;60448:486::-;60540:7;60549:9;60560;60609:2;60595:3;:10;:16;60587:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;60688:2;60683:3;60679:12;60673:19;60668:24;;60726:2;60721:3;60717:12;60711:19;60706:24;;60772:2;60767:3;60763:12;60757:19;60754:1;60749:28;60744:33;;60806:2;60802:1;:6;;;60798:46;;;60830:2;60825:7;;;;60798:46;60869:2;60864:1;:7;;;:18;;;;60880:2;60875:1;:7;;;60864:18;60856:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;60448:486;;;;;:::o;75440:227::-;75509:7;75529:23;:60;;;;;;;;;;;;;;;;;;;75634:10;75646:11;75617:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75607:52;;;;;;75600:59;;;75440:227;;;:::o;66944:250::-;67040:18;67046:2;67050:7;67040:5;:18::i;:::-;67077:54;67108:1;67112:2;67116:7;67125:5;67077:22;:54::i;:::-;67069:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;66944:250;;;:::o;48067:110::-;48123:7;48150:3;:12;;:19;;;;48143:26;;48067:110;;;:::o;71845:93::-;;;;:::o;42366:137::-;42436:4;42460:35;42468:3;:10;;42488:5;42480:14;;42460:7;:35::i;:::-;42453:42;;42366:137;;;;:::o;42059:131::-;42126:4;42150:32;42155:3;:10;;42175:5;42167:14;;42150:4;:32::i;:::-;42143:39;;42059:131;;;;:::o;50672:185::-;50761:4;50785:64;50790:3;:10;;50810:3;50802:12;;50840:5;50824:23;;50816:32;;50785:4;:64::i;:::-;50778:71;;50672:185;;;;;:::o;38317:204::-;38384:7;38433:5;38412:3;:11;;:18;;;;:26;38404:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38495:3;:11;;38507:5;38495:18;;;;;;;;;;;;;;;;38488:25;;38317:204;;;;:::o;48532:279::-;48599:7;48608;48658:5;48636:3;:12;;:19;;;;:27;48628:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;48715:22;48740:3;:12;;48753:5;48740:19;;;;;;;;;;;;;;;;;;48715:44;;48778:5;:10;;;48790:5;:12;;;48770:33;;;;;48532:279;;;;;:::o;50029:319::-;50123:7;50143:16;50162:3;:12;;:17;50175:3;50162:17;;;;;;;;;;;;50143:36;;50210:1;50198:8;:13;;50213:12;50190:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;50280:3;:12;;50304:1;50293:8;:12;50280:26;;;;;;;;;;;;;;;;;;:33;;;50273:40;;;50029:319;;;;;:::o;37864:109::-;37920:7;37947:3;:11;;:18;;;;37940:25;;37864:109;;;:::o;70317:604::-;70438:4;70465:15;:2;:13;;;:15::i;:::-;70460:60;;70504:4;70497:11;;;;70460:60;70530:23;70556:252;70609:45;;;70669:12;:10;:12::i;:::-;70696:4;70715:7;70737:5;70572:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70556:252;;;;;;;;;;;;;;;;;:2;:15;;;;:252;;;;;:::i;:::-;70530:278;;70819:13;70846:10;70835:32;;;;;;;;;;;;:::i;:::-;70819:48;;55200:10;70896:16;;70886:26;;;:6;:26;;;;70878:35;;;;70317:604;;;;;;;:::o;47847:125::-;47918:4;47963:1;47942:3;:12;;:17;47955:3;47942:17;;;;;;;;;;;;:22;;47935:29;;47847:125;;;;:::o;67530:404::-;67624:1;67610:16;;:2;:16;;;;67602:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;67683:16;67691:7;67683;:16::i;:::-;67682:17;67674:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;67745:45;67774:1;67778:2;67782:7;67745:20;:45::i;:::-;67803:30;67825:7;67803:13;:17;67817:2;67803:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;67846:29;67863:7;67872:2;67846:12;:16;;:29;;;;;:::i;:::-;;67918:7;67914:2;67893:33;;67910:1;67893:33;;;;;;;;;;;;67530:404;;:::o;36019:1544::-;36085:4;36203:18;36224:3;:12;;:19;36237:5;36224:19;;;;;;;;;;;;36203:40;;36274:1;36260:10;:15;36256:1300;;36622:21;36659:1;36646:10;:14;36622:38;;36675:17;36716:1;36695:3;:11;;:18;;;;:22;36675:42;;36962:17;36982:3;:11;;36994:9;36982:22;;;;;;;;;;;;;;;;36962:42;;37128:9;37099:3;:11;;37111:13;37099:26;;;;;;;;;;;;;;;:38;;;;37247:1;37231:13;:17;37205:3;:12;;:23;37218:9;37205:23;;;;;;;;;;;:43;;;;37357:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;37452:3;:12;;:19;37465:5;37452:19;;;;;;;;;;;37445:26;;;37495:4;37488:11;;;;;;;;36256:1300;37539:5;37532:12;;;36019:1544;;;;;:::o;35429:414::-;35492:4;35514:21;35524:3;35529:5;35514:9;:21::i;:::-;35509:327;;35552:3;:11;;35569:5;35552:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35735:3;:11;;:18;;;;35713:3;:12;;:19;35726:5;35713:19;;;;;;;;;;;:40;;;;35775:4;35768:11;;;;35509:327;35819:5;35812:12;;35429:414;;;;;:::o;45347:692::-;45423:4;45539:16;45558:3;:12;;:17;45571:3;45558:17;;;;;;;;;;;;45539:36;;45604:1;45592:8;:13;45588:444;;;45659:3;:12;;45677:38;;;;;;;;45694:3;45677:38;;;;45707:5;45677:38;;;45659:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45874:3;:12;;:19;;;;45854:3;:12;;:17;45867:3;45854:17;;;;;;;;;;;:39;;;;45915:4;45908:11;;;;;45588:444;45988:5;45952:3;:12;;45976:1;45965:8;:12;45952:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;46015:5;46008:12;;;45347:692;;;;;;:::o;26448:422::-;26508:4;26716:12;26827:7;26815:20;26807:28;;26861:1;26854:4;:8;26847:15;;;26448:422;;;:::o;29366:195::-;29469:12;29501:52;29523:6;29531:4;29537:1;29540:12;29501:21;:52::i;:::-;29494:59;;29366:195;;;;;:::o;37649:129::-;37722:4;37769:1;37746:3;:12;;:19;37759:5;37746:19;;;;;;;;;;;;:24;;37739:31;;37649:129;;;;:::o;30418:530::-;30545:12;30603:5;30578:21;:30;;30570:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;30670:18;30681:6;30670:10;:18::i;:::-;30662:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;30796:12;30810:23;30837:6;:11;;30857:5;30865:4;30837:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30795:75;;;;30888:52;30906:7;30915:10;30927:12;30888:17;:52::i;:::-;30881:59;;;;30418:530;;;;;;:::o;32958:742::-;33073:12;33102:7;33098:595;;;33133:10;33126:17;;;;33098:595;33267:1;33247:10;:17;:21;33243:439;;;33510:10;33504:17;33571:15;33558:10;33554:2;33550:19;33543:44;33458:148;33653:12;33646:20;;;;;;;;;;;:::i;:::-;;;;;;;;32958:742;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:262::-;;5924:2;5912:9;5903:7;5899:23;5895:32;5892:2;;;5940:1;5937;5930:12;5892:2;5983:1;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5954:117;5882:196;;;;:::o;6084:518::-;;;6218:2;6206:9;6197:7;6193:23;6189:32;6186:2;;;6234:1;6231;6224:12;6186:2;6277:1;6302:53;6347:7;6338:6;6327:9;6323:22;6302:53;:::i;:::-;6292:63;;6248:117;6432:2;6421:9;6417:18;6404:32;6463:18;6455:6;6452:30;6449:2;;;6495:1;6492;6485:12;6449:2;6523:62;6577:7;6568:6;6557:9;6553:22;6523:62;:::i;:::-;6513:72;;6375:220;6176:426;;;;;:::o;6608:179::-;;6698:46;6740:3;6732:6;6698:46;:::i;:::-;6776:4;6771:3;6767:14;6753:28;;6688:99;;;;:::o;6793:147::-;6888:45;6927:5;6888:45;:::i;:::-;6883:3;6876:58;6866:74;;:::o;6946:142::-;7049:32;7075:5;7049:32;:::i;:::-;7044:3;7037:45;7027:61;;:::o;7094:118::-;7181:24;7199:5;7181:24;:::i;:::-;7176:3;7169:37;7159:53;;:::o;7218:157::-;7323:45;7343:24;7361:5;7343:24;:::i;:::-;7323:45;:::i;:::-;7318:3;7311:58;7301:74;;:::o;7411:732::-;;7559:54;7607:5;7559:54;:::i;:::-;7629:86;7708:6;7703:3;7629:86;:::i;:::-;7622:93;;7739:56;7789:5;7739:56;:::i;:::-;7818:7;7849:1;7834:284;7859:6;7856:1;7853:13;7834:284;;;7935:6;7929:13;7962:63;8021:3;8006:13;7962:63;:::i;:::-;7955:70;;8048:60;8101:6;8048:60;:::i;:::-;8038:70;;7894:224;7881:1;7878;7874:9;7869:14;;7834:284;;;7838:14;8134:3;8127:10;;7535:608;;;;;;;:::o;8149:109::-;8230:21;8245:5;8230:21;:::i;:::-;8225:3;8218:34;8208:50;;:::o;8264:118::-;8351:24;8369:5;8351:24;:::i;:::-;8346:3;8339:37;8329:53;;:::o;8388:157::-;8493:45;8513:24;8531:5;8513:24;:::i;:::-;8493:45;:::i;:::-;8488:3;8481:58;8471:74;;:::o;8551:360::-;;8665:38;8697:5;8665:38;:::i;:::-;8719:70;8782:6;8777:3;8719:70;:::i;:::-;8712:77;;8798:52;8843:6;8838:3;8831:4;8824:5;8820:16;8798:52;:::i;:::-;8875:29;8897:6;8875:29;:::i;:::-;8870:3;8866:39;8859:46;;8641:270;;;;;:::o;8917:373::-;;9049:38;9081:5;9049:38;:::i;:::-;9103:88;9184:6;9179:3;9103:88;:::i;:::-;9096:95;;9200:52;9245:6;9240:3;9233:4;9226:5;9222:16;9200:52;:::i;:::-;9277:6;9272:3;9268:16;9261:23;;9025:265;;;;;:::o;9296:364::-;;9412:39;9445:5;9412:39;:::i;:::-;9467:71;9531:6;9526:3;9467:71;:::i;:::-;9460:78;;9547:52;9592:6;9587:3;9580:4;9573:5;9569:16;9547:52;:::i;:::-;9624:29;9646:6;9624:29;:::i;:::-;9619:3;9615:39;9608:46;;9388:272;;;;;:::o;9666:377::-;;9800:39;9833:5;9800:39;:::i;:::-;9855:89;9937:6;9932:3;9855:89;:::i;:::-;9848:96;;9953:52;9998:6;9993:3;9986:4;9979:5;9975:16;9953:52;:::i;:::-;10030:6;10025:3;10021:16;10014:23;;9776:267;;;;;:::o;10049:366::-;;10212:67;10276:2;10271:3;10212:67;:::i;:::-;10205:74;;10309:34;10305:1;10300:3;10296:11;10289:55;10375:4;10370:2;10365:3;10361:12;10354:26;10406:2;10401:3;10397:12;10390:19;;10195:220;;;:::o;10421:339::-;;10602:84;10684:1;10679:3;10602:84;:::i;:::-;10595:91;;10716:9;10712:1;10707:3;10703:11;10696:30;10752:1;10747:3;10743:11;10736:18;;10585:175;;;:::o;10766:327::-;;10929:67;10993:2;10988:3;10929:67;:::i;:::-;10922:74;;11026:31;11022:1;11017:3;11013:11;11006:52;11084:2;11079:3;11075:12;11068:19;;10912:181;;;:::o;11099:382::-;;11262:67;11326:2;11321:3;11262:67;:::i;:::-;11255:74;;11359:34;11355:1;11350:3;11346:11;11339:55;11425:20;11420:2;11415:3;11411:12;11404:42;11472:2;11467:3;11463:12;11456:19;;11245:236;;;:::o;11487:370::-;;11650:67;11714:2;11709:3;11650:67;:::i;:::-;11643:74;;11747:34;11743:1;11738:3;11734:11;11727:55;11813:8;11808:2;11803:3;11799:12;11792:30;11848:2;11843:3;11839:12;11832:19;;11633:224;;;:::o;11863:375::-;;12026:67;12090:2;12085:3;12026:67;:::i;:::-;12019:74;;12123:34;12119:1;12114:3;12110:11;12103:55;12189:13;12184:2;12179:3;12175:12;12168:35;12229:2;12224:3;12220:12;12213:19;;12009:229;;;:::o;12244:326::-;;12407:67;12471:2;12466:3;12407:67;:::i;:::-;12400:74;;12504:30;12500:1;12495:3;12491:11;12484:51;12561:2;12556:3;12552:12;12545:19;;12390:180;;;:::o;12576:325::-;;12739:67;12803:2;12798:3;12739:67;:::i;:::-;12732:74;;12836:29;12832:1;12827:3;12823:11;12816:50;12892:2;12887:3;12883:12;12876:19;;12722:179;;;:::o;12907:368::-;;13070:67;13134:2;13129:3;13070:67;:::i;:::-;13063:74;;13167:34;13163:1;13158:3;13154:11;13147:55;13233:6;13228:2;13223:3;13219:12;13212:28;13266:2;13261:3;13257:12;13250:19;;13053:222;;;:::o;13281:323::-;;13444:67;13508:2;13503:3;13444:67;:::i;:::-;13437:74;;13541:27;13537:1;13532:3;13528:11;13521:48;13595:2;13590:3;13586:12;13579:19;;13427:177;;;:::o;13610:329::-;;13773:67;13837:2;13832:3;13773:67;:::i;:::-;13766:74;;13870:33;13866:1;13861:3;13857:11;13850:54;13930:2;13925:3;13921:12;13914:19;;13756:183;;;:::o;13945:328::-;;14108:67;14172:2;14167:3;14108:67;:::i;:::-;14101:74;;14205:32;14201:1;14196:3;14192:11;14185:53;14264:2;14259:3;14255:12;14248:19;;14091:182;;;:::o;14279:370::-;;14442:67;14506:2;14501:3;14442:67;:::i;:::-;14435:74;;14539:34;14535:1;14530:3;14526:11;14519:55;14605:8;14600:2;14595:3;14591:12;14584:30;14640:2;14635:3;14631:12;14624:19;;14425:224;;;:::o;14655:376::-;;14818:67;14882:2;14877:3;14818:67;:::i;:::-;14811:74;;14915:34;14911:1;14906:3;14902:11;14895:55;14981:14;14976:2;14971:3;14967:12;14960:36;15022:2;15017:3;15013:12;15006:19;;14801:230;;;:::o;15037:365::-;;15200:67;15264:2;15259:3;15200:67;:::i;:::-;15193:74;;15297:34;15293:1;15288:3;15284:11;15277:55;15363:3;15358:2;15353:3;15349:12;15342:25;15393:2;15388:3;15384:12;15377:19;;15183:219;;;:::o;15408:323::-;;15571:67;15635:2;15630:3;15571:67;:::i;:::-;15564:74;;15668:27;15664:1;15659:3;15655:11;15648:48;15722:2;15717:3;15713:12;15706:19;;15554:177;;;:::o;15737:327::-;;15900:67;15964:2;15959:3;15900:67;:::i;:::-;15893:74;;15997:31;15993:1;15988:3;15984:11;15977:52;16055:2;16050:3;16046:12;16039:19;;15883:181;;;:::o;16070:388::-;;16233:67;16297:2;16292:3;16233:67;:::i;:::-;16226:74;;16330:34;16326:1;16321:3;16317:11;16310:55;16396:26;16391:2;16386:3;16382:12;16375:48;16449:2;16444:3;16440:12;16433:19;;16216:242;;;:::o;16464:374::-;;16627:67;16691:2;16686:3;16627:67;:::i;:::-;16620:74;;16724:34;16720:1;16715:3;16711:11;16704:55;16790:12;16785:2;16780:3;16776:12;16769:34;16829:2;16824:3;16820:12;16813:19;;16610:228;;;:::o;16844:366::-;;17007:67;17071:2;17066:3;17007:67;:::i;:::-;17000:74;;17104:34;17100:1;17095:3;17091:11;17084:55;17170:4;17165:2;17160:3;17156:12;17149:26;17201:2;17196:3;17192:12;17185:19;;16990:220;;;:::o;17216:330::-;;17379:67;17443:2;17438:3;17379:67;:::i;:::-;17372:74;;17476:34;17472:1;17467:3;17463:11;17456:55;17537:2;17532:3;17528:12;17521:19;;17362:184;;;:::o;17552:376::-;;17715:67;17779:2;17774:3;17715:67;:::i;:::-;17708:74;;17812:34;17808:1;17803:3;17799:11;17792:55;17878:14;17873:2;17868:3;17864:12;17857:36;17919:2;17914:3;17910:12;17903:19;;17698:230;;;:::o;17934:330::-;;18097:67;18161:2;18156:3;18097:67;:::i;:::-;18090:74;;18194:34;18190:1;18185:3;18181:11;18174:55;18255:2;18250:3;18246:12;18239:19;;18080:184;;;:::o;18270:373::-;;18433:67;18497:2;18492:3;18433:67;:::i;:::-;18426:74;;18530:34;18526:1;18521:3;18517:11;18510:55;18596:11;18591:2;18586:3;18582:12;18575:33;18634:2;18629:3;18625:12;18618:19;;18416:227;;;:::o;18649:379::-;;18812:67;18876:2;18871:3;18812:67;:::i;:::-;18805:74;;18909:34;18905:1;18900:3;18896:11;18889:55;18975:17;18970:2;18965:3;18961:12;18954:39;19019:2;19014:3;19010:12;19003:19;;18795:233;;;:::o;19034:321::-;;19197:67;19261:2;19256:3;19197:67;:::i;:::-;19190:74;;19294:25;19290:1;19285:3;19281:11;19274:46;19346:2;19341:3;19337:12;19330:19;;19180:175;;;:::o;19361:365::-;;19524:67;19588:2;19583:3;19524:67;:::i;:::-;19517:74;;19621:34;19617:1;19612:3;19608:11;19601:55;19687:3;19682:2;19677:3;19673:12;19666:25;19717:2;19712:3;19708:12;19701:19;;19507:219;;;:::o;19732:367::-;;19895:67;19959:2;19954:3;19895:67;:::i;:::-;19888:74;;19992:34;19988:1;19983:3;19979:11;19972:55;20058:5;20053:2;20048:3;20044:12;20037:27;20090:2;20085:3;20081:12;20074:19;;19878:221;;;:::o;20105:330::-;;20268:67;20332:2;20327:3;20268:67;:::i;:::-;20261:74;;20365:34;20361:1;20356:3;20352:11;20345:55;20426:2;20421:3;20417:12;20410:19;;20251:184;;;:::o;20441:381::-;;20604:67;20668:2;20663:3;20604:67;:::i;:::-;20597:74;;20701:34;20697:1;20692:3;20688:11;20681:55;20767:19;20762:2;20757:3;20753:12;20746:41;20813:2;20808:3;20804:12;20797:19;;20587:235;;;:::o;20828:327::-;;20991:67;21055:2;21050:3;20991:67;:::i;:::-;20984:74;;21088:31;21084:1;21079:3;21075:11;21068:52;21146:2;21141:3;21137:12;21130:19;;20974:181;;;:::o;21161:326::-;;21324:67;21388:2;21383:3;21324:67;:::i;:::-;21317:74;;21421:30;21417:1;21412:3;21408:11;21401:51;21478:2;21473:3;21469:12;21462:19;;21307:180;;;:::o;21493:309::-;;21656:67;21720:2;21715:3;21656:67;:::i;:::-;21649:74;;21753:13;21749:1;21744:3;21740:11;21733:34;21793:2;21788:3;21784:12;21777:19;;21639:163;;;:::o;21808:312::-;;21971:67;22035:2;22030:3;21971:67;:::i;:::-;21964:74;;22068:16;22064:1;22059:3;22055:11;22048:37;22111:2;22106:3;22102:12;22095:19;;21954:166;;;:::o;22126:108::-;22203:24;22221:5;22203:24;:::i;:::-;22198:3;22191:37;22181:53;;:::o;22240:118::-;22327:24;22345:5;22327:24;:::i;:::-;22322:3;22315:37;22305:53;;:::o;22364:112::-;22447:22;22463:5;22447:22;:::i;:::-;22442:3;22435:35;22425:51;;:::o;22482:271::-;;22634:93;22723:3;22714:6;22634:93;:::i;:::-;22627:100;;22744:3;22737:10;;22616:137;;;;:::o;22759:412::-;;22939:93;23028:3;23019:6;22939:93;:::i;:::-;22932:100;;23042:75;23113:3;23104:6;23042:75;:::i;:::-;23142:2;23137:3;23133:12;23126:19;;23162:3;23155:10;;22921:250;;;;;:::o;23177:435::-;;23379:95;23470:3;23461:6;23379:95;:::i;:::-;23372:102;;23491:95;23582:3;23573:6;23491:95;:::i;:::-;23484:102;;23603:3;23596:10;;23361:251;;;;;:::o;23618:522::-;;23853:148;23997:3;23853:148;:::i;:::-;23846:155;;24011:75;24082:3;24073:6;24011:75;:::i;:::-;24111:2;24106:3;24102:12;24095:19;;24131:3;24124:10;;23835:305;;;;:::o;24146:222::-;;24277:2;24266:9;24262:18;24254:26;;24290:71;24358:1;24347:9;24343:17;24334:6;24290:71;:::i;:::-;24244:124;;;;:::o;24374:672::-;;24623:3;24612:9;24608:19;24600:27;;24637:87;24721:1;24710:9;24706:17;24697:6;24637:87;:::i;:::-;24734:72;24802:2;24791:9;24787:18;24778:6;24734:72;:::i;:::-;24816;24884:2;24873:9;24869:18;24860:6;24816:72;:::i;:::-;24935:9;24929:4;24925:20;24920:2;24909:9;24905:18;24898:48;24963:76;25034:4;25025:6;24963:76;:::i;:::-;24955:84;;24590:456;;;;;;;:::o;25052:373::-;;25233:2;25222:9;25218:18;25210:26;;25282:9;25276:4;25272:20;25268:1;25257:9;25253:17;25246:47;25310:108;25413:4;25404:6;25310:108;:::i;:::-;25302:116;;25200:225;;;;:::o;25431:210::-;;25556:2;25545:9;25541:18;25533:26;;25569:65;25631:1;25620:9;25616:17;25607:6;25569:65;:::i;:::-;25523:118;;;;:::o;25647:545::-;;25858:3;25847:9;25843:19;25835:27;;25872:71;25940:1;25929:9;25925:17;25916:6;25872:71;:::i;:::-;25953:68;26017:2;26006:9;26002:18;25993:6;25953:68;:::i;:::-;26031:72;26099:2;26088:9;26084:18;26075:6;26031:72;:::i;:::-;26113;26181:2;26170:9;26166:18;26157:6;26113:72;:::i;:::-;25825:367;;;;;;;:::o;26198:313::-;;26349:2;26338:9;26334:18;26326:26;;26398:9;26392:4;26388:20;26384:1;26373:9;26369:17;26362:47;26426:78;26499:4;26490:6;26426:78;:::i;:::-;26418:86;;26316:195;;;;:::o;26517:419::-;;26721:2;26710:9;26706:18;26698:26;;26770:9;26764:4;26760:20;26756:1;26745:9;26741:17;26734:47;26798:131;26924:4;26798:131;:::i;:::-;26790:139;;26688:248;;;:::o;26942:419::-;;27146:2;27135:9;27131:18;27123:26;;27195:9;27189:4;27185:20;27181:1;27170:9;27166:17;27159:47;27223:131;27349:4;27223:131;:::i;:::-;27215:139;;27113:248;;;:::o;27367:419::-;;27571:2;27560:9;27556:18;27548:26;;27620:9;27614:4;27610:20;27606:1;27595:9;27591:17;27584:47;27648:131;27774:4;27648:131;:::i;:::-;27640:139;;27538:248;;;:::o;27792:419::-;;27996:2;27985:9;27981:18;27973:26;;28045:9;28039:4;28035:20;28031:1;28020:9;28016:17;28009:47;28073:131;28199:4;28073:131;:::i;:::-;28065:139;;27963:248;;;:::o;28217:419::-;;28421:2;28410:9;28406:18;28398:26;;28470:9;28464:4;28460:20;28456:1;28445:9;28441:17;28434:47;28498:131;28624:4;28498:131;:::i;:::-;28490:139;;28388:248;;;:::o;28642:419::-;;28846:2;28835:9;28831:18;28823:26;;28895:9;28889:4;28885:20;28881:1;28870:9;28866:17;28859:47;28923:131;29049:4;28923:131;:::i;:::-;28915:139;;28813:248;;;:::o;29067:419::-;;29271:2;29260:9;29256:18;29248:26;;29320:9;29314:4;29310:20;29306:1;29295:9;29291:17;29284:47;29348:131;29474:4;29348:131;:::i;:::-;29340:139;;29238:248;;;:::o;29492:419::-;;29696:2;29685:9;29681:18;29673:26;;29745:9;29739:4;29735:20;29731:1;29720:9;29716:17;29709:47;29773:131;29899:4;29773:131;:::i;:::-;29765:139;;29663:248;;;:::o;29917:419::-;;30121:2;30110:9;30106:18;30098:26;;30170:9;30164:4;30160:20;30156:1;30145:9;30141:17;30134:47;30198:131;30324:4;30198:131;:::i;:::-;30190:139;;30088:248;;;:::o;30342:419::-;;30546:2;30535:9;30531:18;30523:26;;30595:9;30589:4;30585:20;30581:1;30570:9;30566:17;30559:47;30623:131;30749:4;30623:131;:::i;:::-;30615:139;;30513:248;;;:::o;30767:419::-;;30971:2;30960:9;30956:18;30948:26;;31020:9;31014:4;31010:20;31006:1;30995:9;30991:17;30984:47;31048:131;31174:4;31048:131;:::i;:::-;31040:139;;30938:248;;;:::o;31192:419::-;;31396:2;31385:9;31381:18;31373:26;;31445:9;31439:4;31435:20;31431:1;31420:9;31416:17;31409:47;31473:131;31599:4;31473:131;:::i;:::-;31465:139;;31363:248;;;:::o;31617:419::-;;31821:2;31810:9;31806:18;31798:26;;31870:9;31864:4;31860:20;31856:1;31845:9;31841:17;31834:47;31898:131;32024:4;31898:131;:::i;:::-;31890:139;;31788:248;;;:::o;32042:419::-;;32246:2;32235:9;32231:18;32223:26;;32295:9;32289:4;32285:20;32281:1;32270:9;32266:17;32259:47;32323:131;32449:4;32323:131;:::i;:::-;32315:139;;32213:248;;;:::o;32467:419::-;;32671:2;32660:9;32656:18;32648:26;;32720:9;32714:4;32710:20;32706:1;32695:9;32691:17;32684:47;32748:131;32874:4;32748:131;:::i;:::-;32740:139;;32638:248;;;:::o;32892:419::-;;33096:2;33085:9;33081:18;33073:26;;33145:9;33139:4;33135:20;33131:1;33120:9;33116:17;33109:47;33173:131;33299:4;33173:131;:::i;:::-;33165:139;;33063:248;;;:::o;33317:419::-;;33521:2;33510:9;33506:18;33498:26;;33570:9;33564:4;33560:20;33556:1;33545:9;33541:17;33534:47;33598:131;33724:4;33598:131;:::i;:::-;33590:139;;33488:248;;;:::o;33742:419::-;;33946:2;33935:9;33931:18;33923:26;;33995:9;33989:4;33985:20;33981:1;33970:9;33966:17;33959:47;34023:131;34149:4;34023:131;:::i;:::-;34015:139;;33913:248;;;:::o;34167:419::-;;34371:2;34360:9;34356:18;34348:26;;34420:9;34414:4;34410:20;34406:1;34395:9;34391:17;34384:47;34448:131;34574:4;34448:131;:::i;:::-;34440:139;;34338:248;;;:::o;34592:419::-;;34796:2;34785:9;34781:18;34773:26;;34845:9;34839:4;34835:20;34831:1;34820:9;34816:17;34809:47;34873:131;34999:4;34873:131;:::i;:::-;34865:139;;34763:248;;;:::o;35017:419::-;;35221:2;35210:9;35206:18;35198:26;;35270:9;35264:4;35260:20;35256:1;35245:9;35241:17;35234:47;35298:131;35424:4;35298:131;:::i;:::-;35290:139;;35188:248;;;:::o;35442:419::-;;35646:2;35635:9;35631:18;35623:26;;35695:9;35689:4;35685:20;35681:1;35670:9;35666:17;35659:47;35723:131;35849:4;35723:131;:::i;:::-;35715:139;;35613:248;;;:::o;35867:419::-;;36071:2;36060:9;36056:18;36048:26;;36120:9;36114:4;36110:20;36106:1;36095:9;36091:17;36084:47;36148:131;36274:4;36148:131;:::i;:::-;36140:139;;36038:248;;;:::o;36292:419::-;;36496:2;36485:9;36481:18;36473:26;;36545:9;36539:4;36535:20;36531:1;36520:9;36516:17;36509:47;36573:131;36699:4;36573:131;:::i;:::-;36565:139;;36463:248;;;:::o;36717:419::-;;36921:2;36910:9;36906:18;36898:26;;36970:9;36964:4;36960:20;36956:1;36945:9;36941:17;36934:47;36998:131;37124:4;36998:131;:::i;:::-;36990:139;;36888:248;;;:::o;37142:419::-;;37346:2;37335:9;37331:18;37323:26;;37395:9;37389:4;37385:20;37381:1;37370:9;37366:17;37359:47;37423:131;37549:4;37423:131;:::i;:::-;37415:139;;37313:248;;;:::o;37567:419::-;;37771:2;37760:9;37756:18;37748:26;;37820:9;37814:4;37810:20;37806:1;37795:9;37791:17;37784:47;37848:131;37974:4;37848:131;:::i;:::-;37840:139;;37738:248;;;:::o;37992:419::-;;38196:2;38185:9;38181:18;38173:26;;38245:9;38239:4;38235:20;38231:1;38220:9;38216:17;38209:47;38273:131;38399:4;38273:131;:::i;:::-;38265:139;;38163:248;;;:::o;38417:419::-;;38621:2;38610:9;38606:18;38598:26;;38670:9;38664:4;38660:20;38656:1;38645:9;38641:17;38634:47;38698:131;38824:4;38698:131;:::i;:::-;38690:139;;38588:248;;;:::o;38842:419::-;;39046:2;39035:9;39031:18;39023:26;;39095:9;39089:4;39085:20;39081:1;39070:9;39066:17;39059:47;39123:131;39249:4;39123:131;:::i;:::-;39115:139;;39013:248;;;:::o;39267:419::-;;39471:2;39460:9;39456:18;39448:26;;39520:9;39514:4;39510:20;39506:1;39495:9;39491:17;39484:47;39548:131;39674:4;39548:131;:::i;:::-;39540:139;;39438:248;;;:::o;39692:419::-;;39896:2;39885:9;39881:18;39873:26;;39945:9;39939:4;39935:20;39931:1;39920:9;39916:17;39909:47;39973:131;40099:4;39973:131;:::i;:::-;39965:139;;39863:248;;;:::o;40117:419::-;;40321:2;40310:9;40306:18;40298:26;;40370:9;40364:4;40360:20;40356:1;40345:9;40341:17;40334:47;40398:131;40524:4;40398:131;:::i;:::-;40390:139;;40288:248;;;:::o;40542:222::-;;40673:2;40662:9;40658:18;40650:26;;40686:71;40754:1;40743:9;40739:17;40730:6;40686:71;:::i;:::-;40640:124;;;;:::o;40770:332::-;;40929:2;40918:9;40914:18;40906:26;;40942:71;41010:1;40999:9;40995:17;40986:6;40942:71;:::i;:::-;41023:72;41091:2;41080:9;41076:18;41067:6;41023:72;:::i;:::-;40896:206;;;;;:::o;41108:348::-;;41275:2;41264:9;41260:18;41252:26;;41288:71;41356:1;41345:9;41341:17;41332:6;41288:71;:::i;:::-;41369:80;41445:2;41434:9;41430:18;41421:6;41369:80;:::i;:::-;41242:214;;;;;:::o;41462:278::-;;41528:2;41522:9;41512:19;;41570:4;41562:6;41558:17;41677:6;41665:10;41662:22;41641:18;41629:10;41626:34;41623:62;41620:2;;;41688:13;;:::i;:::-;41620:2;41723:10;41719:2;41712:22;41502:238;;;;:::o;41746:326::-;;41897:18;41889:6;41886:30;41883:2;;;41919:13;;:::i;:::-;41883:2;41999:4;41995:9;41988:4;41980:6;41976:17;41972:33;41964:41;;42060:4;42054;42050:15;42042:23;;41812:260;;;:::o;42078:327::-;;42230:18;42222:6;42219:30;42216:2;;;42252:13;;:::i;:::-;42216:2;42332:4;42328:9;42321:4;42313:6;42309:17;42305:33;42297:41;;42393:4;42387;42383:15;42375:23;;42145:260;;;:::o;42411:132::-;;42501:3;42493:11;;42531:4;42526:3;42522:14;42514:22;;42483:60;;;:::o;42549:114::-;;42650:5;42644:12;42634:22;;42623:40;;;:::o;42669:98::-;;42754:5;42748:12;42738:22;;42727:40;;;:::o;42773:99::-;;42859:5;42853:12;42843:22;;42832:40;;;:::o;42878:113::-;;42980:4;42975:3;42971:14;42963:22;;42953:38;;;:::o;42997:184::-;;43130:6;43125:3;43118:19;43170:4;43165:3;43161:14;43146:29;;43108:73;;;;:::o;43187:168::-;;43304:6;43299:3;43292:19;43344:4;43339:3;43335:14;43320:29;;43282:73;;;;:::o;43361:147::-;;43499:3;43484:18;;43474:34;;;;:::o;43514:169::-;;43632:6;43627:3;43620:19;43672:4;43667:3;43663:14;43648:29;;43610:73;;;;:::o;43689:148::-;;43828:3;43813:18;;43803:34;;;;:::o;43843:96::-;;43909:24;43927:5;43909:24;:::i;:::-;43898:35;;43888:51;;;:::o;43945:104::-;;44019:24;44037:5;44019:24;:::i;:::-;44008:35;;43998:51;;;:::o;44055:90::-;;44132:5;44125:13;44118:21;44107:32;;44097:48;;;:::o;44151:77::-;;44217:5;44206:16;;44196:32;;;:::o;44234:149::-;;44310:66;44303:5;44299:78;44288:89;;44278:105;;;:::o;44389:126::-;;44466:42;44459:5;44455:54;44444:65;;44434:81;;;:::o;44521:77::-;;44587:5;44576:16;;44566:32;;;:::o;44604:86::-;;44679:4;44672:5;44668:16;44657:27;;44647:43;;;:::o;44696:134::-;;44787:37;44818:5;44787:37;:::i;:::-;44774:50;;44764:66;;;:::o;44836:126::-;;44919:37;44950:5;44919:37;:::i;:::-;44906:50;;44896:66;;;:::o;44968:113::-;;45051:24;45069:5;45051:24;:::i;:::-;45038:37;;45028:53;;;:::o;45087:154::-;45171:6;45166:3;45161;45148:30;45233:1;45224:6;45219:3;45215:16;45208:27;45138:103;;;:::o;45247:307::-;45315:1;45325:113;45339:6;45336:1;45333:13;45325:113;;;45424:1;45419:3;45415:11;45409:18;45405:1;45400:3;45396:11;45389:39;45361:2;45358:1;45354:10;45349:15;;45325:113;;;45456:6;45453:1;45450:13;45447:2;;;45536:1;45527:6;45522:3;45518:16;45511:27;45447:2;45296:258;;;;:::o;45560:100::-;;45628:26;45648:5;45628:26;:::i;:::-;45617:37;;45607:53;;;:::o;45666:79::-;;45734:5;45723:16;;45713:32;;;:::o;45751:94::-;;45819:20;45833:5;45819:20;:::i;:::-;45808:31;;45798:47;;;:::o;45851:48::-;45884:9;45905:102;;45997:2;45993:7;45988:2;45981:5;45977:14;45973:28;45963:38;;45953:54;;;:::o;46013:94::-;;46094:5;46090:2;46086:14;46065:35;;46055:52;;;:::o;46113:122::-;46186:24;46204:5;46186:24;:::i;:::-;46179:5;46176:35;46166:2;;46225:1;46222;46215:12;46166:2;46156:79;:::o;46241:116::-;46311:21;46326:5;46311:21;:::i;:::-;46304:5;46301:32;46291:2;;46347:1;46344;46337:12;46291:2;46281:76;:::o;46363:120::-;46435:23;46452:5;46435:23;:::i;:::-;46428:5;46425:34;46415:2;;46473:1;46470;46463:12;46415:2;46405:78;:::o;46489:122::-;46562:24;46580:5;46562:24;:::i;:::-;46555:5;46552:35;46542:2;;46601:1;46598;46591:12;46542:2;46532:79;:::o
Swarm Source
ipfs://d5746d898db65409984b54a72028ffc7b4a35c38a290b6fe04b1c91554b7ec0f
Loading...
Loading
Loading...
Loading
Net Worth in USD
$175.22
Net Worth in ETH
0.08
Token Allocations
ETH
100.00%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $2,190.2 | 0.08 | $175.22 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.