ERC-721
Overview
Max Total Supply
0 PA
Holders
313
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
PunkedApes
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-22 */ // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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"); (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"); (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"); (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"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect 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); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * 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 {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: contracts/PunkedApes.sol pragma solidity ^0.8.11; contract PunkedApes is ERC721, Ownable { using Counters for Counters.Counter; Counters.Counter private _tokenSupply; Counters.Counter private _nextTokenId; uint256 public mintPrice = 0.06 ether; uint256 private reserveAtATime = 50; uint256 private reservedCount = 0; uint256 private maxReserveCount = 50; string _baseTokenURI; uint256 public MAX_SUPPLY = 10000; uint256 public maximumAllowedTokensPerPurchase = 10; uint256 public maximumAllowedTokensPerWallet = 100; address public constant syncAddress = 0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D; struct SaleConfig { uint256 startTime; uint256 duration; } enum WorkflowStatus { Before, Presale, Sale, SoldOut } WorkflowStatus public workflow; SaleConfig public saleConfig; event WorkflowStatusChange(WorkflowStatus previousStatus, WorkflowStatus newStatus); event ChangeSaleConfig(uint256 _startTime, uint256 _maxCount); constructor(string memory baseURI) ERC721("Punked Apes", "PA") { setBaseURI(baseURI); workflow = WorkflowStatus.Before; } modifier saleIsOpen { require(_tokenSupply.current() <= MAX_SUPPLY, "Sale has ended."); _; } modifier onlyAuthorized() { require(owner() == msg.sender); _; } function setWorkflowID(WorkflowStatus _workflowID) public onlyOwner { workflow = _workflowID; } function tokensMinted() public view returns (uint256) { return _tokenSupply.current(); } function setMaximumAllowedTokens(uint256 _count) public onlyAuthorized { maximumAllowedTokensPerPurchase = _count; } function setMaximumAllowedTokensPerWallet(uint256 _count) public onlyAuthorized { maximumAllowedTokensPerWallet = _count; } function setMaxMintSupply(uint256 maxMintSupply) external onlyAuthorized { MAX_SUPPLY = maxMintSupply; } function setReserveAtATime(uint256 val) public onlyAuthorized { reserveAtATime = val; } function setMaxReserve(uint256 val) public onlyAuthorized { maxReserveCount = val; } function setPrice(uint256 _price) public onlyAuthorized { mintPrice = _price; } function setBaseURI(string memory baseURI) public onlyAuthorized { _baseTokenURI = baseURI; } function getReserveAtATime() external view returns (uint256) { return reserveAtATime; } function getLeftDuration() public view returns (uint256) { SaleConfig memory _saleConfig = saleConfig; return (_saleConfig.startTime + _saleConfig.duration) - block.timestamp; } function checkPresaleStatus() public returns (bool) { bool isPresaleEnded = false; SaleConfig memory _saleConfig = saleConfig; if (block.timestamp > _saleConfig.startTime + _saleConfig.duration) { isPresaleEnded = true; workflow = WorkflowStatus.Sale; } return isPresaleEnded; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function reserveNft() public onlyAuthorized { require(reservedCount <= maxReserveCount, "Max Reserves taken already!"); uint256 i; if(_exists(_tokenSupply.current())) { _tokenSupply.increment(); } for (i = 0; i < reserveAtATime; i++) { _tokenSupply.increment(); _safeMint(msg.sender, _tokenSupply.current()); reservedCount++; } } function setUpPresale() external onlyOwner { workflow = WorkflowStatus.Presale; uint256 _startTime = block.timestamp; uint256 _duration = 1 hours; saleConfig = SaleConfig(_startTime, _duration); emit ChangeSaleConfig(_startTime, _duration); } function setUpSale() external onlyOwner { workflow = WorkflowStatus.Sale; emit WorkflowStatusChange(WorkflowStatus.Presale, WorkflowStatus.Sale); } function mint(uint256 _count) public payable saleIsOpen { if(_exists(_tokenSupply.current())) { _tokenSupply.increment(); } uint256 mintIndex = _tokenSupply.current(); bool presaleEnded = checkPresaleStatus(); if (msg.sender != owner()) { require(presaleEnded && workflow == WorkflowStatus.Sale, "Sale is not active currently."); require(balanceOf(msg.sender) + _count <= maximumAllowedTokensPerWallet, "Max holding cap reached."); } if (mintIndex + _count <= MAX_SUPPLY) { workflow = WorkflowStatus.SoldOut; } require(mintIndex + _count <= MAX_SUPPLY, "Total supply exceeded."); require( _count <= maximumAllowedTokensPerPurchase, "Exceeds maximum allowed tokens" ); require(msg.value >= mintPrice * _count, "Insufficient ETH amount sent."); for (uint256 i = 0; i < _count; i++) { _tokenSupply.increment(); if(_exists(_tokenSupply.current())) { _tokenSupply.increment(); } _safeMint(msg.sender, _tokenSupply.current()); } } function preSaleMint(uint256[] calldata _ownedTokenIDs) public payable saleIsOpen { // Get Sync Addres IERC721 token = IERC721(syncAddress); bool presaleStatus = checkPresaleStatus(); require(!presaleStatus, "Presale Has Ended"); require(msg.value >= mintPrice, "Insuffient ETH amount sent."); require( _ownedTokenIDs.length <= maximumAllowedTokensPerPurchase, "Exceeds maximum allowed tokens" ); for (uint256 i = 0; i < _ownedTokenIDs.length; i++) { // As front end need some time to get newly done Transaction, the contract will check passing ids also to be 100% sure that someone won't mint the the same token twice. require(!_exists(_ownedTokenIDs[i]), "This token has already minted"); address isOwner = token.ownerOf(_ownedTokenIDs[i]); require(isOwner == msg.sender, "You are not the holder of this NFT"); _safeMint(msg.sender, _ownedTokenIDs[i]); } } function adminAirdrop(address _BAYCHolderAddress, uint256[] calldata _tokenIDs) external onlyOwner { for (uint256 i = 0; i < _tokenIDs.length; i++) { require(!_exists(_tokenIDs[i]), "This token has already minted"); _safeMint(_BAYCHolderAddress, _tokenIDs[i]); } } function withdraw() external onlyAuthorized { uint balance = address(this).balance; payable(owner()).transfer(balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"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":false,"internalType":"uint256","name":"_startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_maxCount","type":"uint256"}],"name":"ChangeSaleConfig","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum PunkedApes.WorkflowStatus","name":"previousStatus","type":"uint8"},{"indexed":false,"internalType":"enum PunkedApes.WorkflowStatus","name":"newStatus","type":"uint8"}],"name":"WorkflowStatusChange","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_BAYCHolderAddress","type":"address"},{"internalType":"uint256[]","name":"_tokenIDs","type":"uint256[]"}],"name":"adminAirdrop","outputs":[],"stateMutability":"nonpayable","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":"checkPresaleStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLeftDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserveAtATime","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":"maximumAllowedTokensPerPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumAllowedTokensPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","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":[{"internalType":"uint256[]","name":"_ownedTokenIDs","type":"uint256[]"}],"name":"preSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleConfig","outputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxMintSupply","type":"uint256"}],"name":"setMaxMintSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setMaxReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setMaximumAllowedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setMaximumAllowedTokensPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setReserveAtATime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setUpPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setUpSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum PunkedApes.WorkflowStatus","name":"_workflowID","type":"uint8"}],"name":"setWorkflowID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"syncAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensMinted","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"},{"inputs":[],"name":"workflow","outputs":[{"internalType":"enum PunkedApes.WorkflowStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405266d529ae9e8600006009556032600a556000600b556032600c55612710600e55600a600f5560646010553480156200003b57600080fd5b5060405162004f9438038062004f94833981810160405281019062000061919062000510565b6040518060400160405280600b81526020017f50756e6b656420417065730000000000000000000000000000000000000000008152506040518060400160405280600281526020017f50410000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000e5929190620002c3565b508060019080519060200190620000fe929190620002c3565b50505062000121620001156200016760201b60201c565b6200016f60201b60201c565b62000132816200023560201b60201c565b6000601160006101000a81548160ff021916908360038111156200015b576200015a62000561565b5b021790555050620005f5565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff166200025c6200029960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200027d57600080fd5b80600d908051906020019062000295929190620002c3565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002d190620005bf565b90600052602060002090601f016020900481019282620002f5576000855562000341565b82601f106200031057805160ff191683800117855562000341565b8280016001018555821562000341579182015b828111156200034057825182559160200191906001019062000323565b5b50905062000350919062000354565b5090565b5b808211156200036f57600081600090555060010162000355565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003dc8262000391565b810181811067ffffffffffffffff82111715620003fe57620003fd620003a2565b5b80604052505050565b60006200041362000373565b9050620004218282620003d1565b919050565b600067ffffffffffffffff821115620004445762000443620003a2565b5b6200044f8262000391565b9050602081019050919050565b60005b838110156200047c5780820151818401526020810190506200045f565b838111156200048c576000848401525b50505050565b6000620004a9620004a38462000426565b62000407565b905082815260208101848484011115620004c857620004c76200038c565b5b620004d58482856200045c565b509392505050565b600082601f830112620004f557620004f462000387565b5b81516200050784826020860162000492565b91505092915050565b6000602082840312156200052957620005286200037d565b5b600082015167ffffffffffffffff8111156200054a576200054962000382565b5b6200055884828501620004dd565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005d857607f821691505b60208210811415620005ef57620005ee62000590565b5b50919050565b61498f80620006056000396000f3fe6080604052600436106102515760003560e01c806371e3500c11610139578063a3344125116100b6578063e7b62d961161007a578063e7b62d9614610825578063e985e9c514610850578063ea6eb8361461088d578063f2fde38b146108b6578063f6c9d9e3146108df578063f92a37d81461090857610251565b8063a33441251461073e578063b88d4fde14610769578063c87b56dd14610792578063cadf8818146107cf578063ddb0f1c6146107fa57610251565b806391b7f5ed116100fd57806391b7f5ed1461067a57806395d89b41146106a35780639a3bf728146106ce578063a0712d68146106f9578063a22cb4651461071557610251565b806371e3500c146105c75780637389fbb7146105de5780638da5cb5b146106075780638e4e9b021461063257806390aa0b0f1461064e57610251565b80633ccfd60b116101d257806356a87caa1161019657806356a87caa146104b75780636352211e146104e05780636817c76c1461051d5780636de9f32b1461054857806370a0823114610573578063715018a6146105b057610251565b80633ccfd60b146103fc57806342842e0e146104135780634dfea6271461043c578063544e9f891461046557806355f804b31461048e57610251565b80631f2898c3116102195780631f2898c31461033b57806323b872dd14610352578063304fa81a1461037b57806332cb6b0c146103a657806338d1eeae146103d157610251565b806301ffc9a71461025657806306fdde0314610293578063081812fc146102be578063095ea7b3146102fb57806315c316fc14610324575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190612f81565b610931565b60405161028a9190612fc9565b60405180910390f35b34801561029f57600080fd5b506102a8610a13565b6040516102b5919061307d565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e091906130d5565b610aa5565b6040516102f29190613143565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d919061318a565b610b2a565b005b34801561033057600080fd5b50610339610c42565b005b34801561034757600080fd5b50610350610d60565b005b34801561035e57600080fd5b50610379600480360381019061037491906131ca565b610e44565b005b34801561038757600080fd5b50610390610ea4565b60405161039d9190612fc9565b60405180910390f35b3480156103b257600080fd5b506103bb610f23565b6040516103c8919061322c565b60405180910390f35b3480156103dd57600080fd5b506103e6610f29565b6040516103f39190613143565b60405180910390f35b34801561040857600080fd5b50610411610f41565b005b34801561041f57600080fd5b5061043a600480360381019061043591906131ca565b610fd6565b005b34801561044857600080fd5b50610463600480360381019061045e91906130d5565b610ff6565b005b34801561047157600080fd5b5061048c600480360381019061048791906132ac565b61103f565b005b34801561049a57600080fd5b506104b560048036038101906104b0919061343c565b611167565b005b3480156104c357600080fd5b506104de60048036038101906104d991906130d5565b6111c0565b005b3480156104ec57600080fd5b50610507600480360381019061050291906130d5565b611209565b6040516105149190613143565b60405180910390f35b34801561052957600080fd5b506105326112bb565b60405161053f919061322c565b60405180910390f35b34801561055457600080fd5b5061055d6112c1565b60405161056a919061322c565b60405180910390f35b34801561057f57600080fd5b5061059a60048036038101906105959190613485565b6112d2565b6040516105a7919061322c565b60405180910390f35b3480156105bc57600080fd5b506105c561138a565b005b3480156105d357600080fd5b506105dc611412565b005b3480156105ea57600080fd5b50610605600480360381019061060091906130d5565b611516565b005b34801561061357600080fd5b5061061c61155f565b6040516106299190613143565b60405180910390f35b61064c600480360381019061064791906134b2565b611589565b005b34801561065a57600080fd5b5061066361187d565b6040516106719291906134ff565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c91906130d5565b61188f565b005b3480156106af57600080fd5b506106b86118d8565b6040516106c5919061307d565b60405180910390f35b3480156106da57600080fd5b506106e361196a565b6040516106f0919061322c565b60405180910390f35b610713600480360381019061070e91906130d5565b611970565b005b34801561072157600080fd5b5061073c60048036038101906107379190613554565b611c94565b005b34801561074a57600080fd5b50610753611caa565b604051610760919061360b565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b91906136c7565b611cbd565b005b34801561079e57600080fd5b506107b960048036038101906107b491906130d5565b611d1f565b6040516107c6919061307d565b60405180910390f35b3480156107db57600080fd5b506107e4611dc6565b6040516107f1919061322c565b60405180910390f35b34801561080657600080fd5b5061080f611dcc565b60405161081c919061322c565b60405180910390f35b34801561083157600080fd5b5061083a611e17565b604051610847919061322c565b60405180910390f35b34801561085c57600080fd5b506108776004803603810190610872919061374a565b611e21565b6040516108849190612fc9565b60405180910390f35b34801561089957600080fd5b506108b460048036038101906108af91906130d5565b611eb5565b005b3480156108c257600080fd5b506108dd60048036038101906108d89190613485565b611efe565b005b3480156108eb57600080fd5b50610906600480360381019061090191906130d5565b611ff6565b005b34801561091457600080fd5b5061092f600480360381019061092a91906137af565b61203f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109fc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a0c5750610a0b826120e8565b5b9050919050565b606060008054610a229061380b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4e9061380b565b8015610a9b5780601f10610a7057610100808354040283529160200191610a9b565b820191906000526020600020905b815481529060010190602001808311610a7e57829003601f168201915b5050505050905090565b6000610ab082612152565b610aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae6906138af565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b3582611209565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9d90613941565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc56121be565b73ffffffffffffffffffffffffffffffffffffffff161480610bf45750610bf381610bee6121be565b611e21565b5b610c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2a906139d3565b60405180910390fd5b610c3d83836121c6565b505050565b610c4a6121be565b73ffffffffffffffffffffffffffffffffffffffff16610c6861155f565b73ffffffffffffffffffffffffffffffffffffffff1614610cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb590613a3f565b60405180910390fd5b6001601160006101000a81548160ff02191690836003811115610ce457610ce3613594565b5b021790555060004290506000610e109050604051806040016040528083815260200182815250601260008201518160000155602082015181600101559050507f07a1cedf4c1c75b37d60d4517d84a69a3d2ec0534f3a5093c93a94dde3a6a5548282604051610d549291906134ff565b60405180910390a15050565b610d686121be565b73ffffffffffffffffffffffffffffffffffffffff16610d8661155f565b73ffffffffffffffffffffffffffffffffffffffff1614610ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd390613a3f565b60405180910390fd5b6002601160006101000a81548160ff02191690836003811115610e0257610e01613594565b5b02179055507f0a97a4ee45751e2abf3e4fc8946939630b11b371ea8ae39ccdc3056e98f5cc3f60016002604051610e3a929190613a5f565b60405180910390a1565b610e55610e4f6121be565b8261227f565b610e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8b90613afa565b60405180910390fd5b610e9f83838361235d565b505050565b600080600090506000601260405180604001604052908160008201548152602001600182015481525050905080602001518160000151610ee49190613b49565b421115610f1b57600191506002601160006101000a81548160ff02191690836003811115610f1557610f14613594565b5b02179055505b819250505090565b600e5481565b73bc4ca0eda7647a8ab7c2061c2e118a18a936f13d81565b3373ffffffffffffffffffffffffffffffffffffffff16610f6061155f565b73ffffffffffffffffffffffffffffffffffffffff1614610f8057600080fd5b6000479050610f8d61155f565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fd2573d6000803e3d6000fd5b5050565b610ff183838360405180602001604052806000815250611cbd565b505050565b3373ffffffffffffffffffffffffffffffffffffffff1661101561155f565b73ffffffffffffffffffffffffffffffffffffffff161461103557600080fd5b80600f8190555050565b6110476121be565b73ffffffffffffffffffffffffffffffffffffffff1661106561155f565b73ffffffffffffffffffffffffffffffffffffffff16146110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b290613a3f565b60405180910390fd5b60005b82829050811015611161576110eb8383838181106110df576110de613b9f565b5b90506020020135612152565b1561112b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112290613c1a565b60405180910390fd5b61114e8484848481811061114257611141613b9f565b5b905060200201356125c4565b808061115990613c3a565b9150506110be565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff1661118661155f565b73ffffffffffffffffffffffffffffffffffffffff16146111a657600080fd5b80600d90805190602001906111bc929190612e72565b5050565b3373ffffffffffffffffffffffffffffffffffffffff166111df61155f565b73ffffffffffffffffffffffffffffffffffffffff16146111ff57600080fd5b80600c8190555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a990613cf5565b60405180910390fd5b80915050919050565b60095481565b60006112cd60076125e2565b905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133a90613d87565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113926121be565b73ffffffffffffffffffffffffffffffffffffffff166113b061155f565b73ffffffffffffffffffffffffffffffffffffffff1614611406576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fd90613a3f565b60405180910390fd5b61141060006125f0565b565b3373ffffffffffffffffffffffffffffffffffffffff1661143161155f565b73ffffffffffffffffffffffffffffffffffffffff161461145157600080fd5b600c54600b541115611498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148f90613df3565b60405180910390fd5b60006114ac6114a760076125e2565b612152565b156114bc576114bb60076126b6565b5b600090505b600a54811015611513576114d560076126b6565b6114e8336114e360076125e2565b6125c4565b600b60008154809291906114fb90613c3a565b9190505550808061150b90613c3a565b9150506114c1565b50565b3373ffffffffffffffffffffffffffffffffffffffff1661153561155f565b73ffffffffffffffffffffffffffffffffffffffff161461155557600080fd5b80600e8190555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5461159660076125e2565b11156115d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ce90613e5f565b60405180910390fd5b600073bc4ca0eda7647a8ab7c2061c2e118a18a936f13d905060006115fa610ea4565b9050801561163d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163490613ecb565b60405180910390fd5b600954341015611682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167990613f37565b60405180910390fd5b600f548484905011156116ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c190613fa3565b60405180910390fd5b60005b84849050811015611876576116fa8585838181106116ee576116ed613b9f565b5b90506020020135612152565b1561173a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173190613c1a565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff16636352211e87878581811061176b5761176a613b9f565b5b905060200201356040518263ffffffff1660e01b815260040161178e919061322c565b602060405180830381865afa1580156117ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117cf9190613fd8565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461183f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183690614077565b60405180910390fd5b6118623387878581811061185657611855613b9f565b5b905060200201356125c4565b50808061186e90613c3a565b9150506116cd565b5050505050565b60128060000154908060010154905082565b3373ffffffffffffffffffffffffffffffffffffffff166118ae61155f565b73ffffffffffffffffffffffffffffffffffffffff16146118ce57600080fd5b8060098190555050565b6060600180546118e79061380b565b80601f01602080910402602001604051908101604052809291908181526020018280546119139061380b565b80156119605780601f1061193557610100808354040283529160200191611960565b820191906000526020600020905b81548152906001019060200180831161194357829003601f168201915b5050505050905090565b600f5481565b600e5461197d60076125e2565b11156119be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b590613e5f565b60405180910390fd5b6119d06119cb60076125e2565b612152565b156119e0576119df60076126b6565b5b60006119ec60076125e2565b905060006119f8610ea4565b9050611a0261155f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b0c57808015611a74575060026003811115611a5057611a4f613594565b5b601160009054906101000a900460ff166003811115611a7257611a71613594565b5b145b611ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaa906140e3565b60405180910390fd5b60105483611ac0336112d2565b611aca9190613b49565b1115611b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b029061414f565b60405180910390fd5b5b600e548383611b1b9190613b49565b11611b4c576003601160006101000a81548160ff02191690836003811115611b4657611b45613594565b5b02179055505b600e548383611b5b9190613b49565b1115611b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b93906141bb565b60405180910390fd5b600f54831115611be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd890613fa3565b60405180910390fd5b82600954611bef91906141db565b341015611c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2890614281565b60405180910390fd5b60005b83811015611c8e57611c4660076126b6565b611c58611c5360076125e2565b612152565b15611c6857611c6760076126b6565b5b611c7b33611c7660076125e2565b6125c4565b8080611c8690613c3a565b915050611c34565b50505050565b611ca6611c9f6121be565b83836126cc565b5050565b601160009054906101000a900460ff1681565b611cce611cc86121be565b8361227f565b611d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0490613afa565b60405180910390fd5b611d1984848484612839565b50505050565b6060611d2a82612152565b611d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6090614313565b60405180910390fd5b6000611d73612895565b90506000815111611d935760405180602001604052806000815250611dbe565b80611d9d84612927565b604051602001611dae92919061436f565b6040516020818303038152906040525b915050919050565b60105481565b60008060126040518060400160405290816000820154815260200160018201548152505090504281602001518260000151611e079190613b49565b611e119190614393565b91505090565b6000600a54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16611ed461155f565b73ffffffffffffffffffffffffffffffffffffffff1614611ef457600080fd5b8060108190555050565b611f066121be565b73ffffffffffffffffffffffffffffffffffffffff16611f2461155f565b73ffffffffffffffffffffffffffffffffffffffff1614611f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7190613a3f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe190614439565b60405180910390fd5b611ff3816125f0565b50565b3373ffffffffffffffffffffffffffffffffffffffff1661201561155f565b73ffffffffffffffffffffffffffffffffffffffff161461203557600080fd5b80600a8190555050565b6120476121be565b73ffffffffffffffffffffffffffffffffffffffff1661206561155f565b73ffffffffffffffffffffffffffffffffffffffff16146120bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b290613a3f565b60405180910390fd5b80601160006101000a81548160ff021916908360038111156120e0576120df613594565b5b021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661223983611209565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061228a82612152565b6122c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c0906144cb565b60405180910390fd5b60006122d483611209565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061234357508373ffffffffffffffffffffffffffffffffffffffff1661232b84610aa5565b73ffffffffffffffffffffffffffffffffffffffff16145b8061235457506123538185611e21565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661237d82611209565b73ffffffffffffffffffffffffffffffffffffffff16146123d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ca9061455d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612443576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243a906145ef565b60405180910390fd5b61244e838383612a88565b6124596000826121c6565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124a99190614393565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125009190613b49565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125bf838383612a8d565b505050565b6125de828260405180602001604052806000815250612a92565b5050565b600081600001549050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561273b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127329061465b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161282c9190612fc9565b60405180910390a3505050565b61284484848461235d565b61285084848484612aed565b61288f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612886906146ed565b60405180910390fd5b50505050565b6060600d80546128a49061380b565b80601f01602080910402602001604051908101604052809291908181526020018280546128d09061380b565b801561291d5780601f106128f25761010080835404028352916020019161291d565b820191906000526020600020905b81548152906001019060200180831161290057829003601f168201915b5050505050905090565b6060600082141561296f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a83565b600082905060005b600082146129a157808061298a90613c3a565b915050600a8261299a919061473c565b9150612977565b60008167ffffffffffffffff8111156129bd576129bc613311565b5b6040519080825280601f01601f1916602001820160405280156129ef5781602001600182028036833780820191505090505b5090505b60008514612a7c57600182612a089190614393565b9150600a85612a17919061476d565b6030612a239190613b49565b60f81b818381518110612a3957612a38613b9f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a75919061473c565b94506129f3565b8093505050505b919050565b505050565b505050565b612a9c8383612c75565b612aa96000848484612aed565b612ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612adf906146ed565b60405180910390fd5b505050565b6000612b0e8473ffffffffffffffffffffffffffffffffffffffff16612e4f565b15612c68578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b376121be565b8786866040518563ffffffff1660e01b8152600401612b5994939291906147f3565b6020604051808303816000875af1925050508015612b9557506040513d601f19601f82011682018060405250810190612b929190614854565b60015b612c18573d8060008114612bc5576040519150601f19603f3d011682016040523d82523d6000602084013e612bca565b606091505b50600081511415612c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c07906146ed565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c6d565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cdc906148cd565b60405180910390fd5b612cee81612152565b15612d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2590614939565b60405180910390fd5b612d3a60008383612a88565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d8a9190613b49565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e4b60008383612a8d565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612e7e9061380b565b90600052602060002090601f016020900481019282612ea05760008555612ee7565b82601f10612eb957805160ff1916838001178555612ee7565b82800160010185558215612ee7579182015b82811115612ee6578251825591602001919060010190612ecb565b5b509050612ef49190612ef8565b5090565b5b80821115612f11576000816000905550600101612ef9565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f5e81612f29565b8114612f6957600080fd5b50565b600081359050612f7b81612f55565b92915050565b600060208284031215612f9757612f96612f1f565b5b6000612fa584828501612f6c565b91505092915050565b60008115159050919050565b612fc381612fae565b82525050565b6000602082019050612fde6000830184612fba565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561301e578082015181840152602081019050613003565b8381111561302d576000848401525b50505050565b6000601f19601f8301169050919050565b600061304f82612fe4565b6130598185612fef565b9350613069818560208601613000565b61307281613033565b840191505092915050565b600060208201905081810360008301526130978184613044565b905092915050565b6000819050919050565b6130b28161309f565b81146130bd57600080fd5b50565b6000813590506130cf816130a9565b92915050565b6000602082840312156130eb576130ea612f1f565b5b60006130f9848285016130c0565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061312d82613102565b9050919050565b61313d81613122565b82525050565b60006020820190506131586000830184613134565b92915050565b61316781613122565b811461317257600080fd5b50565b6000813590506131848161315e565b92915050565b600080604083850312156131a1576131a0612f1f565b5b60006131af85828601613175565b92505060206131c0858286016130c0565b9150509250929050565b6000806000606084860312156131e3576131e2612f1f565b5b60006131f186828701613175565b935050602061320286828701613175565b9250506040613213868287016130c0565b9150509250925092565b6132268161309f565b82525050565b6000602082019050613241600083018461321d565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261326c5761326b613247565b5b8235905067ffffffffffffffff8111156132895761328861324c565b5b6020830191508360208202830111156132a5576132a4613251565b5b9250929050565b6000806000604084860312156132c5576132c4612f1f565b5b60006132d386828701613175565b935050602084013567ffffffffffffffff8111156132f4576132f3612f24565b5b61330086828701613256565b92509250509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61334982613033565b810181811067ffffffffffffffff8211171561336857613367613311565b5b80604052505050565b600061337b612f15565b90506133878282613340565b919050565b600067ffffffffffffffff8211156133a7576133a6613311565b5b6133b082613033565b9050602081019050919050565b82818337600083830152505050565b60006133df6133da8461338c565b613371565b9050828152602081018484840111156133fb576133fa61330c565b5b6134068482856133bd565b509392505050565b600082601f83011261342357613422613247565b5b81356134338482602086016133cc565b91505092915050565b60006020828403121561345257613451612f1f565b5b600082013567ffffffffffffffff8111156134705761346f612f24565b5b61347c8482850161340e565b91505092915050565b60006020828403121561349b5761349a612f1f565b5b60006134a984828501613175565b91505092915050565b600080602083850312156134c9576134c8612f1f565b5b600083013567ffffffffffffffff8111156134e7576134e6612f24565b5b6134f385828601613256565b92509250509250929050565b6000604082019050613514600083018561321d565b613521602083018461321d565b9392505050565b61353181612fae565b811461353c57600080fd5b50565b60008135905061354e81613528565b92915050565b6000806040838503121561356b5761356a612f1f565b5b600061357985828601613175565b925050602061358a8582860161353f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106135d4576135d3613594565b5b50565b60008190506135e5826135c3565b919050565b60006135f5826135d7565b9050919050565b613605816135ea565b82525050565b600060208201905061362060008301846135fc565b92915050565b600067ffffffffffffffff82111561364157613640613311565b5b61364a82613033565b9050602081019050919050565b600061366a61366584613626565b613371565b9050828152602081018484840111156136865761368561330c565b5b6136918482856133bd565b509392505050565b600082601f8301126136ae576136ad613247565b5b81356136be848260208601613657565b91505092915050565b600080600080608085870312156136e1576136e0612f1f565b5b60006136ef87828801613175565b945050602061370087828801613175565b9350506040613711878288016130c0565b925050606085013567ffffffffffffffff81111561373257613731612f24565b5b61373e87828801613699565b91505092959194509250565b6000806040838503121561376157613760612f1f565b5b600061376f85828601613175565b925050602061378085828601613175565b9150509250929050565b6004811061379757600080fd5b50565b6000813590506137a98161378a565b92915050565b6000602082840312156137c5576137c4612f1f565b5b60006137d38482850161379a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061382357607f821691505b60208210811415613837576138366137dc565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613899602c83612fef565b91506138a48261383d565b604082019050919050565b600060208201905081810360008301526138c88161388c565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061392b602183612fef565b9150613936826138cf565b604082019050919050565b6000602082019050818103600083015261395a8161391e565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006139bd603883612fef565b91506139c882613961565b604082019050919050565b600060208201905081810360008301526139ec816139b0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613a29602083612fef565b9150613a34826139f3565b602082019050919050565b60006020820190508181036000830152613a5881613a1c565b9050919050565b6000604082019050613a7460008301856135fc565b613a8160208301846135fc565b9392505050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613ae4603183612fef565b9150613aef82613a88565b604082019050919050565b60006020820190508181036000830152613b1381613ad7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b548261309f565b9150613b5f8361309f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b9457613b93613b1a565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5468697320746f6b656e2068617320616c7265616479206d696e746564000000600082015250565b6000613c04601d83612fef565b9150613c0f82613bce565b602082019050919050565b60006020820190508181036000830152613c3381613bf7565b9050919050565b6000613c458261309f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c7857613c77613b1a565b5b600182019050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613cdf602983612fef565b9150613cea82613c83565b604082019050919050565b60006020820190508181036000830152613d0e81613cd2565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613d71602a83612fef565b9150613d7c82613d15565b604082019050919050565b60006020820190508181036000830152613da081613d64565b9050919050565b7f4d61782052657365727665732074616b656e20616c7265616479210000000000600082015250565b6000613ddd601b83612fef565b9150613de882613da7565b602082019050919050565b60006020820190508181036000830152613e0c81613dd0565b9050919050565b7f53616c652068617320656e6465642e0000000000000000000000000000000000600082015250565b6000613e49600f83612fef565b9150613e5482613e13565b602082019050919050565b60006020820190508181036000830152613e7881613e3c565b9050919050565b7f50726573616c652048617320456e646564000000000000000000000000000000600082015250565b6000613eb5601183612fef565b9150613ec082613e7f565b602082019050919050565b60006020820190508181036000830152613ee481613ea8565b9050919050565b7f496e7375666669656e742045544820616d6f756e742073656e742e0000000000600082015250565b6000613f21601b83612fef565b9150613f2c82613eeb565b602082019050919050565b60006020820190508181036000830152613f5081613f14565b9050919050565b7f45786365656473206d6178696d756d20616c6c6f77656420746f6b656e730000600082015250565b6000613f8d601e83612fef565b9150613f9882613f57565b602082019050919050565b60006020820190508181036000830152613fbc81613f80565b9050919050565b600081519050613fd28161315e565b92915050565b600060208284031215613fee57613fed612f1f565b5b6000613ffc84828501613fc3565b91505092915050565b7f596f7520617265206e6f742074686520686f6c646572206f662074686973204e60008201527f4654000000000000000000000000000000000000000000000000000000000000602082015250565b6000614061602283612fef565b915061406c82614005565b604082019050919050565b6000602082019050818103600083015261409081614054565b9050919050565b7f53616c65206973206e6f74206163746976652063757272656e746c792e000000600082015250565b60006140cd601d83612fef565b91506140d882614097565b602082019050919050565b600060208201905081810360008301526140fc816140c0565b9050919050565b7f4d617820686f6c64696e672063617020726561636865642e0000000000000000600082015250565b6000614139601883612fef565b915061414482614103565b602082019050919050565b600060208201905081810360008301526141688161412c565b9050919050565b7f546f74616c20737570706c792065786365656465642e00000000000000000000600082015250565b60006141a5601683612fef565b91506141b08261416f565b602082019050919050565b600060208201905081810360008301526141d481614198565b9050919050565b60006141e68261309f565b91506141f18361309f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561422a57614229613b1a565b5b828202905092915050565b7f496e73756666696369656e742045544820616d6f756e742073656e742e000000600082015250565b600061426b601d83612fef565b915061427682614235565b602082019050919050565b6000602082019050818103600083015261429a8161425e565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006142fd602f83612fef565b9150614308826142a1565b604082019050919050565b6000602082019050818103600083015261432c816142f0565b9050919050565b600081905092915050565b600061434982612fe4565b6143538185614333565b9350614363818560208601613000565b80840191505092915050565b600061437b828561433e565b9150614387828461433e565b91508190509392505050565b600061439e8261309f565b91506143a98361309f565b9250828210156143bc576143bb613b1a565b5b828203905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614423602683612fef565b915061442e826143c7565b604082019050919050565b6000602082019050818103600083015261445281614416565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006144b5602c83612fef565b91506144c082614459565b604082019050919050565b600060208201905081810360008301526144e4816144a8565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614547602583612fef565b9150614552826144eb565b604082019050919050565b600060208201905081810360008301526145768161453a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006145d9602483612fef565b91506145e48261457d565b604082019050919050565b60006020820190508181036000830152614608816145cc565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614645601983612fef565b91506146508261460f565b602082019050919050565b6000602082019050818103600083015261467481614638565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006146d7603283612fef565b91506146e28261467b565b604082019050919050565b60006020820190508181036000830152614706816146ca565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006147478261309f565b91506147528361309f565b9250826147625761476161470d565b5b828204905092915050565b60006147788261309f565b91506147838361309f565b9250826147935761479261470d565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006147c58261479e565b6147cf81856147a9565b93506147df818560208601613000565b6147e881613033565b840191505092915050565b60006080820190506148086000830187613134565b6148156020830186613134565b614822604083018561321d565b818103606083015261483481846147ba565b905095945050505050565b60008151905061484e81612f55565b92915050565b60006020828403121561486a57614869612f1f565b5b60006148788482850161483f565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006148b7602083612fef565b91506148c282614881565b602082019050919050565b600060208201905081810360008301526148e6816148aa565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614923601c83612fef565b915061492e826148ed565b602082019050919050565b6000602082019050818103600083015261495281614916565b905091905056fea2646970667358221220cfd8fd7d25f52cd0b1130cbbc355fdfd5b483208cdd0a434f4291ef9ae87432b64736f6c634300080b003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102515760003560e01c806371e3500c11610139578063a3344125116100b6578063e7b62d961161007a578063e7b62d9614610825578063e985e9c514610850578063ea6eb8361461088d578063f2fde38b146108b6578063f6c9d9e3146108df578063f92a37d81461090857610251565b8063a33441251461073e578063b88d4fde14610769578063c87b56dd14610792578063cadf8818146107cf578063ddb0f1c6146107fa57610251565b806391b7f5ed116100fd57806391b7f5ed1461067a57806395d89b41146106a35780639a3bf728146106ce578063a0712d68146106f9578063a22cb4651461071557610251565b806371e3500c146105c75780637389fbb7146105de5780638da5cb5b146106075780638e4e9b021461063257806390aa0b0f1461064e57610251565b80633ccfd60b116101d257806356a87caa1161019657806356a87caa146104b75780636352211e146104e05780636817c76c1461051d5780636de9f32b1461054857806370a0823114610573578063715018a6146105b057610251565b80633ccfd60b146103fc57806342842e0e146104135780634dfea6271461043c578063544e9f891461046557806355f804b31461048e57610251565b80631f2898c3116102195780631f2898c31461033b57806323b872dd14610352578063304fa81a1461037b57806332cb6b0c146103a657806338d1eeae146103d157610251565b806301ffc9a71461025657806306fdde0314610293578063081812fc146102be578063095ea7b3146102fb57806315c316fc14610324575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190612f81565b610931565b60405161028a9190612fc9565b60405180910390f35b34801561029f57600080fd5b506102a8610a13565b6040516102b5919061307d565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e091906130d5565b610aa5565b6040516102f29190613143565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d919061318a565b610b2a565b005b34801561033057600080fd5b50610339610c42565b005b34801561034757600080fd5b50610350610d60565b005b34801561035e57600080fd5b50610379600480360381019061037491906131ca565b610e44565b005b34801561038757600080fd5b50610390610ea4565b60405161039d9190612fc9565b60405180910390f35b3480156103b257600080fd5b506103bb610f23565b6040516103c8919061322c565b60405180910390f35b3480156103dd57600080fd5b506103e6610f29565b6040516103f39190613143565b60405180910390f35b34801561040857600080fd5b50610411610f41565b005b34801561041f57600080fd5b5061043a600480360381019061043591906131ca565b610fd6565b005b34801561044857600080fd5b50610463600480360381019061045e91906130d5565b610ff6565b005b34801561047157600080fd5b5061048c600480360381019061048791906132ac565b61103f565b005b34801561049a57600080fd5b506104b560048036038101906104b0919061343c565b611167565b005b3480156104c357600080fd5b506104de60048036038101906104d991906130d5565b6111c0565b005b3480156104ec57600080fd5b50610507600480360381019061050291906130d5565b611209565b6040516105149190613143565b60405180910390f35b34801561052957600080fd5b506105326112bb565b60405161053f919061322c565b60405180910390f35b34801561055457600080fd5b5061055d6112c1565b60405161056a919061322c565b60405180910390f35b34801561057f57600080fd5b5061059a60048036038101906105959190613485565b6112d2565b6040516105a7919061322c565b60405180910390f35b3480156105bc57600080fd5b506105c561138a565b005b3480156105d357600080fd5b506105dc611412565b005b3480156105ea57600080fd5b50610605600480360381019061060091906130d5565b611516565b005b34801561061357600080fd5b5061061c61155f565b6040516106299190613143565b60405180910390f35b61064c600480360381019061064791906134b2565b611589565b005b34801561065a57600080fd5b5061066361187d565b6040516106719291906134ff565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c91906130d5565b61188f565b005b3480156106af57600080fd5b506106b86118d8565b6040516106c5919061307d565b60405180910390f35b3480156106da57600080fd5b506106e361196a565b6040516106f0919061322c565b60405180910390f35b610713600480360381019061070e91906130d5565b611970565b005b34801561072157600080fd5b5061073c60048036038101906107379190613554565b611c94565b005b34801561074a57600080fd5b50610753611caa565b604051610760919061360b565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b91906136c7565b611cbd565b005b34801561079e57600080fd5b506107b960048036038101906107b491906130d5565b611d1f565b6040516107c6919061307d565b60405180910390f35b3480156107db57600080fd5b506107e4611dc6565b6040516107f1919061322c565b60405180910390f35b34801561080657600080fd5b5061080f611dcc565b60405161081c919061322c565b60405180910390f35b34801561083157600080fd5b5061083a611e17565b604051610847919061322c565b60405180910390f35b34801561085c57600080fd5b506108776004803603810190610872919061374a565b611e21565b6040516108849190612fc9565b60405180910390f35b34801561089957600080fd5b506108b460048036038101906108af91906130d5565b611eb5565b005b3480156108c257600080fd5b506108dd60048036038101906108d89190613485565b611efe565b005b3480156108eb57600080fd5b50610906600480360381019061090191906130d5565b611ff6565b005b34801561091457600080fd5b5061092f600480360381019061092a91906137af565b61203f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109fc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a0c5750610a0b826120e8565b5b9050919050565b606060008054610a229061380b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4e9061380b565b8015610a9b5780601f10610a7057610100808354040283529160200191610a9b565b820191906000526020600020905b815481529060010190602001808311610a7e57829003601f168201915b5050505050905090565b6000610ab082612152565b610aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae6906138af565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b3582611209565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9d90613941565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc56121be565b73ffffffffffffffffffffffffffffffffffffffff161480610bf45750610bf381610bee6121be565b611e21565b5b610c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2a906139d3565b60405180910390fd5b610c3d83836121c6565b505050565b610c4a6121be565b73ffffffffffffffffffffffffffffffffffffffff16610c6861155f565b73ffffffffffffffffffffffffffffffffffffffff1614610cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb590613a3f565b60405180910390fd5b6001601160006101000a81548160ff02191690836003811115610ce457610ce3613594565b5b021790555060004290506000610e109050604051806040016040528083815260200182815250601260008201518160000155602082015181600101559050507f07a1cedf4c1c75b37d60d4517d84a69a3d2ec0534f3a5093c93a94dde3a6a5548282604051610d549291906134ff565b60405180910390a15050565b610d686121be565b73ffffffffffffffffffffffffffffffffffffffff16610d8661155f565b73ffffffffffffffffffffffffffffffffffffffff1614610ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd390613a3f565b60405180910390fd5b6002601160006101000a81548160ff02191690836003811115610e0257610e01613594565b5b02179055507f0a97a4ee45751e2abf3e4fc8946939630b11b371ea8ae39ccdc3056e98f5cc3f60016002604051610e3a929190613a5f565b60405180910390a1565b610e55610e4f6121be565b8261227f565b610e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8b90613afa565b60405180910390fd5b610e9f83838361235d565b505050565b600080600090506000601260405180604001604052908160008201548152602001600182015481525050905080602001518160000151610ee49190613b49565b421115610f1b57600191506002601160006101000a81548160ff02191690836003811115610f1557610f14613594565b5b02179055505b819250505090565b600e5481565b73bc4ca0eda7647a8ab7c2061c2e118a18a936f13d81565b3373ffffffffffffffffffffffffffffffffffffffff16610f6061155f565b73ffffffffffffffffffffffffffffffffffffffff1614610f8057600080fd5b6000479050610f8d61155f565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fd2573d6000803e3d6000fd5b5050565b610ff183838360405180602001604052806000815250611cbd565b505050565b3373ffffffffffffffffffffffffffffffffffffffff1661101561155f565b73ffffffffffffffffffffffffffffffffffffffff161461103557600080fd5b80600f8190555050565b6110476121be565b73ffffffffffffffffffffffffffffffffffffffff1661106561155f565b73ffffffffffffffffffffffffffffffffffffffff16146110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b290613a3f565b60405180910390fd5b60005b82829050811015611161576110eb8383838181106110df576110de613b9f565b5b90506020020135612152565b1561112b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112290613c1a565b60405180910390fd5b61114e8484848481811061114257611141613b9f565b5b905060200201356125c4565b808061115990613c3a565b9150506110be565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff1661118661155f565b73ffffffffffffffffffffffffffffffffffffffff16146111a657600080fd5b80600d90805190602001906111bc929190612e72565b5050565b3373ffffffffffffffffffffffffffffffffffffffff166111df61155f565b73ffffffffffffffffffffffffffffffffffffffff16146111ff57600080fd5b80600c8190555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a990613cf5565b60405180910390fd5b80915050919050565b60095481565b60006112cd60076125e2565b905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133a90613d87565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113926121be565b73ffffffffffffffffffffffffffffffffffffffff166113b061155f565b73ffffffffffffffffffffffffffffffffffffffff1614611406576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fd90613a3f565b60405180910390fd5b61141060006125f0565b565b3373ffffffffffffffffffffffffffffffffffffffff1661143161155f565b73ffffffffffffffffffffffffffffffffffffffff161461145157600080fd5b600c54600b541115611498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148f90613df3565b60405180910390fd5b60006114ac6114a760076125e2565b612152565b156114bc576114bb60076126b6565b5b600090505b600a54811015611513576114d560076126b6565b6114e8336114e360076125e2565b6125c4565b600b60008154809291906114fb90613c3a565b9190505550808061150b90613c3a565b9150506114c1565b50565b3373ffffffffffffffffffffffffffffffffffffffff1661153561155f565b73ffffffffffffffffffffffffffffffffffffffff161461155557600080fd5b80600e8190555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5461159660076125e2565b11156115d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ce90613e5f565b60405180910390fd5b600073bc4ca0eda7647a8ab7c2061c2e118a18a936f13d905060006115fa610ea4565b9050801561163d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163490613ecb565b60405180910390fd5b600954341015611682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167990613f37565b60405180910390fd5b600f548484905011156116ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c190613fa3565b60405180910390fd5b60005b84849050811015611876576116fa8585838181106116ee576116ed613b9f565b5b90506020020135612152565b1561173a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173190613c1a565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff16636352211e87878581811061176b5761176a613b9f565b5b905060200201356040518263ffffffff1660e01b815260040161178e919061322c565b602060405180830381865afa1580156117ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117cf9190613fd8565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461183f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183690614077565b60405180910390fd5b6118623387878581811061185657611855613b9f565b5b905060200201356125c4565b50808061186e90613c3a565b9150506116cd565b5050505050565b60128060000154908060010154905082565b3373ffffffffffffffffffffffffffffffffffffffff166118ae61155f565b73ffffffffffffffffffffffffffffffffffffffff16146118ce57600080fd5b8060098190555050565b6060600180546118e79061380b565b80601f01602080910402602001604051908101604052809291908181526020018280546119139061380b565b80156119605780601f1061193557610100808354040283529160200191611960565b820191906000526020600020905b81548152906001019060200180831161194357829003601f168201915b5050505050905090565b600f5481565b600e5461197d60076125e2565b11156119be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b590613e5f565b60405180910390fd5b6119d06119cb60076125e2565b612152565b156119e0576119df60076126b6565b5b60006119ec60076125e2565b905060006119f8610ea4565b9050611a0261155f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b0c57808015611a74575060026003811115611a5057611a4f613594565b5b601160009054906101000a900460ff166003811115611a7257611a71613594565b5b145b611ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaa906140e3565b60405180910390fd5b60105483611ac0336112d2565b611aca9190613b49565b1115611b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b029061414f565b60405180910390fd5b5b600e548383611b1b9190613b49565b11611b4c576003601160006101000a81548160ff02191690836003811115611b4657611b45613594565b5b02179055505b600e548383611b5b9190613b49565b1115611b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b93906141bb565b60405180910390fd5b600f54831115611be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd890613fa3565b60405180910390fd5b82600954611bef91906141db565b341015611c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2890614281565b60405180910390fd5b60005b83811015611c8e57611c4660076126b6565b611c58611c5360076125e2565b612152565b15611c6857611c6760076126b6565b5b611c7b33611c7660076125e2565b6125c4565b8080611c8690613c3a565b915050611c34565b50505050565b611ca6611c9f6121be565b83836126cc565b5050565b601160009054906101000a900460ff1681565b611cce611cc86121be565b8361227f565b611d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0490613afa565b60405180910390fd5b611d1984848484612839565b50505050565b6060611d2a82612152565b611d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6090614313565b60405180910390fd5b6000611d73612895565b90506000815111611d935760405180602001604052806000815250611dbe565b80611d9d84612927565b604051602001611dae92919061436f565b6040516020818303038152906040525b915050919050565b60105481565b60008060126040518060400160405290816000820154815260200160018201548152505090504281602001518260000151611e079190613b49565b611e119190614393565b91505090565b6000600a54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16611ed461155f565b73ffffffffffffffffffffffffffffffffffffffff1614611ef457600080fd5b8060108190555050565b611f066121be565b73ffffffffffffffffffffffffffffffffffffffff16611f2461155f565b73ffffffffffffffffffffffffffffffffffffffff1614611f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7190613a3f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe190614439565b60405180910390fd5b611ff3816125f0565b50565b3373ffffffffffffffffffffffffffffffffffffffff1661201561155f565b73ffffffffffffffffffffffffffffffffffffffff161461203557600080fd5b80600a8190555050565b6120476121be565b73ffffffffffffffffffffffffffffffffffffffff1661206561155f565b73ffffffffffffffffffffffffffffffffffffffff16146120bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b290613a3f565b60405180910390fd5b80601160006101000a81548160ff021916908360038111156120e0576120df613594565b5b021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661223983611209565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061228a82612152565b6122c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c0906144cb565b60405180910390fd5b60006122d483611209565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061234357508373ffffffffffffffffffffffffffffffffffffffff1661232b84610aa5565b73ffffffffffffffffffffffffffffffffffffffff16145b8061235457506123538185611e21565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661237d82611209565b73ffffffffffffffffffffffffffffffffffffffff16146123d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ca9061455d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612443576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243a906145ef565b60405180910390fd5b61244e838383612a88565b6124596000826121c6565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124a99190614393565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125009190613b49565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125bf838383612a8d565b505050565b6125de828260405180602001604052806000815250612a92565b5050565b600081600001549050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561273b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127329061465b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161282c9190612fc9565b60405180910390a3505050565b61284484848461235d565b61285084848484612aed565b61288f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612886906146ed565b60405180910390fd5b50505050565b6060600d80546128a49061380b565b80601f01602080910402602001604051908101604052809291908181526020018280546128d09061380b565b801561291d5780601f106128f25761010080835404028352916020019161291d565b820191906000526020600020905b81548152906001019060200180831161290057829003601f168201915b5050505050905090565b6060600082141561296f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a83565b600082905060005b600082146129a157808061298a90613c3a565b915050600a8261299a919061473c565b9150612977565b60008167ffffffffffffffff8111156129bd576129bc613311565b5b6040519080825280601f01601f1916602001820160405280156129ef5781602001600182028036833780820191505090505b5090505b60008514612a7c57600182612a089190614393565b9150600a85612a17919061476d565b6030612a239190613b49565b60f81b818381518110612a3957612a38613b9f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a75919061473c565b94506129f3565b8093505050505b919050565b505050565b505050565b612a9c8383612c75565b612aa96000848484612aed565b612ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612adf906146ed565b60405180910390fd5b505050565b6000612b0e8473ffffffffffffffffffffffffffffffffffffffff16612e4f565b15612c68578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b376121be565b8786866040518563ffffffff1660e01b8152600401612b5994939291906147f3565b6020604051808303816000875af1925050508015612b9557506040513d601f19601f82011682018060405250810190612b929190614854565b60015b612c18573d8060008114612bc5576040519150601f19603f3d011682016040523d82523d6000602084013e612bca565b606091505b50600081511415612c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c07906146ed565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c6d565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cdc906148cd565b60405180910390fd5b612cee81612152565b15612d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2590614939565b60405180910390fd5b612d3a60008383612a88565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d8a9190613b49565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e4b60008383612a8d565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612e7e9061380b565b90600052602060002090601f016020900481019282612ea05760008555612ee7565b82601f10612eb957805160ff1916838001178555612ee7565b82800160010185558215612ee7579182015b82811115612ee6578251825591602001919060010190612ecb565b5b509050612ef49190612ef8565b5090565b5b80821115612f11576000816000905550600101612ef9565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f5e81612f29565b8114612f6957600080fd5b50565b600081359050612f7b81612f55565b92915050565b600060208284031215612f9757612f96612f1f565b5b6000612fa584828501612f6c565b91505092915050565b60008115159050919050565b612fc381612fae565b82525050565b6000602082019050612fde6000830184612fba565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561301e578082015181840152602081019050613003565b8381111561302d576000848401525b50505050565b6000601f19601f8301169050919050565b600061304f82612fe4565b6130598185612fef565b9350613069818560208601613000565b61307281613033565b840191505092915050565b600060208201905081810360008301526130978184613044565b905092915050565b6000819050919050565b6130b28161309f565b81146130bd57600080fd5b50565b6000813590506130cf816130a9565b92915050565b6000602082840312156130eb576130ea612f1f565b5b60006130f9848285016130c0565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061312d82613102565b9050919050565b61313d81613122565b82525050565b60006020820190506131586000830184613134565b92915050565b61316781613122565b811461317257600080fd5b50565b6000813590506131848161315e565b92915050565b600080604083850312156131a1576131a0612f1f565b5b60006131af85828601613175565b92505060206131c0858286016130c0565b9150509250929050565b6000806000606084860312156131e3576131e2612f1f565b5b60006131f186828701613175565b935050602061320286828701613175565b9250506040613213868287016130c0565b9150509250925092565b6132268161309f565b82525050565b6000602082019050613241600083018461321d565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261326c5761326b613247565b5b8235905067ffffffffffffffff8111156132895761328861324c565b5b6020830191508360208202830111156132a5576132a4613251565b5b9250929050565b6000806000604084860312156132c5576132c4612f1f565b5b60006132d386828701613175565b935050602084013567ffffffffffffffff8111156132f4576132f3612f24565b5b61330086828701613256565b92509250509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61334982613033565b810181811067ffffffffffffffff8211171561336857613367613311565b5b80604052505050565b600061337b612f15565b90506133878282613340565b919050565b600067ffffffffffffffff8211156133a7576133a6613311565b5b6133b082613033565b9050602081019050919050565b82818337600083830152505050565b60006133df6133da8461338c565b613371565b9050828152602081018484840111156133fb576133fa61330c565b5b6134068482856133bd565b509392505050565b600082601f83011261342357613422613247565b5b81356134338482602086016133cc565b91505092915050565b60006020828403121561345257613451612f1f565b5b600082013567ffffffffffffffff8111156134705761346f612f24565b5b61347c8482850161340e565b91505092915050565b60006020828403121561349b5761349a612f1f565b5b60006134a984828501613175565b91505092915050565b600080602083850312156134c9576134c8612f1f565b5b600083013567ffffffffffffffff8111156134e7576134e6612f24565b5b6134f385828601613256565b92509250509250929050565b6000604082019050613514600083018561321d565b613521602083018461321d565b9392505050565b61353181612fae565b811461353c57600080fd5b50565b60008135905061354e81613528565b92915050565b6000806040838503121561356b5761356a612f1f565b5b600061357985828601613175565b925050602061358a8582860161353f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106135d4576135d3613594565b5b50565b60008190506135e5826135c3565b919050565b60006135f5826135d7565b9050919050565b613605816135ea565b82525050565b600060208201905061362060008301846135fc565b92915050565b600067ffffffffffffffff82111561364157613640613311565b5b61364a82613033565b9050602081019050919050565b600061366a61366584613626565b613371565b9050828152602081018484840111156136865761368561330c565b5b6136918482856133bd565b509392505050565b600082601f8301126136ae576136ad613247565b5b81356136be848260208601613657565b91505092915050565b600080600080608085870312156136e1576136e0612f1f565b5b60006136ef87828801613175565b945050602061370087828801613175565b9350506040613711878288016130c0565b925050606085013567ffffffffffffffff81111561373257613731612f24565b5b61373e87828801613699565b91505092959194509250565b6000806040838503121561376157613760612f1f565b5b600061376f85828601613175565b925050602061378085828601613175565b9150509250929050565b6004811061379757600080fd5b50565b6000813590506137a98161378a565b92915050565b6000602082840312156137c5576137c4612f1f565b5b60006137d38482850161379a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061382357607f821691505b60208210811415613837576138366137dc565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613899602c83612fef565b91506138a48261383d565b604082019050919050565b600060208201905081810360008301526138c88161388c565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061392b602183612fef565b9150613936826138cf565b604082019050919050565b6000602082019050818103600083015261395a8161391e565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006139bd603883612fef565b91506139c882613961565b604082019050919050565b600060208201905081810360008301526139ec816139b0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613a29602083612fef565b9150613a34826139f3565b602082019050919050565b60006020820190508181036000830152613a5881613a1c565b9050919050565b6000604082019050613a7460008301856135fc565b613a8160208301846135fc565b9392505050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613ae4603183612fef565b9150613aef82613a88565b604082019050919050565b60006020820190508181036000830152613b1381613ad7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b548261309f565b9150613b5f8361309f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b9457613b93613b1a565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5468697320746f6b656e2068617320616c7265616479206d696e746564000000600082015250565b6000613c04601d83612fef565b9150613c0f82613bce565b602082019050919050565b60006020820190508181036000830152613c3381613bf7565b9050919050565b6000613c458261309f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c7857613c77613b1a565b5b600182019050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613cdf602983612fef565b9150613cea82613c83565b604082019050919050565b60006020820190508181036000830152613d0e81613cd2565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613d71602a83612fef565b9150613d7c82613d15565b604082019050919050565b60006020820190508181036000830152613da081613d64565b9050919050565b7f4d61782052657365727665732074616b656e20616c7265616479210000000000600082015250565b6000613ddd601b83612fef565b9150613de882613da7565b602082019050919050565b60006020820190508181036000830152613e0c81613dd0565b9050919050565b7f53616c652068617320656e6465642e0000000000000000000000000000000000600082015250565b6000613e49600f83612fef565b9150613e5482613e13565b602082019050919050565b60006020820190508181036000830152613e7881613e3c565b9050919050565b7f50726573616c652048617320456e646564000000000000000000000000000000600082015250565b6000613eb5601183612fef565b9150613ec082613e7f565b602082019050919050565b60006020820190508181036000830152613ee481613ea8565b9050919050565b7f496e7375666669656e742045544820616d6f756e742073656e742e0000000000600082015250565b6000613f21601b83612fef565b9150613f2c82613eeb565b602082019050919050565b60006020820190508181036000830152613f5081613f14565b9050919050565b7f45786365656473206d6178696d756d20616c6c6f77656420746f6b656e730000600082015250565b6000613f8d601e83612fef565b9150613f9882613f57565b602082019050919050565b60006020820190508181036000830152613fbc81613f80565b9050919050565b600081519050613fd28161315e565b92915050565b600060208284031215613fee57613fed612f1f565b5b6000613ffc84828501613fc3565b91505092915050565b7f596f7520617265206e6f742074686520686f6c646572206f662074686973204e60008201527f4654000000000000000000000000000000000000000000000000000000000000602082015250565b6000614061602283612fef565b915061406c82614005565b604082019050919050565b6000602082019050818103600083015261409081614054565b9050919050565b7f53616c65206973206e6f74206163746976652063757272656e746c792e000000600082015250565b60006140cd601d83612fef565b91506140d882614097565b602082019050919050565b600060208201905081810360008301526140fc816140c0565b9050919050565b7f4d617820686f6c64696e672063617020726561636865642e0000000000000000600082015250565b6000614139601883612fef565b915061414482614103565b602082019050919050565b600060208201905081810360008301526141688161412c565b9050919050565b7f546f74616c20737570706c792065786365656465642e00000000000000000000600082015250565b60006141a5601683612fef565b91506141b08261416f565b602082019050919050565b600060208201905081810360008301526141d481614198565b9050919050565b60006141e68261309f565b91506141f18361309f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561422a57614229613b1a565b5b828202905092915050565b7f496e73756666696369656e742045544820616d6f756e742073656e742e000000600082015250565b600061426b601d83612fef565b915061427682614235565b602082019050919050565b6000602082019050818103600083015261429a8161425e565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006142fd602f83612fef565b9150614308826142a1565b604082019050919050565b6000602082019050818103600083015261432c816142f0565b9050919050565b600081905092915050565b600061434982612fe4565b6143538185614333565b9350614363818560208601613000565b80840191505092915050565b600061437b828561433e565b9150614387828461433e565b91508190509392505050565b600061439e8261309f565b91506143a98361309f565b9250828210156143bc576143bb613b1a565b5b828203905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614423602683612fef565b915061442e826143c7565b604082019050919050565b6000602082019050818103600083015261445281614416565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006144b5602c83612fef565b91506144c082614459565b604082019050919050565b600060208201905081810360008301526144e4816144a8565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614547602583612fef565b9150614552826144eb565b604082019050919050565b600060208201905081810360008301526145768161453a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006145d9602483612fef565b91506145e48261457d565b604082019050919050565b60006020820190508181036000830152614608816145cc565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614645601983612fef565b91506146508261460f565b602082019050919050565b6000602082019050818103600083015261467481614638565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006146d7603283612fef565b91506146e28261467b565b604082019050919050565b60006020820190508181036000830152614706816146ca565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006147478261309f565b91506147528361309f565b9250826147625761476161470d565b5b828204905092915050565b60006147788261309f565b91506147838361309f565b9250826147935761479261470d565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006147c58261479e565b6147cf81856147a9565b93506147df818560208601613000565b6147e881613033565b840191505092915050565b60006080820190506148086000830187613134565b6148156020830186613134565b614822604083018561321d565b818103606083015261483481846147ba565b905095945050505050565b60008151905061484e81612f55565b92915050565b60006020828403121561486a57614869612f1f565b5b60006148788482850161483f565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006148b7602083612fef565b91506148c282614881565b602082019050919050565b600060208201905081810360008301526148e6816148aa565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614923601c83612fef565b915061492e826148ed565b602082019050919050565b6000602082019050818103600083015261495281614916565b905091905056fea2646970667358221220cfd8fd7d25f52cd0b1130cbbc355fdfd5b483208cdd0a434f4291ef9ae87432b64736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : baseURI (string):
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
38761:6550:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25574:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26519:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28078:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27601:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42291:290;;;;;;;;;;;;;:::i;:::-;;42587:170;;;;;;;;;;;;;:::i;:::-;;28828:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41404:366;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39127:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39278:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45174:134;;;;;;;;;;;;;:::i;:::-;;29238:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40314:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44863:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40992:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40801:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26213:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38935:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40212:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25943:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6195:103;;;;;;;;;;;;;:::i;:::-;;41889:396;;;;;;;;;;;;;:::i;:::-;;40581:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5544:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43861:996;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39576:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;40899:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26688:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39165:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42763:1092;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28371:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39541:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29494:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26863:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39221:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41200:198;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41099:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28597:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40444:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6453:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40700:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40101:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25574:305;25676:4;25728:25;25713:40;;;:11;:40;;;;:105;;;;25785:33;25770:48;;;:11;:48;;;;25713:105;:158;;;;25835:36;25859:11;25835:23;:36::i;:::-;25713:158;25693:178;;25574:305;;;:::o;26519:100::-;26573:13;26606:5;26599:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26519:100;:::o;28078:221::-;28154:7;28182:16;28190:7;28182;:16::i;:::-;28174:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28267:15;:24;28283:7;28267:24;;;;;;;;;;;;;;;;;;;;;28260:31;;28078:221;;;:::o;27601:411::-;27682:13;27698:23;27713:7;27698:14;:23::i;:::-;27682:39;;27746:5;27740:11;;:2;:11;;;;27732:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27840:5;27824:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27849:37;27866:5;27873:12;:10;:12::i;:::-;27849:16;:37::i;:::-;27824:62;27802:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27983:21;27992:2;27996:7;27983:8;:21::i;:::-;27671:341;27601:411;;:::o;42291:290::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42356:22:::1;42345:8;;:33;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;42389:18;42410:15;42389:36;;42436:17;42456:7;42436:27;;42487:33;;;;;;;;42498:10;42487:33;;;;42510:9;42487:33;;::::0;42474:10:::1;:46;;;;;;;;;;;;;;;;;;;42536:39;42553:10;42565:9;42536:39;;;;;;;:::i;:::-;;;;;;;;42334:247;;42291:290::o:0;42587:170::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42649:19:::1;42638:8;;:30;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;42684:65;42705:22;42729:19;42684:65;;;;;;;:::i;:::-;;;;;;;;42587:170::o:0;28828:339::-;29023:41;29042:12;:10;:12::i;:::-;29056:7;29023:18;:41::i;:::-;29015:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29131:28;29141:4;29147:2;29151:7;29131:9;:28::i;:::-;28828:339;;;:::o;41404:366::-;41450:4;41467:19;41489:5;41467:27;;41505:29;41537:10;41505:42;;;;;;;;;;;;;;;;;;;;;;;;;;;41607:11;:20;;;41583:11;:21;;;:44;;;;:::i;:::-;41565:15;:62;41561:161;;;41661:4;41644:21;;41691:19;41680:8;;:30;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;41561:161;41750:14;41743:21;;;;41404:366;:::o;39127:33::-;;;;:::o;39278:80::-;39316:42;39278:80;:::o;45174:134::-;40070:10;40059:21;;:7;:5;:7::i;:::-;:21;;;40051:30;;;;;;45225:12:::1;45240:21;45225:36;;45276:7;:5;:7::i;:::-;45268:25;;:34;45294:7;45268:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;45218:90;45174:134::o:0;29238:185::-;29376:39;29393:4;29399:2;29403:7;29376:39;;;;;;;;;;;;:16;:39::i;:::-;29238:185;;;:::o;40314:124::-;40070:10;40059:21;;:7;:5;:7::i;:::-;:21;;;40051:30;;;;;;40426:6:::1;40392:31;:40;;;;40314:124:::0;:::o;44863:305::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44978:9:::1;44973:190;44997:9;;:16;;44993:1;:20;44973:190;;;45042:21;45050:9;;45060:1;45050:12;;;;;;;:::i;:::-;;;;;;;;45042:7;:21::i;:::-;45041:22;45033:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;45110:43;45120:18;45140:9;;45150:1;45140:12;;;;;;;:::i;:::-;;;;;;;;45110:9;:43::i;:::-;45015:3;;;;;:::i;:::-;;;;44973:190;;;;44863:305:::0;;;:::o;40992:101::-;40070:10;40059:21;;:7;:5;:7::i;:::-;:21;;;40051:30;;;;;;41080:7:::1;41064:13;:23;;;;;;;;;;;;:::i;:::-;;40992:101:::0;:::o;40801:92::-;40070:10;40059:21;;:7;:5;:7::i;:::-;:21;;;40051:30;;;;;;40884:3:::1;40866:15;:21;;;;40801:92:::0;:::o;26213:239::-;26285:7;26305:13;26321:7;:16;26329:7;26321:16;;;;;;;;;;;;;;;;;;;;;26305:32;;26373:1;26356:19;;:5;:19;;;;26348:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26439:5;26432:12;;;26213:239;;;:::o;38935:37::-;;;;:::o;40212:96::-;40257:7;40280:22;:12;:20;:22::i;:::-;40273:29;;40212:96;:::o;25943:208::-;26015:7;26060:1;26043:19;;:5;:19;;;;26035:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;26127:9;:16;26137:5;26127:16;;;;;;;;;;;;;;;;26120:23;;25943:208;;;:::o;6195:103::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6260:30:::1;6287:1;6260:18;:30::i;:::-;6195:103::o:0;41889:396::-;40070:10;40059:21;;:7;:5;:7::i;:::-;:21;;;40051:30;;;;;;41965:15:::1;;41948:13;;:32;;41940:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;42019:9;42040:31;42048:22;:12;:20;:22::i;:::-;42040:7;:31::i;:::-;42037:79;;;42084:24;:12;:22;:24::i;:::-;42037:79;42133:1;42129:5;;42124:156;42140:14;;42136:1;:18;42124:156;;;42170:24;:12;:22;:24::i;:::-;42203:45;42213:10;42225:22;:12;:20;:22::i;:::-;42203:9;:45::i;:::-;42257:13;;:15;;;;;;;;;:::i;:::-;;;;;;42156:3;;;;;:::i;:::-;;;;42124:156;;;41933:352;41889:396::o:0;40581:113::-;40070:10;40059:21;;:7;:5;:7::i;:::-;:21;;;40051:30;;;;;;40675:13:::1;40662:10;:26;;;;40581:113:::0;:::o;5544:87::-;5590:7;5617:6;;;;;;;;;;;5610:13;;5544:87;:::o;43861:996::-;39968:10;;39942:22;:12;:20;:22::i;:::-;:36;;39934:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;43978:13:::1;39316:42;43978:37;;44024:18;44045:20;:18;:20::i;:::-;44024:41;;44083:13;44082:14;44074:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;44148:9;;44135;:22;;44127:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;44239:31;;44214:14;;:21;;:56;;44198:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;44334:9;44329:523;44353:14;;:21;;44349:1;:25;44329:523;;;44583:26;44591:14;;44606:1;44591:17;;;;;;;:::i;:::-;;;;;;;;44583:7;:26::i;:::-;44582:27;44574:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;44658:15;44676:5;:13;;;44690:14;;44705:1;44690:17;;;;;;;:::i;:::-;;;;;;;;44676:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44658:50;;44740:10;44729:21;;:7;:21;;;44721:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44802:40;44812:10;44824:14;;44839:1;44824:17;;;;;;;:::i;:::-;;;;;;;;44802:9;:40::i;:::-;44381:471;44376:3;;;;;:::i;:::-;;;;44329:523;;;;43943:914;;43861:996:::0;;:::o;39576:28::-;;;;;;;;;;;;;;:::o;40899:87::-;40070:10;40059:21;;:7;:5;:7::i;:::-;:21;;;40051:30;;;;;;40974:6:::1;40962:9;:18;;;;40899:87:::0;:::o;26688:104::-;26744:13;26777:7;26770:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26688:104;:::o;39165:51::-;;;;:::o;42763:1092::-;39968:10;;39942:22;:12;:20;:22::i;:::-;:36;;39934:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;42829:31:::1;42837:22;:12;:20;:22::i;:::-;42829:7;:31::i;:::-;42826:77;;;42871:24;:12;:22;:24::i;:::-;42826:77;42911:17;42931:22;:12;:20;:22::i;:::-;42911:42;;42960:17;42980:20;:18;:20::i;:::-;42960:40;;43031:7;:5;:7::i;:::-;43017:21;;:10;:21;;;43013:242;;43057:12;:47;;;;;43085:19;43073:31;;;;;;;;:::i;:::-;;:8;;;;;;;;;;;:31;;;;;;;;:::i;:::-;;;43057:47;43049:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;43189:29;;43179:6;43155:21;43165:10;43155:9;:21::i;:::-;:30;;;;:::i;:::-;:63;;43147:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;43013:242;43289:10;;43279:6;43267:9;:18;;;;:::i;:::-;:32;43263:88;;43321:22;43310:8;;:33;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;43263:88;43389:10;;43379:6;43367:9;:18;;;;:::i;:::-;:32;;43359:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;43459:31;;43449:6;:41;;43433:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;43580:6;43568:9;;:18;;;;:::i;:::-;43555:9;:31;;43547:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43634:9;43629:221;43653:6;43649:1;:10;43629:221;;;43675:24;:12;:22;:24::i;:::-;43711:31;43719:22;:12;:20;:22::i;:::-;43711:7;:31::i;:::-;43708:81;;;43755:24;:12;:22;:24::i;:::-;43708:81;43797:45;43807:10;43819:22;:12;:20;:22::i;:::-;43797:9;:45::i;:::-;43661:3;;;;;:::i;:::-;;;;43629:221;;;;42819:1036;;42763:1092:::0;:::o;28371:155::-;28466:52;28485:12;:10;:12::i;:::-;28499:8;28509;28466:18;:52::i;:::-;28371:155;;:::o;39541:30::-;;;;;;;;;;;;;:::o;29494:328::-;29669:41;29688:12;:10;:12::i;:::-;29702:7;29669:18;:41::i;:::-;29661:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29775:39;29789:4;29795:2;29799:7;29808:5;29775:13;:39::i;:::-;29494:328;;;;:::o;26863:334::-;26936:13;26970:16;26978:7;26970;:16::i;:::-;26962:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;27051:21;27075:10;:8;:10::i;:::-;27051:34;;27127:1;27109:7;27103:21;:25;:86;;;;;;;;;;;;;;;;;27155:7;27164:18;:7;:16;:18::i;:::-;27138:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27103:86;27096:93;;;26863:334;;;:::o;39221:50::-;;;;:::o;41200:198::-;41248:7;41268:29;41300:10;41268:42;;;;;;;;;;;;;;;;;;;;;;;;;;;41377:15;41353:11;:20;;;41329:11;:21;;;:44;;;;:::i;:::-;41328:64;;;;:::i;:::-;41321:71;;;41200:198;:::o;41099:95::-;41151:7;41174:14;;41167:21;;41099:95;:::o;28597:164::-;28694:4;28718:18;:25;28737:5;28718:25;;;;;;;;;;;;;;;:35;28744:8;28718:35;;;;;;;;;;;;;;;;;;;;;;;;;28711:42;;28597:164;;;;:::o;40444:131::-;40070:10;40059:21;;:7;:5;:7::i;:::-;:21;;;40051:30;;;;;;40563:6:::1;40531:29;:38;;;;40444:131:::0;:::o;6453:201::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6562:1:::1;6542:22;;:8;:22;;;;6534:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6618:28;6637:8;6618:18;:28::i;:::-;6453:201:::0;:::o;40700:95::-;40070:10;40059:21;;:7;:5;:7::i;:::-;:21;;;40051:30;;;;;;40786:3:::1;40769:14;:20;;;;40700:95:::0;:::o;40101:105::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40189:11:::1;40178:8;;:22;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;40101:105:::0;:::o;18328:157::-;18413:4;18452:25;18437:40;;;:11;:40;;;;18430:47;;18328:157;;;:::o;31332:127::-;31397:4;31449:1;31421:30;;:7;:16;31429:7;31421:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31414:37;;31332:127;;;:::o;4268:98::-;4321:7;4348:10;4341:17;;4268:98;:::o;35478:174::-;35580:2;35553:15;:24;35569:7;35553:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35636:7;35632:2;35598:46;;35607:23;35622:7;35607:14;:23::i;:::-;35598:46;;;;;;;;;;;;35478:174;;:::o;31626:348::-;31719:4;31744:16;31752:7;31744;:16::i;:::-;31736:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31820:13;31836:23;31851:7;31836:14;:23::i;:::-;31820:39;;31889:5;31878:16;;:7;:16;;;:51;;;;31922:7;31898:31;;:20;31910:7;31898:11;:20::i;:::-;:31;;;31878:51;:87;;;;31933:32;31950:5;31957:7;31933:16;:32::i;:::-;31878:87;31870:96;;;31626:348;;;;:::o;34735:625::-;34894:4;34867:31;;:23;34882:7;34867:14;:23::i;:::-;:31;;;34859:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;34973:1;34959:16;;:2;:16;;;;34951:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35029:39;35050:4;35056:2;35060:7;35029:20;:39::i;:::-;35133:29;35150:1;35154:7;35133:8;:29::i;:::-;35194:1;35175:9;:15;35185:4;35175:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35223:1;35206:9;:13;35216:2;35206:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35254:2;35235:7;:16;35243:7;35235:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35293:7;35289:2;35274:27;;35283:4;35274:27;;;;;;;;;;;;35314:38;35334:4;35340:2;35344:7;35314:19;:38::i;:::-;34735:625;;;:::o;32316:110::-;32392:26;32402:2;32406:7;32392:26;;;;;;;;;;;;:9;:26::i;:::-;32316:110;;:::o;872:114::-;937:7;964;:14;;;957:21;;872:114;;;:::o;6814:191::-;6888:16;6907:6;;;;;;;;;;;6888:25;;6933:8;6924:6;;:17;;;;;;;;;;;;;;;;;;6988:8;6957:40;;6978:8;6957:40;;;;;;;;;;;;6877:128;6814:191;:::o;994:127::-;1101:1;1083:7;:14;;;:19;;;;;;;;;;;994:127;:::o;35794:315::-;35949:8;35940:17;;:5;:17;;;;35932:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;36036:8;35998:18;:25;36017:5;35998:25;;;;;;;;;;;;;;;:35;36024:8;35998:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36082:8;36060:41;;36075:5;36060:41;;;36092:8;36060:41;;;;;;:::i;:::-;;;;;;;;35794:315;;;:::o;30704:::-;30861:28;30871:4;30877:2;30881:7;30861:9;:28::i;:::-;30908:48;30931:4;30937:2;30941:7;30950:5;30908:22;:48::i;:::-;30900:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30704:315;;;;:::o;41776:108::-;41836:13;41865;41858:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41776:108;:::o;1830:723::-;1886:13;2116:1;2107:5;:10;2103:53;;;2134:10;;;;;;;;;;;;;;;;;;;;;2103:53;2166:12;2181:5;2166:20;;2197:14;2222:78;2237:1;2229:4;:9;2222:78;;2255:8;;;;;:::i;:::-;;;;2286:2;2278:10;;;;;:::i;:::-;;;2222:78;;;2310:19;2342:6;2332:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2310:39;;2360:154;2376:1;2367:5;:10;2360:154;;2404:1;2394:11;;;;;:::i;:::-;;;2471:2;2463:5;:10;;;;:::i;:::-;2450:2;:24;;;;:::i;:::-;2437:39;;2420:6;2427;2420:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2500:2;2491:11;;;;;:::i;:::-;;;2360:154;;;2538:6;2524:21;;;;;1830:723;;;;:::o;38045:126::-;;;;:::o;38556:125::-;;;;:::o;32653:321::-;32783:18;32789:2;32793:7;32783:5;:18::i;:::-;32834:54;32865:1;32869:2;32873:7;32882:5;32834:22;:54::i;:::-;32812:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32653:321;;;:::o;36674:799::-;36829:4;36850:15;:2;:13;;;:15::i;:::-;36846:620;;;36902:2;36886:36;;;36923:12;:10;:12::i;:::-;36937:4;36943:7;36952:5;36886:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36882:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37145:1;37128:6;:13;:18;37124:272;;;37171:60;;;;;;;;;;:::i;:::-;;;;;;;;37124:272;37346:6;37340:13;37331:6;37327:2;37323:15;37316:38;36882:529;37019:41;;;37009:51;;;:6;:51;;;;37002:58;;;;;36846:620;37450:4;37443:11;;36674:799;;;;;;;:::o;33310:439::-;33404:1;33390:16;;:2;:16;;;;33382:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33463:16;33471:7;33463;:16::i;:::-;33462:17;33454:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33525:45;33554:1;33558:2;33562:7;33525:20;:45::i;:::-;33600:1;33583:9;:13;33593:2;33583:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33631:2;33612:7;:16;33620:7;33612:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33676:7;33672:2;33651:33;;33668:1;33651:33;;;;;;;;;;;;33697:44;33725:1;33729:2;33733:7;33697:19;:44::i;:::-;33310:439;;:::o;8245:326::-;8305:4;8562:1;8540:7;:19;;;:23;8533:30;;8245:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:619::-;5015:6;5023;5031;5080:2;5068:9;5059:7;5055:23;5051:32;5048:119;;;5086:79;;:::i;:::-;5048:119;5206:1;5231:53;5276:7;5267:6;5256:9;5252:22;5231:53;:::i;:::-;5221:63;;5177:117;5333:2;5359:53;5404:7;5395:6;5384:9;5380:22;5359:53;:::i;:::-;5349:63;;5304:118;5461:2;5487:53;5532:7;5523:6;5512:9;5508:22;5487:53;:::i;:::-;5477:63;;5432:118;4938:619;;;;;:::o;5563:118::-;5650:24;5668:5;5650:24;:::i;:::-;5645:3;5638:37;5563:118;;:::o;5687:222::-;5780:4;5818:2;5807:9;5803:18;5795:26;;5831:71;5899:1;5888:9;5884:17;5875:6;5831:71;:::i;:::-;5687:222;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:117;6147:1;6144;6137:12;6161:117;6270:1;6267;6260:12;6301:568;6374:8;6384:6;6434:3;6427:4;6419:6;6415:17;6411:27;6401:122;;6442:79;;:::i;:::-;6401:122;6555:6;6542:20;6532:30;;6585:18;6577:6;6574:30;6571:117;;;6607:79;;:::i;:::-;6571:117;6721:4;6713:6;6709:17;6697:29;;6775:3;6767:4;6759:6;6755:17;6745:8;6741:32;6738:41;6735:128;;;6782:79;;:::i;:::-;6735:128;6301:568;;;;;:::o;6875:704::-;6970:6;6978;6986;7035:2;7023:9;7014:7;7010:23;7006:32;7003:119;;;7041:79;;:::i;:::-;7003:119;7161:1;7186:53;7231:7;7222:6;7211:9;7207:22;7186:53;:::i;:::-;7176:63;;7132:117;7316:2;7305:9;7301:18;7288:32;7347:18;7339:6;7336:30;7333:117;;;7369:79;;:::i;:::-;7333:117;7482:80;7554:7;7545:6;7534:9;7530:22;7482:80;:::i;:::-;7464:98;;;;7259:313;6875:704;;;;;:::o;7585:117::-;7694:1;7691;7684:12;7708:180;7756:77;7753:1;7746:88;7853:4;7850:1;7843:15;7877:4;7874:1;7867:15;7894:281;7977:27;7999:4;7977:27;:::i;:::-;7969:6;7965:40;8107:6;8095:10;8092:22;8071:18;8059:10;8056:34;8053:62;8050:88;;;8118:18;;:::i;:::-;8050:88;8158:10;8154:2;8147:22;7937:238;7894:281;;:::o;8181:129::-;8215:6;8242:20;;:::i;:::-;8232:30;;8271:33;8299:4;8291:6;8271:33;:::i;:::-;8181:129;;;:::o;8316:308::-;8378:4;8468:18;8460:6;8457:30;8454:56;;;8490:18;;:::i;:::-;8454:56;8528:29;8550:6;8528:29;:::i;:::-;8520:37;;8612:4;8606;8602:15;8594:23;;8316:308;;;:::o;8630:154::-;8714:6;8709:3;8704;8691:30;8776:1;8767:6;8762:3;8758:16;8751:27;8630:154;;;:::o;8790:412::-;8868:5;8893:66;8909:49;8951:6;8909:49;:::i;:::-;8893:66;:::i;:::-;8884:75;;8982:6;8975:5;8968:21;9020:4;9013:5;9009:16;9058:3;9049:6;9044:3;9040:16;9037:25;9034:112;;;9065:79;;:::i;:::-;9034:112;9155:41;9189:6;9184:3;9179;9155:41;:::i;:::-;8874:328;8790:412;;;;;:::o;9222:340::-;9278:5;9327:3;9320:4;9312:6;9308:17;9304:27;9294:122;;9335:79;;:::i;:::-;9294:122;9452:6;9439:20;9477:79;9552:3;9544:6;9537:4;9529:6;9525:17;9477:79;:::i;:::-;9468:88;;9284:278;9222:340;;;;:::o;9568:509::-;9637:6;9686:2;9674:9;9665:7;9661:23;9657:32;9654:119;;;9692:79;;:::i;:::-;9654:119;9840:1;9829:9;9825:17;9812:31;9870:18;9862:6;9859:30;9856:117;;;9892:79;;:::i;:::-;9856:117;9997:63;10052:7;10043:6;10032:9;10028:22;9997:63;:::i;:::-;9987:73;;9783:287;9568:509;;;;:::o;10083:329::-;10142:6;10191:2;10179:9;10170:7;10166:23;10162:32;10159:119;;;10197:79;;:::i;:::-;10159:119;10317:1;10342:53;10387:7;10378:6;10367:9;10363:22;10342:53;:::i;:::-;10332:63;;10288:117;10083:329;;;;:::o;10418:559::-;10504:6;10512;10561:2;10549:9;10540:7;10536:23;10532:32;10529:119;;;10567:79;;:::i;:::-;10529:119;10715:1;10704:9;10700:17;10687:31;10745:18;10737:6;10734:30;10731:117;;;10767:79;;:::i;:::-;10731:117;10880:80;10952:7;10943:6;10932:9;10928:22;10880:80;:::i;:::-;10862:98;;;;10658:312;10418:559;;;;;:::o;10983:332::-;11104:4;11142:2;11131:9;11127:18;11119:26;;11155:71;11223:1;11212:9;11208:17;11199:6;11155:71;:::i;:::-;11236:72;11304:2;11293:9;11289:18;11280:6;11236:72;:::i;:::-;10983:332;;;;;:::o;11321:116::-;11391:21;11406:5;11391:21;:::i;:::-;11384:5;11381:32;11371:60;;11427:1;11424;11417:12;11371:60;11321:116;:::o;11443:133::-;11486:5;11524:6;11511:20;11502:29;;11540:30;11564:5;11540:30;:::i;:::-;11443:133;;;;:::o;11582:468::-;11647:6;11655;11704:2;11692:9;11683:7;11679:23;11675:32;11672:119;;;11710:79;;:::i;:::-;11672:119;11830:1;11855:53;11900:7;11891:6;11880:9;11876:22;11855:53;:::i;:::-;11845:63;;11801:117;11957:2;11983:50;12025:7;12016:6;12005:9;12001:22;11983:50;:::i;:::-;11973:60;;11928:115;11582:468;;;;;:::o;12056:180::-;12104:77;12101:1;12094:88;12201:4;12198:1;12191:15;12225:4;12222:1;12215:15;12242:124;12334:1;12327:5;12324:12;12314:46;;12340:18;;:::i;:::-;12314:46;12242:124;:::o;12372:149::-;12428:7;12457:5;12446:16;;12463:52;12509:5;12463:52;:::i;:::-;12372:149;;;:::o;12527:::-;12594:9;12627:43;12664:5;12627:43;:::i;:::-;12614:56;;12527:149;;;:::o;12682:165::-;12786:54;12834:5;12786:54;:::i;:::-;12781:3;12774:67;12682:165;;:::o;12853:256::-;12963:4;13001:2;12990:9;12986:18;12978:26;;13014:88;13099:1;13088:9;13084:17;13075:6;13014:88;:::i;:::-;12853:256;;;;:::o;13115:307::-;13176:4;13266:18;13258:6;13255:30;13252:56;;;13288:18;;:::i;:::-;13252:56;13326:29;13348:6;13326:29;:::i;:::-;13318:37;;13410:4;13404;13400:15;13392:23;;13115:307;;;:::o;13428:410::-;13505:5;13530:65;13546:48;13587:6;13546:48;:::i;:::-;13530:65;:::i;:::-;13521:74;;13618:6;13611:5;13604:21;13656:4;13649:5;13645:16;13694:3;13685:6;13680:3;13676:16;13673:25;13670:112;;;13701:79;;:::i;:::-;13670:112;13791:41;13825:6;13820:3;13815;13791:41;:::i;:::-;13511:327;13428:410;;;;;:::o;13857:338::-;13912:5;13961:3;13954:4;13946:6;13942:17;13938:27;13928:122;;13969:79;;:::i;:::-;13928:122;14086:6;14073:20;14111:78;14185:3;14177:6;14170:4;14162:6;14158:17;14111:78;:::i;:::-;14102:87;;13918:277;13857:338;;;;:::o;14201:943::-;14296:6;14304;14312;14320;14369:3;14357:9;14348:7;14344:23;14340:33;14337:120;;;14376:79;;:::i;:::-;14337:120;14496:1;14521:53;14566:7;14557:6;14546:9;14542:22;14521:53;:::i;:::-;14511:63;;14467:117;14623:2;14649:53;14694:7;14685:6;14674:9;14670:22;14649:53;:::i;:::-;14639:63;;14594:118;14751:2;14777:53;14822:7;14813:6;14802:9;14798:22;14777:53;:::i;:::-;14767:63;;14722:118;14907:2;14896:9;14892:18;14879:32;14938:18;14930:6;14927:30;14924:117;;;14960:79;;:::i;:::-;14924:117;15065:62;15119:7;15110:6;15099:9;15095:22;15065:62;:::i;:::-;15055:72;;14850:287;14201:943;;;;;;;:::o;15150:474::-;15218:6;15226;15275:2;15263:9;15254:7;15250:23;15246:32;15243:119;;;15281:79;;:::i;:::-;15243:119;15401:1;15426:53;15471:7;15462:6;15451:9;15447:22;15426:53;:::i;:::-;15416:63;;15372:117;15528:2;15554:53;15599:7;15590:6;15579:9;15575:22;15554:53;:::i;:::-;15544:63;;15499:118;15150:474;;;;;:::o;15630:118::-;15722:1;15715:5;15712:12;15702:40;;15738:1;15735;15728:12;15702:40;15630:118;:::o;15754:177::-;15819:5;15857:6;15844:20;15835:29;;15873:52;15919:5;15873:52;:::i;:::-;15754:177;;;;:::o;15937:367::-;16015:6;16064:2;16052:9;16043:7;16039:23;16035:32;16032:119;;;16070:79;;:::i;:::-;16032:119;16190:1;16215:72;16279:7;16270:6;16259:9;16255:22;16215:72;:::i;:::-;16205:82;;16161:136;15937:367;;;;:::o;16310:180::-;16358:77;16355:1;16348:88;16455:4;16452:1;16445:15;16479:4;16476:1;16469:15;16496:320;16540:6;16577:1;16571:4;16567:12;16557:22;;16624:1;16618:4;16614:12;16645:18;16635:81;;16701:4;16693:6;16689:17;16679:27;;16635:81;16763:2;16755:6;16752:14;16732:18;16729:38;16726:84;;;16782:18;;:::i;:::-;16726:84;16547:269;16496:320;;;:::o;16822:231::-;16962:34;16958:1;16950:6;16946:14;16939:58;17031:14;17026:2;17018:6;17014:15;17007:39;16822:231;:::o;17059:366::-;17201:3;17222:67;17286:2;17281:3;17222:67;:::i;:::-;17215:74;;17298:93;17387:3;17298:93;:::i;:::-;17416:2;17411:3;17407:12;17400:19;;17059:366;;;:::o;17431:419::-;17597:4;17635:2;17624:9;17620:18;17612:26;;17684:9;17678:4;17674:20;17670:1;17659:9;17655:17;17648:47;17712:131;17838:4;17712:131;:::i;:::-;17704:139;;17431:419;;;:::o;17856:220::-;17996:34;17992:1;17984:6;17980:14;17973:58;18065:3;18060:2;18052:6;18048:15;18041:28;17856:220;:::o;18082:366::-;18224:3;18245:67;18309:2;18304:3;18245:67;:::i;:::-;18238:74;;18321:93;18410:3;18321:93;:::i;:::-;18439:2;18434:3;18430:12;18423:19;;18082:366;;;:::o;18454:419::-;18620:4;18658:2;18647:9;18643:18;18635:26;;18707:9;18701:4;18697:20;18693:1;18682:9;18678:17;18671:47;18735:131;18861:4;18735:131;:::i;:::-;18727:139;;18454:419;;;:::o;18879:243::-;19019:34;19015:1;19007:6;19003:14;18996:58;19088:26;19083:2;19075:6;19071:15;19064:51;18879:243;:::o;19128:366::-;19270:3;19291:67;19355:2;19350:3;19291:67;:::i;:::-;19284:74;;19367:93;19456:3;19367:93;:::i;:::-;19485:2;19480:3;19476:12;19469:19;;19128:366;;;:::o;19500:419::-;19666:4;19704:2;19693:9;19689:18;19681:26;;19753:9;19747:4;19743:20;19739:1;19728:9;19724:17;19717:47;19781:131;19907:4;19781:131;:::i;:::-;19773:139;;19500:419;;;:::o;19925:182::-;20065:34;20061:1;20053:6;20049:14;20042:58;19925:182;:::o;20113:366::-;20255:3;20276:67;20340:2;20335:3;20276:67;:::i;:::-;20269:74;;20352:93;20441:3;20352:93;:::i;:::-;20470:2;20465:3;20461:12;20454:19;;20113:366;;;:::o;20485:419::-;20651:4;20689:2;20678:9;20674:18;20666:26;;20738:9;20732:4;20728:20;20724:1;20713:9;20709:17;20702:47;20766:131;20892:4;20766:131;:::i;:::-;20758:139;;20485:419;;;:::o;20910:400::-;21065:4;21103:2;21092:9;21088:18;21080:26;;21116:88;21201:1;21190:9;21186:17;21177:6;21116:88;:::i;:::-;21214:89;21299:2;21288:9;21284:18;21275:6;21214:89;:::i;:::-;20910:400;;;;;:::o;21316:236::-;21456:34;21452:1;21444:6;21440:14;21433:58;21525:19;21520:2;21512:6;21508:15;21501:44;21316:236;:::o;21558:366::-;21700:3;21721:67;21785:2;21780:3;21721:67;:::i;:::-;21714:74;;21797:93;21886:3;21797:93;:::i;:::-;21915:2;21910:3;21906:12;21899:19;;21558:366;;;:::o;21930:419::-;22096:4;22134:2;22123:9;22119:18;22111:26;;22183:9;22177:4;22173:20;22169:1;22158:9;22154:17;22147:47;22211:131;22337:4;22211:131;:::i;:::-;22203:139;;21930:419;;;:::o;22355:180::-;22403:77;22400:1;22393:88;22500:4;22497:1;22490:15;22524:4;22521:1;22514:15;22541:305;22581:3;22600:20;22618:1;22600:20;:::i;:::-;22595:25;;22634:20;22652:1;22634:20;:::i;:::-;22629:25;;22788:1;22720:66;22716:74;22713:1;22710:81;22707:107;;;22794:18;;:::i;:::-;22707:107;22838:1;22835;22831:9;22824:16;;22541:305;;;;:::o;22852:180::-;22900:77;22897:1;22890:88;22997:4;22994:1;22987:15;23021:4;23018:1;23011:15;23038:179;23178:31;23174:1;23166:6;23162:14;23155:55;23038:179;:::o;23223:366::-;23365:3;23386:67;23450:2;23445:3;23386:67;:::i;:::-;23379:74;;23462:93;23551:3;23462:93;:::i;:::-;23580:2;23575:3;23571:12;23564:19;;23223:366;;;:::o;23595:419::-;23761:4;23799:2;23788:9;23784:18;23776:26;;23848:9;23842:4;23838:20;23834:1;23823:9;23819:17;23812:47;23876:131;24002:4;23876:131;:::i;:::-;23868:139;;23595:419;;;:::o;24020:233::-;24059:3;24082:24;24100:5;24082:24;:::i;:::-;24073:33;;24128:66;24121:5;24118:77;24115:103;;;24198:18;;:::i;:::-;24115:103;24245:1;24238:5;24234:13;24227:20;;24020:233;;;:::o;24259:228::-;24399:34;24395:1;24387:6;24383:14;24376:58;24468:11;24463:2;24455:6;24451:15;24444:36;24259:228;:::o;24493:366::-;24635:3;24656:67;24720:2;24715:3;24656:67;:::i;:::-;24649:74;;24732:93;24821:3;24732:93;:::i;:::-;24850:2;24845:3;24841:12;24834:19;;24493:366;;;:::o;24865:419::-;25031:4;25069:2;25058:9;25054:18;25046:26;;25118:9;25112:4;25108:20;25104:1;25093:9;25089:17;25082:47;25146:131;25272:4;25146:131;:::i;:::-;25138:139;;24865:419;;;:::o;25290:229::-;25430:34;25426:1;25418:6;25414:14;25407:58;25499:12;25494:2;25486:6;25482:15;25475:37;25290:229;:::o;25525:366::-;25667:3;25688:67;25752:2;25747:3;25688:67;:::i;:::-;25681:74;;25764:93;25853:3;25764:93;:::i;:::-;25882:2;25877:3;25873:12;25866:19;;25525:366;;;:::o;25897:419::-;26063:4;26101:2;26090:9;26086:18;26078:26;;26150:9;26144:4;26140:20;26136:1;26125:9;26121:17;26114:47;26178:131;26304:4;26178:131;:::i;:::-;26170:139;;25897:419;;;:::o;26322:177::-;26462:29;26458:1;26450:6;26446:14;26439:53;26322:177;:::o;26505:366::-;26647:3;26668:67;26732:2;26727:3;26668:67;:::i;:::-;26661:74;;26744:93;26833:3;26744:93;:::i;:::-;26862:2;26857:3;26853:12;26846:19;;26505:366;;;:::o;26877:419::-;27043:4;27081:2;27070:9;27066:18;27058:26;;27130:9;27124:4;27120:20;27116:1;27105:9;27101:17;27094:47;27158:131;27284:4;27158:131;:::i;:::-;27150:139;;26877:419;;;:::o;27302:165::-;27442:17;27438:1;27430:6;27426:14;27419:41;27302:165;:::o;27473:366::-;27615:3;27636:67;27700:2;27695:3;27636:67;:::i;:::-;27629:74;;27712:93;27801:3;27712:93;:::i;:::-;27830:2;27825:3;27821:12;27814:19;;27473:366;;;:::o;27845:419::-;28011:4;28049:2;28038:9;28034:18;28026:26;;28098:9;28092:4;28088:20;28084:1;28073:9;28069:17;28062:47;28126:131;28252:4;28126:131;:::i;:::-;28118:139;;27845:419;;;:::o;28270:167::-;28410:19;28406:1;28398:6;28394:14;28387:43;28270:167;:::o;28443:366::-;28585:3;28606:67;28670:2;28665:3;28606:67;:::i;:::-;28599:74;;28682:93;28771:3;28682:93;:::i;:::-;28800:2;28795:3;28791:12;28784:19;;28443:366;;;:::o;28815:419::-;28981:4;29019:2;29008:9;29004:18;28996:26;;29068:9;29062:4;29058:20;29054:1;29043:9;29039:17;29032:47;29096:131;29222:4;29096:131;:::i;:::-;29088:139;;28815:419;;;:::o;29240:177::-;29380:29;29376:1;29368:6;29364:14;29357:53;29240:177;:::o;29423:366::-;29565:3;29586:67;29650:2;29645:3;29586:67;:::i;:::-;29579:74;;29662:93;29751:3;29662:93;:::i;:::-;29780:2;29775:3;29771:12;29764:19;;29423:366;;;:::o;29795:419::-;29961:4;29999:2;29988:9;29984:18;29976:26;;30048:9;30042:4;30038:20;30034:1;30023:9;30019:17;30012:47;30076:131;30202:4;30076:131;:::i;:::-;30068:139;;29795:419;;;:::o;30220:180::-;30360:32;30356:1;30348:6;30344:14;30337:56;30220:180;:::o;30406:366::-;30548:3;30569:67;30633:2;30628:3;30569:67;:::i;:::-;30562:74;;30645:93;30734:3;30645:93;:::i;:::-;30763:2;30758:3;30754:12;30747:19;;30406:366;;;:::o;30778:419::-;30944:4;30982:2;30971:9;30967:18;30959:26;;31031:9;31025:4;31021:20;31017:1;31006:9;31002:17;30995:47;31059:131;31185:4;31059:131;:::i;:::-;31051:139;;30778:419;;;:::o;31203:143::-;31260:5;31291:6;31285:13;31276:22;;31307:33;31334:5;31307:33;:::i;:::-;31203:143;;;;:::o;31352:351::-;31422:6;31471:2;31459:9;31450:7;31446:23;31442:32;31439:119;;;31477:79;;:::i;:::-;31439:119;31597:1;31622:64;31678:7;31669:6;31658:9;31654:22;31622:64;:::i;:::-;31612:74;;31568:128;31352:351;;;;:::o;31709:221::-;31849:34;31845:1;31837:6;31833:14;31826:58;31918:4;31913:2;31905:6;31901:15;31894:29;31709:221;:::o;31936:366::-;32078:3;32099:67;32163:2;32158:3;32099:67;:::i;:::-;32092:74;;32175:93;32264:3;32175:93;:::i;:::-;32293:2;32288:3;32284:12;32277:19;;31936:366;;;:::o;32308:419::-;32474:4;32512:2;32501:9;32497:18;32489:26;;32561:9;32555:4;32551:20;32547:1;32536:9;32532:17;32525:47;32589:131;32715:4;32589:131;:::i;:::-;32581:139;;32308:419;;;:::o;32733:179::-;32873:31;32869:1;32861:6;32857:14;32850:55;32733:179;:::o;32918:366::-;33060:3;33081:67;33145:2;33140:3;33081:67;:::i;:::-;33074:74;;33157:93;33246:3;33157:93;:::i;:::-;33275:2;33270:3;33266:12;33259:19;;32918:366;;;:::o;33290:419::-;33456:4;33494:2;33483:9;33479:18;33471:26;;33543:9;33537:4;33533:20;33529:1;33518:9;33514:17;33507:47;33571:131;33697:4;33571:131;:::i;:::-;33563:139;;33290:419;;;:::o;33715:174::-;33855:26;33851:1;33843:6;33839:14;33832:50;33715:174;:::o;33895:366::-;34037:3;34058:67;34122:2;34117:3;34058:67;:::i;:::-;34051:74;;34134:93;34223:3;34134:93;:::i;:::-;34252:2;34247:3;34243:12;34236:19;;33895:366;;;:::o;34267:419::-;34433:4;34471:2;34460:9;34456:18;34448:26;;34520:9;34514:4;34510:20;34506:1;34495:9;34491:17;34484:47;34548:131;34674:4;34548:131;:::i;:::-;34540:139;;34267:419;;;:::o;34692:172::-;34832:24;34828:1;34820:6;34816:14;34809:48;34692:172;:::o;34870:366::-;35012:3;35033:67;35097:2;35092:3;35033:67;:::i;:::-;35026:74;;35109:93;35198:3;35109:93;:::i;:::-;35227:2;35222:3;35218:12;35211:19;;34870:366;;;:::o;35242:419::-;35408:4;35446:2;35435:9;35431:18;35423:26;;35495:9;35489:4;35485:20;35481:1;35470:9;35466:17;35459:47;35523:131;35649:4;35523:131;:::i;:::-;35515:139;;35242:419;;;:::o;35667:348::-;35707:7;35730:20;35748:1;35730:20;:::i;:::-;35725:25;;35764:20;35782:1;35764:20;:::i;:::-;35759:25;;35952:1;35884:66;35880:74;35877:1;35874:81;35869:1;35862:9;35855:17;35851:105;35848:131;;;35959:18;;:::i;:::-;35848:131;36007:1;36004;36000:9;35989:20;;35667:348;;;;:::o;36021:179::-;36161:31;36157:1;36149:6;36145:14;36138:55;36021:179;:::o;36206:366::-;36348:3;36369:67;36433:2;36428:3;36369:67;:::i;:::-;36362:74;;36445:93;36534:3;36445:93;:::i;:::-;36563:2;36558:3;36554:12;36547:19;;36206:366;;;:::o;36578:419::-;36744:4;36782:2;36771:9;36767:18;36759:26;;36831:9;36825:4;36821:20;36817:1;36806:9;36802:17;36795:47;36859:131;36985:4;36859:131;:::i;:::-;36851:139;;36578:419;;;:::o;37003:234::-;37143:34;37139:1;37131:6;37127:14;37120:58;37212:17;37207:2;37199:6;37195:15;37188:42;37003:234;:::o;37243:366::-;37385:3;37406:67;37470:2;37465:3;37406:67;:::i;:::-;37399:74;;37482:93;37571:3;37482:93;:::i;:::-;37600:2;37595:3;37591:12;37584:19;;37243:366;;;:::o;37615:419::-;37781:4;37819:2;37808:9;37804:18;37796:26;;37868:9;37862:4;37858:20;37854:1;37843:9;37839:17;37832:47;37896:131;38022:4;37896:131;:::i;:::-;37888:139;;37615:419;;;:::o;38040:148::-;38142:11;38179:3;38164:18;;38040:148;;;;:::o;38194:377::-;38300:3;38328:39;38361:5;38328:39;:::i;:::-;38383:89;38465:6;38460:3;38383:89;:::i;:::-;38376:96;;38481:52;38526:6;38521:3;38514:4;38507:5;38503:16;38481:52;:::i;:::-;38558:6;38553:3;38549:16;38542:23;;38304:267;38194:377;;;;:::o;38577:435::-;38757:3;38779:95;38870:3;38861:6;38779:95;:::i;:::-;38772:102;;38891:95;38982:3;38973:6;38891:95;:::i;:::-;38884:102;;39003:3;38996:10;;38577:435;;;;;:::o;39018:191::-;39058:4;39078:20;39096:1;39078:20;:::i;:::-;39073:25;;39112:20;39130:1;39112:20;:::i;:::-;39107:25;;39151:1;39148;39145:8;39142:34;;;39156:18;;:::i;:::-;39142:34;39201:1;39198;39194:9;39186:17;;39018:191;;;;:::o;39215:225::-;39355:34;39351:1;39343:6;39339:14;39332:58;39424:8;39419:2;39411:6;39407:15;39400:33;39215:225;:::o;39446:366::-;39588:3;39609:67;39673:2;39668:3;39609:67;:::i;:::-;39602:74;;39685:93;39774:3;39685:93;:::i;:::-;39803:2;39798:3;39794:12;39787:19;;39446:366;;;:::o;39818:419::-;39984:4;40022:2;40011:9;40007:18;39999:26;;40071:9;40065:4;40061:20;40057:1;40046:9;40042:17;40035:47;40099:131;40225:4;40099:131;:::i;:::-;40091:139;;39818:419;;;:::o;40243:231::-;40383:34;40379:1;40371:6;40367:14;40360:58;40452:14;40447:2;40439:6;40435:15;40428:39;40243:231;:::o;40480:366::-;40622:3;40643:67;40707:2;40702:3;40643:67;:::i;:::-;40636:74;;40719:93;40808:3;40719:93;:::i;:::-;40837:2;40832:3;40828:12;40821:19;;40480:366;;;:::o;40852:419::-;41018:4;41056:2;41045:9;41041:18;41033:26;;41105:9;41099:4;41095:20;41091:1;41080:9;41076:17;41069:47;41133:131;41259:4;41133:131;:::i;:::-;41125:139;;40852:419;;;:::o;41277:224::-;41417:34;41413:1;41405:6;41401:14;41394:58;41486:7;41481:2;41473:6;41469:15;41462:32;41277:224;:::o;41507:366::-;41649:3;41670:67;41734:2;41729:3;41670:67;:::i;:::-;41663:74;;41746:93;41835:3;41746:93;:::i;:::-;41864:2;41859:3;41855:12;41848:19;;41507:366;;;:::o;41879:419::-;42045:4;42083:2;42072:9;42068:18;42060:26;;42132:9;42126:4;42122:20;42118:1;42107:9;42103:17;42096:47;42160:131;42286:4;42160:131;:::i;:::-;42152:139;;41879:419;;;:::o;42304:223::-;42444:34;42440:1;42432:6;42428:14;42421:58;42513:6;42508:2;42500:6;42496:15;42489:31;42304:223;:::o;42533:366::-;42675:3;42696:67;42760:2;42755:3;42696:67;:::i;:::-;42689:74;;42772:93;42861:3;42772:93;:::i;:::-;42890:2;42885:3;42881:12;42874:19;;42533:366;;;:::o;42905:419::-;43071:4;43109:2;43098:9;43094:18;43086:26;;43158:9;43152:4;43148:20;43144:1;43133:9;43129:17;43122:47;43186:131;43312:4;43186:131;:::i;:::-;43178:139;;42905:419;;;:::o;43330:175::-;43470:27;43466:1;43458:6;43454:14;43447:51;43330:175;:::o;43511:366::-;43653:3;43674:67;43738:2;43733:3;43674:67;:::i;:::-;43667:74;;43750:93;43839:3;43750:93;:::i;:::-;43868:2;43863:3;43859:12;43852:19;;43511:366;;;:::o;43883:419::-;44049:4;44087:2;44076:9;44072:18;44064:26;;44136:9;44130:4;44126:20;44122:1;44111:9;44107:17;44100:47;44164:131;44290:4;44164:131;:::i;:::-;44156:139;;43883:419;;;:::o;44308:237::-;44448:34;44444:1;44436:6;44432:14;44425:58;44517:20;44512:2;44504:6;44500:15;44493:45;44308:237;:::o;44551:366::-;44693:3;44714:67;44778:2;44773:3;44714:67;:::i;:::-;44707:74;;44790:93;44879:3;44790:93;:::i;:::-;44908:2;44903:3;44899:12;44892:19;;44551:366;;;:::o;44923:419::-;45089:4;45127:2;45116:9;45112:18;45104:26;;45176:9;45170:4;45166:20;45162:1;45151:9;45147:17;45140:47;45204:131;45330:4;45204:131;:::i;:::-;45196:139;;44923:419;;;:::o;45348:180::-;45396:77;45393:1;45386:88;45493:4;45490:1;45483:15;45517:4;45514:1;45507:15;45534:185;45574:1;45591:20;45609:1;45591:20;:::i;:::-;45586:25;;45625:20;45643:1;45625:20;:::i;:::-;45620:25;;45664:1;45654:35;;45669:18;;:::i;:::-;45654:35;45711:1;45708;45704:9;45699:14;;45534:185;;;;:::o;45725:176::-;45757:1;45774:20;45792:1;45774:20;:::i;:::-;45769:25;;45808:20;45826:1;45808:20;:::i;:::-;45803:25;;45847:1;45837:35;;45852:18;;:::i;:::-;45837:35;45893:1;45890;45886:9;45881:14;;45725:176;;;;:::o;45907:98::-;45958:6;45992:5;45986:12;45976:22;;45907:98;;;:::o;46011:168::-;46094:11;46128:6;46123:3;46116:19;46168:4;46163:3;46159:14;46144:29;;46011:168;;;;:::o;46185:360::-;46271:3;46299:38;46331:5;46299:38;:::i;:::-;46353:70;46416:6;46411:3;46353:70;:::i;:::-;46346:77;;46432:52;46477:6;46472:3;46465:4;46458:5;46454:16;46432:52;:::i;:::-;46509:29;46531:6;46509:29;:::i;:::-;46504:3;46500:39;46493:46;;46275:270;46185:360;;;;:::o;46551:640::-;46746:4;46784:3;46773:9;46769:19;46761:27;;46798:71;46866:1;46855:9;46851:17;46842:6;46798:71;:::i;:::-;46879:72;46947:2;46936:9;46932:18;46923:6;46879:72;:::i;:::-;46961;47029:2;47018:9;47014:18;47005:6;46961:72;:::i;:::-;47080:9;47074:4;47070:20;47065:2;47054:9;47050:18;47043:48;47108:76;47179:4;47170:6;47108:76;:::i;:::-;47100:84;;46551:640;;;;;;;:::o;47197:141::-;47253:5;47284:6;47278:13;47269:22;;47300:32;47326:5;47300:32;:::i;:::-;47197:141;;;;:::o;47344:349::-;47413:6;47462:2;47450:9;47441:7;47437:23;47433:32;47430:119;;;47468:79;;:::i;:::-;47430:119;47588:1;47613:63;47668:7;47659:6;47648:9;47644:22;47613:63;:::i;:::-;47603:73;;47559:127;47344:349;;;;:::o;47699:182::-;47839:34;47835:1;47827:6;47823:14;47816:58;47699:182;:::o;47887:366::-;48029:3;48050:67;48114:2;48109:3;48050:67;:::i;:::-;48043:74;;48126:93;48215:3;48126:93;:::i;:::-;48244:2;48239:3;48235:12;48228:19;;47887:366;;;:::o;48259:419::-;48425:4;48463:2;48452:9;48448:18;48440:26;;48512:9;48506:4;48502:20;48498:1;48487:9;48483:17;48476:47;48540:131;48666:4;48540:131;:::i;:::-;48532:139;;48259:419;;;:::o;48684:178::-;48824:30;48820:1;48812:6;48808:14;48801:54;48684:178;:::o;48868:366::-;49010:3;49031:67;49095:2;49090:3;49031:67;:::i;:::-;49024:74;;49107:93;49196:3;49107:93;:::i;:::-;49225:2;49220:3;49216:12;49209:19;;48868:366;;;:::o;49240:419::-;49406:4;49444:2;49433:9;49429:18;49421:26;;49493:9;49487:4;49483:20;49479:1;49468:9;49464:17;49457:47;49521:131;49647:4;49521:131;:::i;:::-;49513:139;;49240:419;;;:::o
Swarm Source
ipfs://cfd8fd7d25f52cd0b1130cbbc355fdfd5b483208cdd0a434f4291ef9ae87432b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.