Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
5,555 GB
Holders
1,416
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
4 GBLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
GoblinBoys
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC721A.sol"; import "./Ownable.sol"; import "./EIP712.sol"; contract GoblinBoys is ERC721A, EIP712, Ownable { using Strings for uint256; uint256 public maxSupply = 5555; uint256 public price = 0.008 ether; uint256 public maxPerTx = 10; uint256 public maxFreeAmountForGoblintownHolders = 2000; uint256 public maxAmountForPerHolders = 2; uint256 public maxPerWallet = 60; uint256 public maxFreePerWallet = 2; uint256 public maxFreeAmount = 1500; bool public mintEnabled; bool public revealed; string public baseURI; string public unrevealedURI; uint256 mintedForHolders; mapping(address => uint256) private _mintedFreeAmount; bytes32 public constant MINT_CALL_HASH_TYPE = keccak256("mint(address receiver,uint256 amount)"); address public cSigner; constructor() ERC721A("Goblin Boys", "GB") EIP712("Goblin Boys", "1") { _safeMint(msg.sender, 10); } function mint(uint256 amt) external payable { uint256 cost = price; bool freeMint = ((_mintedFreeAmount[msg.sender] + amt <= maxFreePerWallet) && (amt <= maxFreePerWallet)) || msg.sender == owner(); if (freeMint) { cost = 0; } require(msg.value >= amt * cost, "Please send the exact amount."); require(totalSupply() + amt < maxSupply + 1, "No more Goblin Boys"); require(mintEnabled, "Minting is not live yet."); require(amt < maxPerTx + 1, "Max per TX reached."); require( _numberMinted(msg.sender) + amt <= maxPerWallet, "Too many per wallet!" ); if (freeMint) { _mintedFreeAmount[msg.sender] += amt; } _safeMint(msg.sender, amt); } function goblinHolderMint( uint256 amountV, bytes32 r, bytes32 s ) external { uint256 amount = uint248(amountV); uint8 v = uint8(amountV >> 248); require( mintedForHolders + maxAmountForPerHolders < maxFreeAmountForGoblintownHolders, "No more free Goblin Boys for holders" ); require(totalSupply() + 1 < maxSupply + 1, "No more Goblin Boys"); bytes32 digest = keccak256( abi.encodePacked( "\x19Ethereum Signed Message:\n32", ECDSA.toTypedDataHash( _domainSeparatorV4(), keccak256( abi.encode(MINT_CALL_HASH_TYPE, msg.sender, amount) ) ) ) ); require(ecrecover(digest, v, r, s) == cSigner, "Invalid signer"); mintedForHolders += maxAmountForPerHolders; _safeMint(msg.sender, maxAmountForPerHolders); } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); return revealed ? string(abi.encodePacked(baseURI, tokenId.toString(), ".json")) : unrevealedURI; } function setBaseURI(string memory uri) public onlyOwner { baseURI = uri; } function setSigner(address signer) public onlyOwner { cSigner = signer; } function setUnrevealedURI(string memory uri) public onlyOwner { unrevealedURI = uri; } function setPrice(uint256 _newPrice) external onlyOwner { price = _newPrice; } function setMaxFreeAmount(uint256 _amount) external onlyOwner { maxFreeAmount = _amount; } function setMaxFreePerWallet(uint256 _amount) external onlyOwner { maxFreePerWallet = _amount; } function setMaxAmountForPerHolders(uint256 _amount) external onlyOwner { maxAmountForPerHolders = _amount; } function flipSale() external onlyOwner { mintEnabled = !mintEnabled; } function flipReveal() external onlyOwner { revealed = !revealed; } function withdraw() external onlyOwner { (bool success, ) = payable(msg.sender).call{ value: address(this).balance }(""); require(success, "Transfer failed."); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [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); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and( vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { if ( uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 ) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256( abi.encodePacked("\x19Ethereum Signed Message:\n32", hash) ); } function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256( abi.encodePacked("\x19\x01", domainSeparator, structHash) ); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ECDSA.sol"; abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator( typeHash, hashedName, hashedVersion ); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator( _TYPE_HASH, _HASHED_NAME, _HASHED_VERSION ); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256( abi.encode( typeHash, nameHash, versionHash, block.chainid, address(this) ) ); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @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 overridden 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 {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./IERC721Enumerable.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintedQueryForZeroAddress(); error BurnedQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex times unchecked { return _currentIndex - _burnCounter; } } /** * @dev See {IERC721Enumerable-tokenByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenByIndex(uint256 index) public view override returns (uint256) { uint256 numMintedSoFar = _currentIndex; uint256 tokenIdsIdx; // Counter overflow is impossible as the loop breaks when // uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (!ownership.burned) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } } revert TokenIndexOutOfBounds(); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds(); uint256 numMintedSoFar = _currentIndex; uint256 tokenIdsIdx; address currOwnershipAddr; // Counter overflow is impossible as the loop breaks when // uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } } // Execution should never reach this point. revert(); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { if (owner == address(0)) revert MintedQueryForZeroAddress(); return uint256(_addressData[owner].numberMinted); } function _numberBurned(address owner) internal view returns (uint256) { if (owner == address(0)) revert BurnedQueryForZeroAddress(); return uint256(_addressData[owner].numberBurned); } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _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 { _transfer(from, to, tokenId); if (!_checkOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if ( safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data) ) { revert TransferToNonERC721ReceiverImplementer(); } updatedIndex++; } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || isApprovedForAll(prevOwnership.addr, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership .startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @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 { TokenOwnership memory prevOwnership = ownershipOf(tokenId); _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership .startTimestamp; } } } emit Transfer(prevOwnership.addr, address(0), tokenId); _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @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); }
// SPDX-License-Identifier: MIT // 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT // 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); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"MintedQueryForZeroAddress","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINT_CALL_HASH_TYPE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountV","type":"uint256"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"goblinHolderMint","outputs":[],"stateMutability":"nonpayable","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":"maxAmountForPerHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeAmountForGoblintownHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreePerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxAmountForPerHolders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxFreeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxFreePerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setUnrevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unrevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101206040526115b3600955661c6bf526340000600a55600a600b556107d0600c556002600d55603c600e556002600f556105dc6010553480156200004357600080fd5b506040518060400160405280600b81526020017f476f626c696e20426f79730000000000000000000000000000000000000000008152506040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600b81526020017f476f626c696e20426f79730000000000000000000000000000000000000000008152506040518060400160405280600281526020017f47420000000000000000000000000000000000000000000000000000000000008152508160029080519060200190620001349291906200084e565b5080600390805190602001906200014d9291906200084e565b50505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260c081815250508160e081815250504660a08181525050620001b88184846200029760201b60201c565b6080818152505080610100818152505050505050506000620001df620002d360201b60201c565b905080600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506200029133600a620002db60201b60201c565b62000bc7565b60008383834630604051602001620002b495949392919062000a0f565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b620002fd8282604051806020016040528060008152506200030160201b60201c565b5050565b6200031683838360016200031b60201b60201c565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141562000389576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415620003c5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620003da60008683876200067060201b60201c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156200064b57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015620005fd5750620005fb60008884886200067660201b60201c565b155b1562000635576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8180600101925050808060010191505062000578565b5080600081905550506200066960008683876200082560201b60201c565b5050505050565b50505050565b6000620006a48473ffffffffffffffffffffffffffffffffffffffff166200082b60201b6200265b1760201c565b1562000818578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620006d6620002d360201b60201c565b8786866040518563ffffffff1660e01b8152600401620006fa9493929190620009bb565b602060405180830381600087803b1580156200071557600080fd5b505af19250505080156200074957506040513d601f19601f8201168201806040525081019062000746919062000915565b60015b620007c7573d80600081146200077c576040519150601f19603f3d011682016040523d82523d6000602084013e62000781565b606091505b50600081511415620007bf576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506200081d565b600190505b949350505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546200085c9062000b32565b90600052602060002090601f016020900481019282620008805760008555620008cc565b82601f106200089b57805160ff1916838001178555620008cc565b82800160010185558215620008cc579182015b82811115620008cb578251825591602001919060010190620008ae565b5b509050620008db9190620008df565b5090565b5b80821115620008fa576000816000905550600101620008e0565b5090565b6000815190506200090f8162000bad565b92915050565b6000602082840312156200092e576200092d62000b97565b5b60006200093e84828501620008fe565b91505092915050565b620009528162000a88565b82525050565b620009638162000a9c565b82525050565b6000620009768262000a6c565b62000982818562000a77565b93506200099481856020860162000afc565b6200099f8162000b9c565b840191505092915050565b620009b58162000af2565b82525050565b6000608082019050620009d2600083018762000947565b620009e1602083018662000947565b620009f06040830185620009aa565b818103606083015262000a04818462000969565b905095945050505050565b600060a08201905062000a26600083018862000958565b62000a35602083018762000958565b62000a44604083018662000958565b62000a536060830185620009aa565b62000a62608083018462000947565b9695505050505050565b600081519050919050565b600082825260208201905092915050565b600062000a958262000ad2565b9050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000b1c57808201518184015260208101905062000aff565b8381111562000b2c576000848401525b50505050565b6000600282049050600182168062000b4b57607f821691505b6020821081141562000b625762000b6162000b68565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b62000bb88162000aa6565b811462000bc457600080fd5b50565b60805160a05160c05160e05161010051614c2f62000c0c6000396000612fa001526000612fe201526000612fc101526000612f4d01526000612f750152614c2f6000f3fe6080604052600436106102725760003560e01c80637035bf181161014f578063a7027357116100c1578063d5abeb011161007a578063d5abeb011461090b578063e985e9c514610936578063f2fde38b14610973578063f892c6e21461099c578063f968adbe146109c7578063fe2c7fee146109f257610272565b8063a7027357146107fb578063b88d4fde14610826578063bf71f0a21461084f578063c688387f14610878578063c87b56dd146108a3578063d1239730146108e057610272565b806390b880a01161011357806390b880a01461070e57806391b7f5ed1461073757806395d89b4114610760578063a035b1fe1461078b578063a0712d68146107b6578063a22cb465146107d257610272565b80637035bf181461064d57806370a0823114610678578063715018a6146106b55780637ba5e621146106cc5780638da5cb5b146106e357610272565b80633ce0eab1116101e857806355f804b3116101ac57806355f804b31461053f5780635760cc5d146105685780636352211e146105935780636c0360eb146105d05780636c19e783146105fb5780636d7c4a4b1461062457610272565b80633ce0eab11461045857806342842e0e14610483578063453c2310146104ac5780634f6ccce7146104d7578063518302271461051457610272565b806318160ddd1161023a57806318160ddd1461036e5780631de3c8051461039957806323b872dd146103c45780632f745c59146103ed5780633b84d9c61461042a5780633ccfd60b1461044157610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c5780630c23bb3f14610345575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613bb2565b610a1b565b6040516102ab919061416e565b60405180910390f35b3480156102c057600080fd5b506102c9610b65565b6040516102d69190614273565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190613c55565b610bf7565b6040516103139190614107565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190613b72565b610c73565b005b34801561035157600080fd5b5061036c60048036038101906103679190613c55565b610d7e565b005b34801561037a57600080fd5b50610383610e04565b60405161039091906143f5565b60405180910390f35b3480156103a557600080fd5b506103ae610e12565b6040516103bb91906143f5565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e69190613a5c565b610e18565b005b3480156103f957600080fd5b50610414600480360381019061040f9190613b72565b610e28565b60405161042191906143f5565b60405180910390f35b34801561043657600080fd5b5061043f611001565b005b34801561044d57600080fd5b506104566110a9565b005b34801561046457600080fd5b5061046d6111d4565b60405161047a91906143f5565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a59190613a5c565b6111da565b005b3480156104b857600080fd5b506104c16111fa565b6040516104ce91906143f5565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190613c55565b611200565b60405161050b91906143f5565b60405180910390f35b34801561052057600080fd5b50610529611345565b604051610536919061416e565b60405180910390f35b34801561054b57600080fd5b5061056660048036038101906105619190613c0c565b611358565b005b34801561057457600080fd5b5061057d6113ee565b60405161058a9190614107565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b59190613c55565b611414565b6040516105c79190614107565b60405180910390f35b3480156105dc57600080fd5b506105e561142a565b6040516105f29190614273565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d91906139ef565b6114b8565b005b34801561063057600080fd5b5061064b60048036038101906106469190613c55565b611578565b005b34801561065957600080fd5b506106626115fe565b60405161066f9190614273565b60405180910390f35b34801561068457600080fd5b5061069f600480360381019061069a91906139ef565b61168c565b6040516106ac91906143f5565b60405180910390f35b3480156106c157600080fd5b506106ca61175c565b005b3480156106d857600080fd5b506106e1611899565b005b3480156106ef57600080fd5b506106f8611941565b6040516107059190614107565b60405180910390f35b34801561071a57600080fd5b5061073560048036038101906107309190613c82565b61196b565b005b34801561074357600080fd5b5061075e60048036038101906107599190613c55565b611be2565b005b34801561076c57600080fd5b50610775611c68565b6040516107829190614273565b60405180910390f35b34801561079757600080fd5b506107a0611cfa565b6040516107ad91906143f5565b60405180910390f35b6107d060048036038101906107cb9190613c55565b611d00565b005b3480156107de57600080fd5b506107f960048036038101906107f49190613b32565b611fc4565b005b34801561080757600080fd5b5061081061213c565b60405161081d91906143f5565b60405180910390f35b34801561083257600080fd5b5061084d60048036038101906108489190613aaf565b612142565b005b34801561085b57600080fd5b5061087660048036038101906108719190613c55565b612195565b005b34801561088457600080fd5b5061088d61221b565b60405161089a9190614189565b60405180910390f35b3480156108af57600080fd5b506108ca60048036038101906108c59190613c55565b61223f565b6040516108d79190614273565b60405180910390f35b3480156108ec57600080fd5b506108f5612360565b604051610902919061416e565b60405180910390f35b34801561091757600080fd5b50610920612373565b60405161092d91906143f5565b60405180910390f35b34801561094257600080fd5b5061095d60048036038101906109589190613a1c565b612379565b60405161096a919061416e565b60405180910390f35b34801561097f57600080fd5b5061099a600480360381019061099591906139ef565b61240d565b005b3480156109a857600080fd5b506109b16125b9565b6040516109be91906143f5565b60405180910390f35b3480156109d357600080fd5b506109dc6125bf565b6040516109e991906143f5565b60405180910390f35b3480156109fe57600080fd5b50610a196004803603810190610a149190613c0c565b6125c5565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ae657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b4e57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b5e5750610b5d8261267e565b5b9050919050565b606060028054610b74906146dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba0906146dc565b8015610bed5780601f10610bc257610100808354040283529160200191610bed565b820191906000526020600020905b815481529060010190602001808311610bd057829003601f168201915b5050505050905090565b6000610c02826126e8565b610c38576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c7e82611414565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ce6576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d05612722565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d375750610d3581610d30612722565b612379565b155b15610d6e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d7983838361272a565b505050565b610d86612722565b73ffffffffffffffffffffffffffffffffffffffff16610da4611941565b73ffffffffffffffffffffffffffffffffffffffff1614610dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df190614315565b60405180910390fd5b8060108190555050565b600060015460005403905090565b600d5481565b610e238383836127dc565b505050565b6000610e338361168c565b8210610e6b576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054905060008060005b83811015610ff5576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610f545750610fe8565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f9457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fe65786841415610fdd578195505050505050610ffb565b83806001019450505b505b8080600101915050610e77565b50600080fd5b92915050565b611009612722565b73ffffffffffffffffffffffffffffffffffffffff16611027611941565b73ffffffffffffffffffffffffffffffffffffffff161461107d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107490614315565b60405180910390fd5b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b6110b1612722565b73ffffffffffffffffffffffffffffffffffffffff166110cf611941565b73ffffffffffffffffffffffffffffffffffffffff1614611125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111c90614315565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161114b906140f2565b60006040518083038185875af1925050503d8060008114611188576040519150601f19603f3d011682016040523d82523d6000602084013e61118d565b606091505b50509050806111d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c890614395565b60405180910390fd5b50565b600c5481565b6111f583838360405180602001604052806000815250612142565b505050565b600e5481565b60008060005490506000805b8281101561130d576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516112ff57858314156112f65781945050505050611340565b82806001019350505b50808060010191505061120c565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b601160019054906101000a900460ff1681565b611360612722565b73ffffffffffffffffffffffffffffffffffffffff1661137e611941565b73ffffffffffffffffffffffffffffffffffffffff16146113d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cb90614315565b60405180910390fd5b80601290805190602001906113ea9291906137ab565b5050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061141f82612ccd565b600001519050919050565b60128054611437906146dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611463906146dc565b80156114b05780601f10611485576101008083540402835291602001916114b0565b820191906000526020600020905b81548152906001019060200180831161149357829003601f168201915b505050505081565b6114c0612722565b73ffffffffffffffffffffffffffffffffffffffff166114de611941565b73ffffffffffffffffffffffffffffffffffffffff1614611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152b90614315565b60405180910390fd5b80601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611580612722565b73ffffffffffffffffffffffffffffffffffffffff1661159e611941565b73ffffffffffffffffffffffffffffffffffffffff16146115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb90614315565b60405180910390fd5b80600f8190555050565b6013805461160b906146dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611637906146dc565b80156116845780601f1061165957610100808354040283529160200191611684565b820191906000526020600020905b81548152906001019060200180831161166757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116f4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611764612722565b73ffffffffffffffffffffffffffffffffffffffff16611782611941565b73ffffffffffffffffffffffffffffffffffffffff16146117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf90614315565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6118a1612722565b73ffffffffffffffffffffffffffffffffffffffff166118bf611941565b73ffffffffffffffffffffffffffffffffffffffff1614611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190c90614315565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050600060f885901c9050600c54600d546014546119ad91906144fa565b106119ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e4906143b5565b60405180910390fd5b60016009546119fc91906144fa565b6001611a06610e04565b611a1091906144fa565b10611a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a47906142d5565b60405180910390fd5b6000611aad611a5d612f49565b7f6ac0707cac0c442e03ae738b183f3fb620ee941711ca779bae1b0422a39331ea3386604051602001611a92939291906141a4565b6040516020818303038152906040528051906020012061300c565b604051602001611abd9190614095565b604051602081830303815290604052805190602001209050601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660018284888860405160008152602001604052604051611b31949392919061422e565b6020604051602081039080840390855afa158015611b53573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff1614611bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baa906142f5565b60405180910390fd5b600d5460146000828254611bc791906144fa565b92505081905550611bda33600d5461303f565b505050505050565b611bea612722565b73ffffffffffffffffffffffffffffffffffffffff16611c08611941565b73ffffffffffffffffffffffffffffffffffffffff1614611c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5590614315565b60405180910390fd5b80600a8190555050565b606060038054611c77906146dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca3906146dc565b8015611cf05780601f10611cc557610100808354040283529160200191611cf0565b820191906000526020600020905b815481529060010190602001808311611cd357829003601f168201915b5050505050905090565b600a5481565b6000600a5490506000600f5483601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d5791906144fa565b11158015611d675750600f548311155b80611da45750611d75611941565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b90508015611db157600091505b8183611dbd9190614581565b341015611dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df690614375565b60405180910390fd5b6001600954611e0e91906144fa565b83611e17610e04565b611e2191906144fa565b10611e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e58906142d5565b60405180910390fd5b601160009054906101000a900460ff16611eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea790614335565b60405180910390fd5b6001600b54611ebf91906144fa565b8310611f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef7906143d5565b60405180910390fd5b600e5483611f0d3361305d565b611f1791906144fa565b1115611f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4f906142b5565b60405180910390fd5b8015611fb55782601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fad91906144fa565b925050819055505b611fbf338461303f565b505050565b611fcc612722565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612031576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061203e612722565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120eb612722565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612130919061416e565b60405180910390a35050565b600f5481565b61214d8484846127dc565b6121598484848461312d565b61218f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b61219d612722565b73ffffffffffffffffffffffffffffffffffffffff166121bb611941565b73ffffffffffffffffffffffffffffffffffffffff1614612211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220890614315565b60405180910390fd5b80600d8190555050565b7f6ac0707cac0c442e03ae738b183f3fb620ee941711ca779bae1b0422a39331ea81565b606061224a826126e8565b612289576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228090614355565b60405180910390fd5b601160019054906101000a900460ff1661232d57601380546122aa906146dc565b80601f01602080910402602001604051908101604052809291908181526020018280546122d6906146dc565b80156123235780601f106122f857610100808354040283529160200191612323565b820191906000526020600020905b81548152906001019060200180831161230657829003601f168201915b5050505050612359565b6012612338836132bb565b604051602001612349929190614066565b6040516020818303038152906040525b9050919050565b601160009054906101000a900460ff1681565b60095481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612415612722565b73ffffffffffffffffffffffffffffffffffffffff16612433611941565b73ffffffffffffffffffffffffffffffffffffffff1614612489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248090614315565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f090614295565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60105481565b600b5481565b6125cd612722565b73ffffffffffffffffffffffffffffffffffffffff166125eb611941565b73ffffffffffffffffffffffffffffffffffffffff1614612641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263890614315565b60405180910390fd5b80601390805190602001906126579291906137ab565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080548210801561271b575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006127e782612ccd565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661280e612722565b73ffffffffffffffffffffffffffffffffffffffff1614806128415750612840826000015161283b612722565b612379565b5b80612886575061284f612722565b73ffffffffffffffffffffffffffffffffffffffff1661286e84610bf7565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806128bf576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612928576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561298f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61299c858585600161341c565b6129ac600084846000015161272a565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612c5d57600054811015612c5c5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cc68585856001613422565b5050505050565b612cd5613831565b6000829050600054811015612f12576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612f1057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612df4578092505050612f44565b5b600115612f0f57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612f0a578092505050612f44565b612df5565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60007f0000000000000000000000000000000000000000000000000000000000000000461415612f9b577f00000000000000000000000000000000000000000000000000000000000000009050613009565b6130067f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613428565b90505b90565b600082826040516020016130219291906140bb565b60405160208183030381529060405280519060200120905092915050565b613059828260405180602001604052806000815250613462565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130c5576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b600061314e8473ffffffffffffffffffffffffffffffffffffffff1661265b565b156132ae578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613177612722565b8786866040518563ffffffff1660e01b81526004016131999493929190614122565b602060405180830381600087803b1580156131b357600080fd5b505af19250505080156131e457506040513d601f19601f820116820180604052508101906131e19190613bdf565b60015b61325e573d8060008114613214576040519150601f19603f3d011682016040523d82523d6000602084013e613219565b606091505b50600081511415613256576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132b3565b600190505b949350505050565b60606000821415613303576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613417565b600082905060005b6000821461333557808061331e9061473f565b915050600a8261332e9190614550565b915061330b565b60008167ffffffffffffffff8111156133515761335061487f565b5b6040519080825280601f01601f1916602001820160405280156133835781602001600182028036833780820191505090505b5090505b600085146134105760018261339c91906145db565b9150600a856133ab9190614792565b60306133b791906144fa565b60f81b8183815181106133cd576133cc614850565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134099190614550565b9450613387565b8093505050505b919050565b50505050565b50505050565b600083838346306040516020016134439594939291906141db565b6040516020818303038152906040528051906020012090509392505050565b61346f8383836001613474565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156134e1576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561351c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613529600086838761341c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561378e57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156137425750613740600088848861312d565b155b15613779576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818060010192505080806001019150506136c7565b5080600081905550506137a46000868387613422565b5050505050565b8280546137b7906146dc565b90600052602060002090601f0160209004810192826137d95760008555613820565b82601f106137f257805160ff1916838001178555613820565b82800160010185558215613820579182015b8281111561381f578251825591602001919060010190613804565b5b50905061382d9190613874565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561388d576000816000905550600101613875565b5090565b60006138a461389f84614435565b614410565b9050828152602081018484840111156138c0576138bf6148b3565b5b6138cb84828561469a565b509392505050565b60006138e66138e184614466565b614410565b905082815260208101848484011115613902576139016148b3565b5b61390d84828561469a565b509392505050565b60008135905061392481614b86565b92915050565b60008135905061393981614b9d565b92915050565b60008135905061394e81614bb4565b92915050565b60008135905061396381614bcb565b92915050565b60008151905061397881614bcb565b92915050565b600082601f830112613993576139926148ae565b5b81356139a3848260208601613891565b91505092915050565b600082601f8301126139c1576139c06148ae565b5b81356139d18482602086016138d3565b91505092915050565b6000813590506139e981614be2565b92915050565b600060208284031215613a0557613a046148bd565b5b6000613a1384828501613915565b91505092915050565b60008060408385031215613a3357613a326148bd565b5b6000613a4185828601613915565b9250506020613a5285828601613915565b9150509250929050565b600080600060608486031215613a7557613a746148bd565b5b6000613a8386828701613915565b9350506020613a9486828701613915565b9250506040613aa5868287016139da565b9150509250925092565b60008060008060808587031215613ac957613ac86148bd565b5b6000613ad787828801613915565b9450506020613ae887828801613915565b9350506040613af9878288016139da565b925050606085013567ffffffffffffffff811115613b1a57613b196148b8565b5b613b268782880161397e565b91505092959194509250565b60008060408385031215613b4957613b486148bd565b5b6000613b5785828601613915565b9250506020613b688582860161392a565b9150509250929050565b60008060408385031215613b8957613b886148bd565b5b6000613b9785828601613915565b9250506020613ba8858286016139da565b9150509250929050565b600060208284031215613bc857613bc76148bd565b5b6000613bd684828501613954565b91505092915050565b600060208284031215613bf557613bf46148bd565b5b6000613c0384828501613969565b91505092915050565b600060208284031215613c2257613c216148bd565b5b600082013567ffffffffffffffff811115613c4057613c3f6148b8565b5b613c4c848285016139ac565b91505092915050565b600060208284031215613c6b57613c6a6148bd565b5b6000613c79848285016139da565b91505092915050565b600080600060608486031215613c9b57613c9a6148bd565b5b6000613ca9868287016139da565b9350506020613cba8682870161393f565b9250506040613ccb8682870161393f565b9150509250925092565b613cde8161460f565b82525050565b613ced81614621565b82525050565b613cfc8161462d565b82525050565b613d13613d0e8261462d565b614788565b82525050565b6000613d24826144ac565b613d2e81856144c2565b9350613d3e8185602086016146a9565b613d47816148c2565b840191505092915050565b6000613d5d826144b7565b613d6781856144de565b9350613d778185602086016146a9565b613d80816148c2565b840191505092915050565b6000613d96826144b7565b613da081856144ef565b9350613db08185602086016146a9565b80840191505092915050565b60008154613dc9816146dc565b613dd381866144ef565b94506001821660008114613dee5760018114613dff57613e32565b60ff19831686528186019350613e32565b613e0885614497565b60005b83811015613e2a57815481890152600182019150602081019050613e0b565b838801955050505b50505092915050565b6000613e48601c836144ef565b9150613e53826148d3565b601c82019050919050565b6000613e6b6026836144de565b9150613e76826148fc565b604082019050919050565b6000613e8e6002836144ef565b9150613e998261494b565b600282019050919050565b6000613eb16014836144de565b9150613ebc82614974565b602082019050919050565b6000613ed46013836144de565b9150613edf8261499d565b602082019050919050565b6000613ef7600e836144de565b9150613f02826149c6565b602082019050919050565b6000613f1a6005836144ef565b9150613f25826149ef565b600582019050919050565b6000613f3d6020836144de565b9150613f4882614a18565b602082019050919050565b6000613f606018836144de565b9150613f6b82614a41565b602082019050919050565b6000613f83602f836144de565b9150613f8e82614a6a565b604082019050919050565b6000613fa6601d836144de565b9150613fb182614ab9565b602082019050919050565b6000613fc96000836144d3565b9150613fd482614ae2565b600082019050919050565b6000613fec6010836144de565b9150613ff782614ae5565b602082019050919050565b600061400f6024836144de565b915061401a82614b0e565b604082019050919050565b60006140326013836144de565b915061403d82614b5d565b602082019050919050565b61405181614683565b82525050565b6140608161468d565b82525050565b60006140728285613dbc565b915061407e8284613d8b565b915061408982613f0d565b91508190509392505050565b60006140a082613e3b565b91506140ac8284613d02565b60208201915081905092915050565b60006140c682613e81565b91506140d28285613d02565b6020820191506140e28284613d02565b6020820191508190509392505050565b60006140fd82613fbc565b9150819050919050565b600060208201905061411c6000830184613cd5565b92915050565b60006080820190506141376000830187613cd5565b6141446020830186613cd5565b6141516040830185614048565b81810360608301526141638184613d19565b905095945050505050565b60006020820190506141836000830184613ce4565b92915050565b600060208201905061419e6000830184613cf3565b92915050565b60006060820190506141b96000830186613cf3565b6141c66020830185613cd5565b6141d36040830184614048565b949350505050565b600060a0820190506141f06000830188613cf3565b6141fd6020830187613cf3565b61420a6040830186613cf3565b6142176060830185614048565b6142246080830184613cd5565b9695505050505050565b60006080820190506142436000830187613cf3565b6142506020830186614057565b61425d6040830185613cf3565b61426a6060830184613cf3565b95945050505050565b6000602082019050818103600083015261428d8184613d52565b905092915050565b600060208201905081810360008301526142ae81613e5e565b9050919050565b600060208201905081810360008301526142ce81613ea4565b9050919050565b600060208201905081810360008301526142ee81613ec7565b9050919050565b6000602082019050818103600083015261430e81613eea565b9050919050565b6000602082019050818103600083015261432e81613f30565b9050919050565b6000602082019050818103600083015261434e81613f53565b9050919050565b6000602082019050818103600083015261436e81613f76565b9050919050565b6000602082019050818103600083015261438e81613f99565b9050919050565b600060208201905081810360008301526143ae81613fdf565b9050919050565b600060208201905081810360008301526143ce81614002565b9050919050565b600060208201905081810360008301526143ee81614025565b9050919050565b600060208201905061440a6000830184614048565b92915050565b600061441a61442b565b9050614426828261470e565b919050565b6000604051905090565b600067ffffffffffffffff8211156144505761444f61487f565b5b614459826148c2565b9050602081019050919050565b600067ffffffffffffffff8211156144815761448061487f565b5b61448a826148c2565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061450582614683565b915061451083614683565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614545576145446147c3565b5b828201905092915050565b600061455b82614683565b915061456683614683565b925082614576576145756147f2565b5b828204905092915050565b600061458c82614683565b915061459783614683565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156145d0576145cf6147c3565b5b828202905092915050565b60006145e682614683565b91506145f183614683565b925082821015614604576146036147c3565b5b828203905092915050565b600061461a82614663565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156146c75780820151818401526020810190506146ac565b838111156146d6576000848401525b50505050565b600060028204905060018216806146f457607f821691505b6020821081141561470857614707614821565b5b50919050565b614717826148c2565b810181811067ffffffffffffffff821117156147365761473561487f565b5b80604052505050565b600061474a82614683565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561477d5761477c6147c3565b5b600182019050919050565b6000819050919050565b600061479d82614683565b91506147a883614683565b9250826147b8576147b76147f2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f546f6f206d616e79207065722077616c6c657421000000000000000000000000600082015250565b7f4e6f206d6f726520476f626c696e20426f797300000000000000000000000000600082015250565b7f496e76616c6964207369676e6572000000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d696e74696e67206973206e6f74206c697665207965742e0000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e6f206d6f7265206672656520476f626c696e20426f797320666f7220686f6c60008201527f6465727300000000000000000000000000000000000000000000000000000000602082015250565b7f4d61782070657220545820726561636865642e00000000000000000000000000600082015250565b614b8f8161460f565b8114614b9a57600080fd5b50565b614ba681614621565b8114614bb157600080fd5b50565b614bbd8161462d565b8114614bc857600080fd5b50565b614bd481614637565b8114614bdf57600080fd5b50565b614beb81614683565b8114614bf657600080fd5b5056fea26469706673582212202fe6a5cb6ad4cc99f50d3e9c743df3522b1d0c555056e1fa4881a4c90010bf6664736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102725760003560e01c80637035bf181161014f578063a7027357116100c1578063d5abeb011161007a578063d5abeb011461090b578063e985e9c514610936578063f2fde38b14610973578063f892c6e21461099c578063f968adbe146109c7578063fe2c7fee146109f257610272565b8063a7027357146107fb578063b88d4fde14610826578063bf71f0a21461084f578063c688387f14610878578063c87b56dd146108a3578063d1239730146108e057610272565b806390b880a01161011357806390b880a01461070e57806391b7f5ed1461073757806395d89b4114610760578063a035b1fe1461078b578063a0712d68146107b6578063a22cb465146107d257610272565b80637035bf181461064d57806370a0823114610678578063715018a6146106b55780637ba5e621146106cc5780638da5cb5b146106e357610272565b80633ce0eab1116101e857806355f804b3116101ac57806355f804b31461053f5780635760cc5d146105685780636352211e146105935780636c0360eb146105d05780636c19e783146105fb5780636d7c4a4b1461062457610272565b80633ce0eab11461045857806342842e0e14610483578063453c2310146104ac5780634f6ccce7146104d7578063518302271461051457610272565b806318160ddd1161023a57806318160ddd1461036e5780631de3c8051461039957806323b872dd146103c45780632f745c59146103ed5780633b84d9c61461042a5780633ccfd60b1461044157610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c5780630c23bb3f14610345575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613bb2565b610a1b565b6040516102ab919061416e565b60405180910390f35b3480156102c057600080fd5b506102c9610b65565b6040516102d69190614273565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190613c55565b610bf7565b6040516103139190614107565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190613b72565b610c73565b005b34801561035157600080fd5b5061036c60048036038101906103679190613c55565b610d7e565b005b34801561037a57600080fd5b50610383610e04565b60405161039091906143f5565b60405180910390f35b3480156103a557600080fd5b506103ae610e12565b6040516103bb91906143f5565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e69190613a5c565b610e18565b005b3480156103f957600080fd5b50610414600480360381019061040f9190613b72565b610e28565b60405161042191906143f5565b60405180910390f35b34801561043657600080fd5b5061043f611001565b005b34801561044d57600080fd5b506104566110a9565b005b34801561046457600080fd5b5061046d6111d4565b60405161047a91906143f5565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a59190613a5c565b6111da565b005b3480156104b857600080fd5b506104c16111fa565b6040516104ce91906143f5565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190613c55565b611200565b60405161050b91906143f5565b60405180910390f35b34801561052057600080fd5b50610529611345565b604051610536919061416e565b60405180910390f35b34801561054b57600080fd5b5061056660048036038101906105619190613c0c565b611358565b005b34801561057457600080fd5b5061057d6113ee565b60405161058a9190614107565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b59190613c55565b611414565b6040516105c79190614107565b60405180910390f35b3480156105dc57600080fd5b506105e561142a565b6040516105f29190614273565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d91906139ef565b6114b8565b005b34801561063057600080fd5b5061064b60048036038101906106469190613c55565b611578565b005b34801561065957600080fd5b506106626115fe565b60405161066f9190614273565b60405180910390f35b34801561068457600080fd5b5061069f600480360381019061069a91906139ef565b61168c565b6040516106ac91906143f5565b60405180910390f35b3480156106c157600080fd5b506106ca61175c565b005b3480156106d857600080fd5b506106e1611899565b005b3480156106ef57600080fd5b506106f8611941565b6040516107059190614107565b60405180910390f35b34801561071a57600080fd5b5061073560048036038101906107309190613c82565b61196b565b005b34801561074357600080fd5b5061075e60048036038101906107599190613c55565b611be2565b005b34801561076c57600080fd5b50610775611c68565b6040516107829190614273565b60405180910390f35b34801561079757600080fd5b506107a0611cfa565b6040516107ad91906143f5565b60405180910390f35b6107d060048036038101906107cb9190613c55565b611d00565b005b3480156107de57600080fd5b506107f960048036038101906107f49190613b32565b611fc4565b005b34801561080757600080fd5b5061081061213c565b60405161081d91906143f5565b60405180910390f35b34801561083257600080fd5b5061084d60048036038101906108489190613aaf565b612142565b005b34801561085b57600080fd5b5061087660048036038101906108719190613c55565b612195565b005b34801561088457600080fd5b5061088d61221b565b60405161089a9190614189565b60405180910390f35b3480156108af57600080fd5b506108ca60048036038101906108c59190613c55565b61223f565b6040516108d79190614273565b60405180910390f35b3480156108ec57600080fd5b506108f5612360565b604051610902919061416e565b60405180910390f35b34801561091757600080fd5b50610920612373565b60405161092d91906143f5565b60405180910390f35b34801561094257600080fd5b5061095d60048036038101906109589190613a1c565b612379565b60405161096a919061416e565b60405180910390f35b34801561097f57600080fd5b5061099a600480360381019061099591906139ef565b61240d565b005b3480156109a857600080fd5b506109b16125b9565b6040516109be91906143f5565b60405180910390f35b3480156109d357600080fd5b506109dc6125bf565b6040516109e991906143f5565b60405180910390f35b3480156109fe57600080fd5b50610a196004803603810190610a149190613c0c565b6125c5565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ae657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b4e57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b5e5750610b5d8261267e565b5b9050919050565b606060028054610b74906146dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba0906146dc565b8015610bed5780601f10610bc257610100808354040283529160200191610bed565b820191906000526020600020905b815481529060010190602001808311610bd057829003601f168201915b5050505050905090565b6000610c02826126e8565b610c38576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c7e82611414565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ce6576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d05612722565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d375750610d3581610d30612722565b612379565b155b15610d6e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d7983838361272a565b505050565b610d86612722565b73ffffffffffffffffffffffffffffffffffffffff16610da4611941565b73ffffffffffffffffffffffffffffffffffffffff1614610dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df190614315565b60405180910390fd5b8060108190555050565b600060015460005403905090565b600d5481565b610e238383836127dc565b505050565b6000610e338361168c565b8210610e6b576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054905060008060005b83811015610ff5576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610f545750610fe8565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f9457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fe65786841415610fdd578195505050505050610ffb565b83806001019450505b505b8080600101915050610e77565b50600080fd5b92915050565b611009612722565b73ffffffffffffffffffffffffffffffffffffffff16611027611941565b73ffffffffffffffffffffffffffffffffffffffff161461107d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107490614315565b60405180910390fd5b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b6110b1612722565b73ffffffffffffffffffffffffffffffffffffffff166110cf611941565b73ffffffffffffffffffffffffffffffffffffffff1614611125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111c90614315565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161114b906140f2565b60006040518083038185875af1925050503d8060008114611188576040519150601f19603f3d011682016040523d82523d6000602084013e61118d565b606091505b50509050806111d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c890614395565b60405180910390fd5b50565b600c5481565b6111f583838360405180602001604052806000815250612142565b505050565b600e5481565b60008060005490506000805b8281101561130d576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516112ff57858314156112f65781945050505050611340565b82806001019350505b50808060010191505061120c565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b601160019054906101000a900460ff1681565b611360612722565b73ffffffffffffffffffffffffffffffffffffffff1661137e611941565b73ffffffffffffffffffffffffffffffffffffffff16146113d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cb90614315565b60405180910390fd5b80601290805190602001906113ea9291906137ab565b5050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061141f82612ccd565b600001519050919050565b60128054611437906146dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611463906146dc565b80156114b05780601f10611485576101008083540402835291602001916114b0565b820191906000526020600020905b81548152906001019060200180831161149357829003601f168201915b505050505081565b6114c0612722565b73ffffffffffffffffffffffffffffffffffffffff166114de611941565b73ffffffffffffffffffffffffffffffffffffffff1614611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152b90614315565b60405180910390fd5b80601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611580612722565b73ffffffffffffffffffffffffffffffffffffffff1661159e611941565b73ffffffffffffffffffffffffffffffffffffffff16146115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb90614315565b60405180910390fd5b80600f8190555050565b6013805461160b906146dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611637906146dc565b80156116845780601f1061165957610100808354040283529160200191611684565b820191906000526020600020905b81548152906001019060200180831161166757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116f4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611764612722565b73ffffffffffffffffffffffffffffffffffffffff16611782611941565b73ffffffffffffffffffffffffffffffffffffffff16146117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf90614315565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6118a1612722565b73ffffffffffffffffffffffffffffffffffffffff166118bf611941565b73ffffffffffffffffffffffffffffffffffffffff1614611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190c90614315565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050600060f885901c9050600c54600d546014546119ad91906144fa565b106119ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e4906143b5565b60405180910390fd5b60016009546119fc91906144fa565b6001611a06610e04565b611a1091906144fa565b10611a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a47906142d5565b60405180910390fd5b6000611aad611a5d612f49565b7f6ac0707cac0c442e03ae738b183f3fb620ee941711ca779bae1b0422a39331ea3386604051602001611a92939291906141a4565b6040516020818303038152906040528051906020012061300c565b604051602001611abd9190614095565b604051602081830303815290604052805190602001209050601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660018284888860405160008152602001604052604051611b31949392919061422e565b6020604051602081039080840390855afa158015611b53573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff1614611bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baa906142f5565b60405180910390fd5b600d5460146000828254611bc791906144fa565b92505081905550611bda33600d5461303f565b505050505050565b611bea612722565b73ffffffffffffffffffffffffffffffffffffffff16611c08611941565b73ffffffffffffffffffffffffffffffffffffffff1614611c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5590614315565b60405180910390fd5b80600a8190555050565b606060038054611c77906146dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca3906146dc565b8015611cf05780601f10611cc557610100808354040283529160200191611cf0565b820191906000526020600020905b815481529060010190602001808311611cd357829003601f168201915b5050505050905090565b600a5481565b6000600a5490506000600f5483601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d5791906144fa565b11158015611d675750600f548311155b80611da45750611d75611941565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b90508015611db157600091505b8183611dbd9190614581565b341015611dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df690614375565b60405180910390fd5b6001600954611e0e91906144fa565b83611e17610e04565b611e2191906144fa565b10611e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e58906142d5565b60405180910390fd5b601160009054906101000a900460ff16611eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea790614335565b60405180910390fd5b6001600b54611ebf91906144fa565b8310611f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef7906143d5565b60405180910390fd5b600e5483611f0d3361305d565b611f1791906144fa565b1115611f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4f906142b5565b60405180910390fd5b8015611fb55782601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fad91906144fa565b925050819055505b611fbf338461303f565b505050565b611fcc612722565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612031576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061203e612722565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120eb612722565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612130919061416e565b60405180910390a35050565b600f5481565b61214d8484846127dc565b6121598484848461312d565b61218f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b61219d612722565b73ffffffffffffffffffffffffffffffffffffffff166121bb611941565b73ffffffffffffffffffffffffffffffffffffffff1614612211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220890614315565b60405180910390fd5b80600d8190555050565b7f6ac0707cac0c442e03ae738b183f3fb620ee941711ca779bae1b0422a39331ea81565b606061224a826126e8565b612289576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228090614355565b60405180910390fd5b601160019054906101000a900460ff1661232d57601380546122aa906146dc565b80601f01602080910402602001604051908101604052809291908181526020018280546122d6906146dc565b80156123235780601f106122f857610100808354040283529160200191612323565b820191906000526020600020905b81548152906001019060200180831161230657829003601f168201915b5050505050612359565b6012612338836132bb565b604051602001612349929190614066565b6040516020818303038152906040525b9050919050565b601160009054906101000a900460ff1681565b60095481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612415612722565b73ffffffffffffffffffffffffffffffffffffffff16612433611941565b73ffffffffffffffffffffffffffffffffffffffff1614612489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248090614315565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f090614295565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60105481565b600b5481565b6125cd612722565b73ffffffffffffffffffffffffffffffffffffffff166125eb611941565b73ffffffffffffffffffffffffffffffffffffffff1614612641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263890614315565b60405180910390fd5b80601390805190602001906126579291906137ab565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080548210801561271b575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006127e782612ccd565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661280e612722565b73ffffffffffffffffffffffffffffffffffffffff1614806128415750612840826000015161283b612722565b612379565b5b80612886575061284f612722565b73ffffffffffffffffffffffffffffffffffffffff1661286e84610bf7565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806128bf576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612928576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561298f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61299c858585600161341c565b6129ac600084846000015161272a565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612c5d57600054811015612c5c5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cc68585856001613422565b5050505050565b612cd5613831565b6000829050600054811015612f12576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612f1057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612df4578092505050612f44565b5b600115612f0f57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612f0a578092505050612f44565b612df5565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60007f0000000000000000000000000000000000000000000000000000000000000001461415612f9b577fd3f6002cc223a07f5b1a38963173c0c162d8e0843b3b52b6551bb65c43d74ae19050613009565b6130067f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f3cf49be14ac7878f6c747e97f83edc511ece97723e8674d48634ca06a6bcf4187fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6613428565b90505b90565b600082826040516020016130219291906140bb565b60405160208183030381529060405280519060200120905092915050565b613059828260405180602001604052806000815250613462565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130c5576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b600061314e8473ffffffffffffffffffffffffffffffffffffffff1661265b565b156132ae578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613177612722565b8786866040518563ffffffff1660e01b81526004016131999493929190614122565b602060405180830381600087803b1580156131b357600080fd5b505af19250505080156131e457506040513d601f19601f820116820180604052508101906131e19190613bdf565b60015b61325e573d8060008114613214576040519150601f19603f3d011682016040523d82523d6000602084013e613219565b606091505b50600081511415613256576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132b3565b600190505b949350505050565b60606000821415613303576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613417565b600082905060005b6000821461333557808061331e9061473f565b915050600a8261332e9190614550565b915061330b565b60008167ffffffffffffffff8111156133515761335061487f565b5b6040519080825280601f01601f1916602001820160405280156133835781602001600182028036833780820191505090505b5090505b600085146134105760018261339c91906145db565b9150600a856133ab9190614792565b60306133b791906144fa565b60f81b8183815181106133cd576133cc614850565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134099190614550565b9450613387565b8093505050505b919050565b50505050565b50505050565b600083838346306040516020016134439594939291906141db565b6040516020818303038152906040528051906020012090509392505050565b61346f8383836001613474565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156134e1576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561351c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613529600086838761341c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561378e57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156137425750613740600088848861312d565b155b15613779576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818060010192505080806001019150506136c7565b5080600081905550506137a46000868387613422565b5050505050565b8280546137b7906146dc565b90600052602060002090601f0160209004810192826137d95760008555613820565b82601f106137f257805160ff1916838001178555613820565b82800160010185558215613820579182015b8281111561381f578251825591602001919060010190613804565b5b50905061382d9190613874565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561388d576000816000905550600101613875565b5090565b60006138a461389f84614435565b614410565b9050828152602081018484840111156138c0576138bf6148b3565b5b6138cb84828561469a565b509392505050565b60006138e66138e184614466565b614410565b905082815260208101848484011115613902576139016148b3565b5b61390d84828561469a565b509392505050565b60008135905061392481614b86565b92915050565b60008135905061393981614b9d565b92915050565b60008135905061394e81614bb4565b92915050565b60008135905061396381614bcb565b92915050565b60008151905061397881614bcb565b92915050565b600082601f830112613993576139926148ae565b5b81356139a3848260208601613891565b91505092915050565b600082601f8301126139c1576139c06148ae565b5b81356139d18482602086016138d3565b91505092915050565b6000813590506139e981614be2565b92915050565b600060208284031215613a0557613a046148bd565b5b6000613a1384828501613915565b91505092915050565b60008060408385031215613a3357613a326148bd565b5b6000613a4185828601613915565b9250506020613a5285828601613915565b9150509250929050565b600080600060608486031215613a7557613a746148bd565b5b6000613a8386828701613915565b9350506020613a9486828701613915565b9250506040613aa5868287016139da565b9150509250925092565b60008060008060808587031215613ac957613ac86148bd565b5b6000613ad787828801613915565b9450506020613ae887828801613915565b9350506040613af9878288016139da565b925050606085013567ffffffffffffffff811115613b1a57613b196148b8565b5b613b268782880161397e565b91505092959194509250565b60008060408385031215613b4957613b486148bd565b5b6000613b5785828601613915565b9250506020613b688582860161392a565b9150509250929050565b60008060408385031215613b8957613b886148bd565b5b6000613b9785828601613915565b9250506020613ba8858286016139da565b9150509250929050565b600060208284031215613bc857613bc76148bd565b5b6000613bd684828501613954565b91505092915050565b600060208284031215613bf557613bf46148bd565b5b6000613c0384828501613969565b91505092915050565b600060208284031215613c2257613c216148bd565b5b600082013567ffffffffffffffff811115613c4057613c3f6148b8565b5b613c4c848285016139ac565b91505092915050565b600060208284031215613c6b57613c6a6148bd565b5b6000613c79848285016139da565b91505092915050565b600080600060608486031215613c9b57613c9a6148bd565b5b6000613ca9868287016139da565b9350506020613cba8682870161393f565b9250506040613ccb8682870161393f565b9150509250925092565b613cde8161460f565b82525050565b613ced81614621565b82525050565b613cfc8161462d565b82525050565b613d13613d0e8261462d565b614788565b82525050565b6000613d24826144ac565b613d2e81856144c2565b9350613d3e8185602086016146a9565b613d47816148c2565b840191505092915050565b6000613d5d826144b7565b613d6781856144de565b9350613d778185602086016146a9565b613d80816148c2565b840191505092915050565b6000613d96826144b7565b613da081856144ef565b9350613db08185602086016146a9565b80840191505092915050565b60008154613dc9816146dc565b613dd381866144ef565b94506001821660008114613dee5760018114613dff57613e32565b60ff19831686528186019350613e32565b613e0885614497565b60005b83811015613e2a57815481890152600182019150602081019050613e0b565b838801955050505b50505092915050565b6000613e48601c836144ef565b9150613e53826148d3565b601c82019050919050565b6000613e6b6026836144de565b9150613e76826148fc565b604082019050919050565b6000613e8e6002836144ef565b9150613e998261494b565b600282019050919050565b6000613eb16014836144de565b9150613ebc82614974565b602082019050919050565b6000613ed46013836144de565b9150613edf8261499d565b602082019050919050565b6000613ef7600e836144de565b9150613f02826149c6565b602082019050919050565b6000613f1a6005836144ef565b9150613f25826149ef565b600582019050919050565b6000613f3d6020836144de565b9150613f4882614a18565b602082019050919050565b6000613f606018836144de565b9150613f6b82614a41565b602082019050919050565b6000613f83602f836144de565b9150613f8e82614a6a565b604082019050919050565b6000613fa6601d836144de565b9150613fb182614ab9565b602082019050919050565b6000613fc96000836144d3565b9150613fd482614ae2565b600082019050919050565b6000613fec6010836144de565b9150613ff782614ae5565b602082019050919050565b600061400f6024836144de565b915061401a82614b0e565b604082019050919050565b60006140326013836144de565b915061403d82614b5d565b602082019050919050565b61405181614683565b82525050565b6140608161468d565b82525050565b60006140728285613dbc565b915061407e8284613d8b565b915061408982613f0d565b91508190509392505050565b60006140a082613e3b565b91506140ac8284613d02565b60208201915081905092915050565b60006140c682613e81565b91506140d28285613d02565b6020820191506140e28284613d02565b6020820191508190509392505050565b60006140fd82613fbc565b9150819050919050565b600060208201905061411c6000830184613cd5565b92915050565b60006080820190506141376000830187613cd5565b6141446020830186613cd5565b6141516040830185614048565b81810360608301526141638184613d19565b905095945050505050565b60006020820190506141836000830184613ce4565b92915050565b600060208201905061419e6000830184613cf3565b92915050565b60006060820190506141b96000830186613cf3565b6141c66020830185613cd5565b6141d36040830184614048565b949350505050565b600060a0820190506141f06000830188613cf3565b6141fd6020830187613cf3565b61420a6040830186613cf3565b6142176060830185614048565b6142246080830184613cd5565b9695505050505050565b60006080820190506142436000830187613cf3565b6142506020830186614057565b61425d6040830185613cf3565b61426a6060830184613cf3565b95945050505050565b6000602082019050818103600083015261428d8184613d52565b905092915050565b600060208201905081810360008301526142ae81613e5e565b9050919050565b600060208201905081810360008301526142ce81613ea4565b9050919050565b600060208201905081810360008301526142ee81613ec7565b9050919050565b6000602082019050818103600083015261430e81613eea565b9050919050565b6000602082019050818103600083015261432e81613f30565b9050919050565b6000602082019050818103600083015261434e81613f53565b9050919050565b6000602082019050818103600083015261436e81613f76565b9050919050565b6000602082019050818103600083015261438e81613f99565b9050919050565b600060208201905081810360008301526143ae81613fdf565b9050919050565b600060208201905081810360008301526143ce81614002565b9050919050565b600060208201905081810360008301526143ee81614025565b9050919050565b600060208201905061440a6000830184614048565b92915050565b600061441a61442b565b9050614426828261470e565b919050565b6000604051905090565b600067ffffffffffffffff8211156144505761444f61487f565b5b614459826148c2565b9050602081019050919050565b600067ffffffffffffffff8211156144815761448061487f565b5b61448a826148c2565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061450582614683565b915061451083614683565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614545576145446147c3565b5b828201905092915050565b600061455b82614683565b915061456683614683565b925082614576576145756147f2565b5b828204905092915050565b600061458c82614683565b915061459783614683565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156145d0576145cf6147c3565b5b828202905092915050565b60006145e682614683565b91506145f183614683565b925082821015614604576146036147c3565b5b828203905092915050565b600061461a82614663565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156146c75780820151818401526020810190506146ac565b838111156146d6576000848401525b50505050565b600060028204905060018216806146f457607f821691505b6020821081141561470857614707614821565b5b50919050565b614717826148c2565b810181811067ffffffffffffffff821117156147365761473561487f565b5b80604052505050565b600061474a82614683565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561477d5761477c6147c3565b5b600182019050919050565b6000819050919050565b600061479d82614683565b91506147a883614683565b9250826147b8576147b76147f2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f546f6f206d616e79207065722077616c6c657421000000000000000000000000600082015250565b7f4e6f206d6f726520476f626c696e20426f797300000000000000000000000000600082015250565b7f496e76616c6964207369676e6572000000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d696e74696e67206973206e6f74206c697665207965742e0000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e6f206d6f7265206672656520476f626c696e20426f797320666f7220686f6c60008201527f6465727300000000000000000000000000000000000000000000000000000000602082015250565b7f4d61782070657220545820726561636865642e00000000000000000000000000600082015250565b614b8f8161460f565b8114614b9a57600080fd5b50565b614ba681614621565b8114614bb157600080fd5b50565b614bbd8161462d565b8114614bc857600080fd5b50565b614bd481614637565b8114614bdf57600080fd5b50565b614beb81614683565b8114614bf657600080fd5b5056fea26469706673582212202fe6a5cb6ad4cc99f50d3e9c743df3522b1d0c555056e1fa4881a4c90010bf6664736f6c63430008070033
Deployed Bytecode Sourcemap
129:4373:15:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6016:410:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8629:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10173:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9750:362;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3779:102:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3248:278:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;391:41:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11104:164:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4836:1113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4215:78:15;;;;;;;;;;;;;:::i;:::-;;4299:201;;;;;;;;;;;;;:::i;:::-;;329:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11334:179:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;439:32:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3812:731:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;592:20:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3396:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;883:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8445:122:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;619:21:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3488:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3887:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;647:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6485:203:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1693:145:13;;;;;;;;;;;;;:::i;:::-;;4127:82:15;;;;;;;;;;;;;:::i;:::-;;1061:85:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1853:1010:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3683:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8791:102:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;253:34:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1030:817;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10476:294:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;478:35:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11579:332:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4001:120:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;772:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2981:409;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;562:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;215:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10836:206:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1987:240:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;520:35:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;294:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3579:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6016:410:6;6158:4;6212:25;6197:40;;;:11;:40;;;;:104;;;;6268:33;6253:48;;;:11;:48;;;;6197:104;:170;;;;6332:35;6317:50;;;:11;:50;;;;6197:170;:222;;;;6383:36;6407:11;6383:23;:36::i;:::-;6197:222;6178:241;;6016:410;;;:::o;8629:98::-;8683:13;8715:5;8708:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8629:98;:::o;10173:236::-;10273:7;10301:16;10309:7;10301;:16::i;:::-;10296:64;;10326:34;;;;;;;;;;;;;;10296:64;10378:15;:24;10394:7;10378:24;;;;;;;;;;;;;;;;;;;;;10371:31;;10173:236;;;:::o;9750:362::-;9822:13;9838:24;9854:7;9838:15;:24::i;:::-;9822:40;;9882:5;9876:11;;:2;:11;;;9872:48;;;9896:24;;;;;;;;;;;;;;9872:48;9951:5;9935:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;9961:37;9978:5;9985:12;:10;:12::i;:::-;9961:16;:37::i;:::-;9960:38;9935:63;9931:136;;;10021:35;;;;;;;;;;;;;;9931:136;10077:28;10086:2;10090:7;10099:5;10077:8;:28::i;:::-;9812:300;9750:362;;:::o;3779:102:15:-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3867:7:15::1;3851:13;:23;;;;3779:102:::0;:::o;3248:278:6:-;3309:7;3497:12;;3481:13;;:28;3474:35;;3248:278;:::o;391:41:15:-;;;;:::o;11104:164:6:-;11233:28;11243:4;11249:2;11253:7;11233:9;:28::i;:::-;11104:164;;;:::o;4836:1113::-;4957:7;4993:16;5003:5;4993:9;:16::i;:::-;4984:5;:25;4980:61;;5018:23;;;;;;;;;;;;;;4980:61;5051:22;5076:13;;5051:38;;5099:19;5128:25;5324:9;5319:543;5339:14;5335:1;:18;5319:543;;;5378:31;5412:11;:14;5424:1;5412:14;;;;;;;;;;;5378:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5448:9;:16;;;5444:71;;;5488:8;;;5444:71;5562:1;5536:28;;:9;:14;;;:28;;;5532:109;;5608:9;:14;;;5588:34;;5532:109;5683:5;5662:26;;:17;:26;;;5658:190;;;5731:5;5716:11;:20;5712:83;;;5771:1;5764:8;;;;;;;;;5712:83;5816:13;;;;;;;5658:190;5360:502;5319:543;5355:3;;;;;;;5319:543;;;;5934:8;;;4836:1113;;;;;:::o;4215:78:15:-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4278:8:15::1;;;;;;;;;;;4277:9;4266:8;;:20;;;;;;;;;;;;;;;;;;4215:78::o:0;4299:201::-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4349:12:15::1;4375:10;4367:24;;4412:21;4367:80;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4348:99;;;4465:7;4457:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;4338:162;4299:201::o:0;329:55::-;;;;:::o;11334:179:6:-;11467:39;11484:4;11490:2;11494:7;11467:39;;;;;;;;;;;;:16;:39::i;:::-;11334:179;;;:::o;439:32:15:-;;;;:::o;3812:731:6:-;3911:7;3934:22;3959:13;;3934:38;;3982:19;4172:9;4167:320;4187:14;4183:1;:18;4167:320;;;4226:31;4260:11;:14;4272:1;4260:14;;;;;;;;;;;4226:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4297:9;:16;;;4292:181;;4356:5;4341:11;:20;4337:83;;;4396:1;4389:8;;;;;;;;4337:83;4441:13;;;;;;;4292:181;4208:279;4203:3;;;;;;;4167:320;;;;4513:23;;;;;;;;;;;;;;3812:731;;;;:::o;592:20:15:-;;;;;;;;;;;;;:::o;3396:86::-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3472:3:15::1;3462:7;:13;;;;;;;;;;;;:::i;:::-;;3396:86:::0;:::o;883:22::-;;;;;;;;;;;;;:::o;8445:122:6:-;8509:7;8535:20;8547:7;8535:11;:20::i;:::-;:25;;;8528:32;;8445:122;;;:::o;619:21:15:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3488:85::-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3560:6:15::1;3550:7;;:16;;;;;;;;;;;;;;;;;;3488:85:::0;:::o;3887:108::-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3981:7:15::1;3962:16;:26;;;;3887:108:::0;:::o;647:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6485:203:6:-;6549:7;6589:1;6572:19;;:5;:19;;;6568:60;;;6600:28;;;;;;;;;;;;;;6568:60;6653:12;:19;6666:5;6653:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;6645:36;;6638:43;;6485:203;;;:::o;1693:145:13:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1799:1:::1;1762:40;;1783:6;;;;;;;;;;;1762:40;;;;;;;;;;;;1829:1;1812:6;;:19;;;;;;;;;;;;;;;;;;1693:145::o:0;4127:82:15:-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4191:11:15::1;;;;;;;;;;;4190:12;4176:11;;:26;;;;;;;;;;;;;;;;;;4127:82::o:0;1061:85:13:-;1107:7;1133:6;;;;;;;;;;;1126:13;;1061:85;:::o;1853:1010:15:-;1967:14;1992:7;1967:33;;;;2010:7;2037:3;2026:7;:14;;2010:31;;2133:33;;2092:22;;2073:16;;:41;;;;:::i;:::-;:93;2052:176;;;;;;;;;;;;:::i;:::-;;;;;;;;;2278:1;2266:9;;:13;;;;:::i;:::-;2262:1;2246:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:33;2238:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;2314:14;2440:211;2483:20;:18;:20::i;:::-;826:50;2592:10;2604:6;2560:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2525:108;;;;;;2440:21;:211::i;:::-;2354:311;;;;;;;;:::i;:::-;;;;;;;;;;;;;2331:344;;;;;;2314:361;;2723:7;;;;;;;;;;;2693:37;;:26;2703:6;2711:1;2714;2717;2693:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:37;;;2685:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;2779:22;;2759:16;;:42;;;;;;;:::i;:::-;;;;;;;;2811:45;2821:10;2833:22;;2811:9;:45::i;:::-;1957:906;;;1853:1010;;;:::o;3683:90::-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3757:9:15::1;3749:5;:17;;;;3683:90:::0;:::o;8791:102:6:-;8847:13;8879:7;8872:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8791:102;:::o;253:34:15:-;;;;:::o;1030:817::-;1084:12;1099:5;;1084:20;;1114:13;1183:16;;1164:3;1132:17;:29;1150:10;1132:29;;;;;;;;;;;;;;;;:35;;;;:::i;:::-;:67;;1131:98;;;;;1212:16;;1205:3;:23;;1131:98;1130:137;;;;1260:7;:5;:7::i;:::-;1246:21;;:10;:21;;;1130:137;1114:153;;1281:8;1277:47;;;1312:1;1305:8;;1277:47;1361:4;1355:3;:10;;;;:::i;:::-;1342:9;:23;;1334:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;1451:1;1439:9;;:13;;;;:::i;:::-;1433:3;1417:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:35;1409:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;1494:11;;;;;;;;;;;1486:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;1569:1;1558:8;;:12;;;;:::i;:::-;1552:3;:18;1544:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;1660:12;;1653:3;1625:25;1639:10;1625:13;:25::i;:::-;:31;;;;:::i;:::-;:47;;1604:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;1733:8;1729:75;;;1790:3;1757:17;:29;1775:10;1757:29;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;1729:75;1814:26;1824:10;1836:3;1814:9;:26::i;:::-;1074:773;;1030:817;:::o;10476:294:6:-;10598:12;:10;:12::i;:::-;10586:24;;:8;:24;;;10582:54;;;10619:17;;;;;;;;;;;;;;10582:54;10692:8;10647:18;:32;10666:12;:10;:12::i;:::-;10647:32;;;;;;;;;;;;;;;:42;10680:8;10647:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;10744:8;10715:48;;10730:12;:10;:12::i;:::-;10715:48;;;10754:8;10715:48;;;;;;:::i;:::-;;;;;;;;10476:294;;:::o;478:35:15:-;;;;:::o;11579:332:6:-;11740:28;11750:4;11756:2;11760:7;11740:9;:28::i;:::-;11783:48;11806:4;11812:2;11816:7;11825:5;11783:22;:48::i;:::-;11778:127;;11854:40;;;;;;;;;;;;;;11778:127;11579:332;;;;:::o;4001:120:15:-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4107:7:15::1;4082:22;:32;;;;4001:120:::0;:::o;772:104::-;826:50;772:104;:::o;2981:409::-;3094:13;3144:16;3152:7;3144;:16::i;:::-;3123:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;3262:8;;;;;;;;;;;:121;;3370:13;3262:121;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3313:7;3322:18;:7;:16;:18::i;:::-;3296:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3262:121;3243:140;;2981:409;;;:::o;562:23::-;;;;;;;;;;;;;:::o;215:31::-;;;;:::o;10836:206:6:-;10973:4;11000:18;:25;11019:5;11000:25;;;;;;;;;;;;;;;:35;11026:8;11000:35;;;;;;;;;;;;;;;;;;;;;;;;;10993:42;;10836:206;;;;:::o;1987:240:13:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2095:1:::1;2075:22;;:8;:22;;;;2067:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2184:8;2155:38;;2176:6;;;;;;;;;;;2155:38;;;;;;;;;;;;2212:8;2203:6;;:17;;;;;;;;;;;;;;;;;;1987:240:::0;:::o;520:35:15:-;;;;:::o;294:28::-;;;;:::o;3579:98::-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3667:3:15::1;3651:13;:19;;;;;;;;;;;;:::i;:::-;;3579:98:::0;:::o;1160:320:0:-;1220:4;1472:1;1450:7;:19;;;:23;1443:30;;1160:320;;;:::o;829:155:4:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;12157:142:6:-;12214:4;12247:13;;12237:7;:23;:55;;;;;12265:11;:20;12277:7;12265:20;;;;;;;;;;;:27;;;;;;;;;;;;12264:28;12237:55;12230:62;;12157:142;;;:::o;586:96:1:-;639:7;665:10;658:17;;586:96;:::o;19283:189:6:-;19420:2;19393:15;:24;19409:7;19393:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;19457:7;19453:2;19437:28;;19446:5;19437:28;;;;;;;;;;;;19283:189;;;:::o;14839:2092::-;14949:35;14987:20;14999:7;14987:11;:20::i;:::-;14949:58;;15018:22;15060:13;:18;;;15044:34;;:12;:10;:12::i;:::-;:34;;;:100;;;;15094:50;15111:13;:18;;;15131:12;:10;:12::i;:::-;15094:16;:50::i;:::-;15044:100;:152;;;;15184:12;:10;:12::i;:::-;15160:36;;:20;15172:7;15160:11;:20::i;:::-;:36;;;15044:152;15018:179;;15213:17;15208:66;;15239:35;;;;;;;;;;;;;;15208:66;15310:4;15288:26;;:13;:18;;;:26;;;15284:67;;15323:28;;;;;;;;;;;;;;15284:67;15379:1;15365:16;;:2;:16;;;15361:52;;;15390:23;;;;;;;;;;;;;;15361:52;15424:43;15446:4;15452:2;15456:7;15465:1;15424:21;:43::i;:::-;15529:49;15546:1;15550:7;15559:13;:18;;;15529:8;:49::i;:::-;15898:1;15868:12;:18;15881:4;15868:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15941:1;15913:12;:16;15926:2;15913:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15985:2;15957:11;:20;15969:7;15957:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;16046:15;16001:11;:20;16013:7;16001:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;16310:19;16342:1;16332:7;:11;16310:33;;16402:1;16361:43;;:11;:24;16373:11;16361:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;16357:463;;;16583:13;;16569:11;:27;16565:241;;;16652:13;:18;;;16620:11;:24;16632:11;16620:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;16734:13;:53;;;16692:11;:24;16704:11;16692:24;;;;;;;;;;;:39;;;:95;;;;;;;;;;;;;;;;;;16565:241;16357:463;15844:986;16864:7;16860:2;16845:27;;16854:4;16845:27;;;;;;;;;;;;16882:42;16903:4;16909:2;16913:7;16922:1;16882:20;:42::i;:::-;14939:1992;;14839:2092;;;:::o;7304:1084::-;7389:21;;:::i;:::-;7426:12;7441:7;7426:22;;7494:13;;7487:4;:20;7483:841;;;7527:31;7561:11;:17;7573:4;7561:17;;;;;;;;;;;7527:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7601:9;:16;;;7596:714;;7671:1;7645:28;;:9;:14;;;:28;;;7641:99;;7708:9;7701:16;;;;;;7641:99;8037:255;8044:4;8037:255;;;8076:6;;;;;;;;8120:11;:17;8132:4;8120:17;;;;;;;;;;;8108:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8193:1;8167:28;;:9;:14;;;:28;;;8163:107;;8234:9;8227:16;;;;;;8163:107;8037:255;;;7596:714;7509:815;7483:841;8350:31;;;;;;;;;;;;;;7304:1084;;;;:::o;1892:369:3:-;1945:7;1985:16;1968:13;:33;1964:291;;;2024:24;2017:31;;;;1964:291;2102:142;2145:10;2177:12;2211:15;2102:21;:142::i;:::-;2079:165;;1892:369;;:::o;4478:264:2:-;4595:7;4693:15;4710:10;4664:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4637:98;;;;;;4618:117;;4478:264;;;;:::o;12305:102:6:-;12373:27;12383:2;12387:8;12373:27;;;;;;;;;;;;:9;:27::i;:::-;12305:102;;:::o;6694:204::-;6755:7;6795:1;6778:19;;:5;:19;;;6774:59;;;6806:27;;;;;;;;;;;;;;6774:59;6858:12;:19;6871:5;6858:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;6850:41;;6843:48;;6694:204;;;:::o;20025:895::-;20175:4;20195:15;:2;:13;;;:15::i;:::-;20191:723;;;20262:2;20246:36;;;20304:12;:10;:12::i;:::-;20338:4;20364:7;20393:5;20246:170;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;20226:636;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20616:1;20599:6;:13;:18;20595:253;;;20648:40;;;;;;;;;;;;;;20595:253;20800:6;20794:13;20785:6;20781:2;20777:15;20770:38;20226:636;20488:45;;;20478:55;;;:6;:55;;;;20471:62;;;;;20191:723;20899:4;20892:11;;20025:895;;;;;;;:::o;328:703:14:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;21551:154:6:-;;;;;:::o;22346:153::-;;;;;:::o;2267:417:3:-;2407:7;2504:8;2534;2564:11;2597:13;2640:4;2472:191;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2445:232;;;;;;2426:251;;2267:417;;;;;:::o;12758:157:6:-;12876:32;12882:2;12886:8;12896:5;12903:4;12876:5;:32::i;:::-;12758:157;;;:::o;13162:1435::-;13295:20;13318:13;;13295:36;;13359:1;13345:16;;:2;:16;;;13341:48;;;13370:19;;;;;;;;;;;;;;13341:48;13415:1;13403:8;:13;13399:44;;;13425:18;;;;;;;;;;;;;;13399:44;13454:61;13484:1;13488:2;13492:12;13506:8;13454:21;:61::i;:::-;13821:8;13786:12;:16;13799:2;13786:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13884:8;13844:12;:16;13857:2;13844:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13941:2;13908:11;:25;13920:12;13908:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;14007:15;13957:11;:25;13969:12;13957:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;14038:20;14061:12;14038:35;;14093:9;14088:380;14108:8;14104:1;:12;14088:380;;;14171:12;14167:2;14146:38;;14163:1;14146:38;;;;;;;;;;;;14227:4;:88;;;;;14256:59;14287:1;14291:2;14295:12;14309:5;14256:22;:59::i;:::-;14255:60;14227:88;14202:220;;;14363:40;;;;;;;;;;;;;;14202:220;14439:14;;;;;;;14118:3;;;;;;;14088:380;;;;14498:12;14482:13;:28;;;;13762:759;14530:60;14559:1;14563:2;14567:12;14581:8;14530:20;:60::i;:::-;13285:1312;13162:1435;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:16:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:139::-;1171:5;1209:6;1196:20;1187:29;;1225:33;1252:5;1225:33;:::i;:::-;1125:139;;;;:::o;1270:137::-;1315:5;1353:6;1340:20;1331:29;;1369:32;1395:5;1369:32;:::i;:::-;1270:137;;;;:::o;1413:141::-;1469:5;1500:6;1494:13;1485:22;;1516:32;1542:5;1516:32;:::i;:::-;1413:141;;;;:::o;1573:338::-;1628:5;1677:3;1670:4;1662:6;1658:17;1654:27;1644:122;;1685:79;;:::i;:::-;1644:122;1802:6;1789:20;1827:78;1901:3;1893:6;1886:4;1878:6;1874:17;1827:78;:::i;:::-;1818:87;;1634:277;1573:338;;;;:::o;1931:340::-;1987:5;2036:3;2029:4;2021:6;2017:17;2013:27;2003:122;;2044:79;;:::i;:::-;2003:122;2161:6;2148:20;2186:79;2261:3;2253:6;2246:4;2238:6;2234:17;2186:79;:::i;:::-;2177:88;;1993:278;1931:340;;;;:::o;2277:139::-;2323:5;2361:6;2348:20;2339:29;;2377:33;2404:5;2377:33;:::i;:::-;2277:139;;;;:::o;2422:329::-;2481:6;2530:2;2518:9;2509:7;2505:23;2501:32;2498:119;;;2536:79;;:::i;:::-;2498:119;2656:1;2681:53;2726:7;2717:6;2706:9;2702:22;2681:53;:::i;:::-;2671:63;;2627:117;2422:329;;;;:::o;2757:474::-;2825:6;2833;2882:2;2870:9;2861:7;2857:23;2853:32;2850:119;;;2888:79;;:::i;:::-;2850:119;3008:1;3033:53;3078:7;3069:6;3058:9;3054:22;3033:53;:::i;:::-;3023:63;;2979:117;3135:2;3161:53;3206:7;3197:6;3186:9;3182:22;3161:53;:::i;:::-;3151:63;;3106:118;2757:474;;;;;:::o;3237:619::-;3314:6;3322;3330;3379:2;3367:9;3358:7;3354:23;3350:32;3347:119;;;3385:79;;:::i;:::-;3347:119;3505:1;3530:53;3575:7;3566:6;3555:9;3551:22;3530:53;:::i;:::-;3520:63;;3476:117;3632:2;3658:53;3703:7;3694:6;3683:9;3679:22;3658:53;:::i;:::-;3648:63;;3603:118;3760:2;3786:53;3831:7;3822:6;3811:9;3807:22;3786:53;:::i;:::-;3776:63;;3731:118;3237:619;;;;;:::o;3862:943::-;3957:6;3965;3973;3981;4030:3;4018:9;4009:7;4005:23;4001:33;3998:120;;;4037:79;;:::i;:::-;3998:120;4157:1;4182:53;4227:7;4218:6;4207:9;4203:22;4182:53;:::i;:::-;4172:63;;4128:117;4284:2;4310:53;4355:7;4346:6;4335:9;4331:22;4310:53;:::i;:::-;4300:63;;4255:118;4412:2;4438:53;4483:7;4474:6;4463:9;4459:22;4438:53;:::i;:::-;4428:63;;4383:118;4568:2;4557:9;4553:18;4540:32;4599:18;4591:6;4588:30;4585:117;;;4621:79;;:::i;:::-;4585:117;4726:62;4780:7;4771:6;4760:9;4756:22;4726:62;:::i;:::-;4716:72;;4511:287;3862:943;;;;;;;:::o;4811:468::-;4876:6;4884;4933:2;4921:9;4912:7;4908:23;4904:32;4901:119;;;4939:79;;:::i;:::-;4901:119;5059:1;5084:53;5129:7;5120:6;5109:9;5105:22;5084:53;:::i;:::-;5074:63;;5030:117;5186:2;5212:50;5254:7;5245:6;5234:9;5230:22;5212:50;:::i;:::-;5202:60;;5157:115;4811:468;;;;;:::o;5285:474::-;5353:6;5361;5410:2;5398:9;5389:7;5385:23;5381:32;5378:119;;;5416:79;;:::i;:::-;5378:119;5536:1;5561:53;5606:7;5597:6;5586:9;5582:22;5561:53;:::i;:::-;5551:63;;5507:117;5663:2;5689:53;5734:7;5725:6;5714:9;5710:22;5689:53;:::i;:::-;5679:63;;5634:118;5285:474;;;;;:::o;5765:327::-;5823:6;5872:2;5860:9;5851:7;5847:23;5843:32;5840:119;;;5878:79;;:::i;:::-;5840:119;5998:1;6023:52;6067:7;6058:6;6047:9;6043:22;6023:52;:::i;:::-;6013:62;;5969:116;5765:327;;;;:::o;6098:349::-;6167:6;6216:2;6204:9;6195:7;6191:23;6187:32;6184:119;;;6222:79;;:::i;:::-;6184:119;6342:1;6367:63;6422:7;6413:6;6402:9;6398:22;6367:63;:::i;:::-;6357:73;;6313:127;6098:349;;;;:::o;6453:509::-;6522:6;6571:2;6559:9;6550:7;6546:23;6542:32;6539:119;;;6577:79;;:::i;:::-;6539:119;6725:1;6714:9;6710:17;6697:31;6755:18;6747:6;6744:30;6741:117;;;6777:79;;:::i;:::-;6741:117;6882:63;6937:7;6928:6;6917:9;6913:22;6882:63;:::i;:::-;6872:73;;6668:287;6453:509;;;;:::o;6968:329::-;7027:6;7076:2;7064:9;7055:7;7051:23;7047:32;7044:119;;;7082:79;;:::i;:::-;7044:119;7202:1;7227:53;7272:7;7263:6;7252:9;7248:22;7227:53;:::i;:::-;7217:63;;7173:117;6968:329;;;;:::o;7303:619::-;7380:6;7388;7396;7445:2;7433:9;7424:7;7420:23;7416:32;7413:119;;;7451:79;;:::i;:::-;7413:119;7571:1;7596:53;7641:7;7632:6;7621:9;7617:22;7596:53;:::i;:::-;7586:63;;7542:117;7698:2;7724:53;7769:7;7760:6;7749:9;7745:22;7724:53;:::i;:::-;7714:63;;7669:118;7826:2;7852:53;7897:7;7888:6;7877:9;7873:22;7852:53;:::i;:::-;7842:63;;7797:118;7303:619;;;;;:::o;7928:118::-;8015:24;8033:5;8015:24;:::i;:::-;8010:3;8003:37;7928:118;;:::o;8052:109::-;8133:21;8148:5;8133:21;:::i;:::-;8128:3;8121:34;8052:109;;:::o;8167:118::-;8254:24;8272:5;8254:24;:::i;:::-;8249:3;8242:37;8167:118;;:::o;8291:157::-;8396:45;8416:24;8434:5;8416:24;:::i;:::-;8396:45;:::i;:::-;8391:3;8384:58;8291:157;;:::o;8454:360::-;8540:3;8568:38;8600:5;8568:38;:::i;:::-;8622:70;8685:6;8680:3;8622:70;:::i;:::-;8615:77;;8701:52;8746:6;8741:3;8734:4;8727:5;8723:16;8701:52;:::i;:::-;8778:29;8800:6;8778:29;:::i;:::-;8773:3;8769:39;8762:46;;8544:270;8454:360;;;;:::o;8820:364::-;8908:3;8936:39;8969:5;8936:39;:::i;:::-;8991:71;9055:6;9050:3;8991:71;:::i;:::-;8984:78;;9071:52;9116:6;9111:3;9104:4;9097:5;9093:16;9071:52;:::i;:::-;9148:29;9170:6;9148:29;:::i;:::-;9143:3;9139:39;9132:46;;8912:272;8820:364;;;;:::o;9190:377::-;9296:3;9324:39;9357:5;9324:39;:::i;:::-;9379:89;9461:6;9456:3;9379:89;:::i;:::-;9372:96;;9477:52;9522:6;9517:3;9510:4;9503:5;9499:16;9477:52;:::i;:::-;9554:6;9549:3;9545:16;9538:23;;9300:267;9190:377;;;;:::o;9597:845::-;9700:3;9737:5;9731:12;9766:36;9792:9;9766:36;:::i;:::-;9818:89;9900:6;9895:3;9818:89;:::i;:::-;9811:96;;9938:1;9927:9;9923:17;9954:1;9949:137;;;;10100:1;10095:341;;;;9916:520;;9949:137;10033:4;10029:9;10018;10014:25;10009:3;10002:38;10069:6;10064:3;10060:16;10053:23;;9949:137;;10095:341;10162:38;10194:5;10162:38;:::i;:::-;10222:1;10236:154;10250:6;10247:1;10244:13;10236:154;;;10324:7;10318:14;10314:1;10309:3;10305:11;10298:35;10374:1;10365:7;10361:15;10350:26;;10272:4;10269:1;10265:12;10260:17;;10236:154;;;10419:6;10414:3;10410:16;10403:23;;10102:334;;9916:520;;9704:738;;9597:845;;;;:::o;10448:402::-;10608:3;10629:85;10711:2;10706:3;10629:85;:::i;:::-;10622:92;;10723:93;10812:3;10723:93;:::i;:::-;10841:2;10836:3;10832:12;10825:19;;10448:402;;;:::o;10856:366::-;10998:3;11019:67;11083:2;11078:3;11019:67;:::i;:::-;11012:74;;11095:93;11184:3;11095:93;:::i;:::-;11213:2;11208:3;11204:12;11197:19;;10856:366;;;:::o;11228:400::-;11388:3;11409:84;11491:1;11486:3;11409:84;:::i;:::-;11402:91;;11502:93;11591:3;11502:93;:::i;:::-;11620:1;11615:3;11611:11;11604:18;;11228:400;;;:::o;11634:366::-;11776:3;11797:67;11861:2;11856:3;11797:67;:::i;:::-;11790:74;;11873:93;11962:3;11873:93;:::i;:::-;11991:2;11986:3;11982:12;11975:19;;11634:366;;;:::o;12006:::-;12148:3;12169:67;12233:2;12228:3;12169:67;:::i;:::-;12162:74;;12245:93;12334:3;12245:93;:::i;:::-;12363:2;12358:3;12354:12;12347:19;;12006:366;;;:::o;12378:::-;12520:3;12541:67;12605:2;12600:3;12541:67;:::i;:::-;12534:74;;12617:93;12706:3;12617:93;:::i;:::-;12735:2;12730:3;12726:12;12719:19;;12378:366;;;:::o;12750:400::-;12910:3;12931:84;13013:1;13008:3;12931:84;:::i;:::-;12924:91;;13024:93;13113:3;13024:93;:::i;:::-;13142:1;13137:3;13133:11;13126:18;;12750:400;;;:::o;13156:366::-;13298:3;13319:67;13383:2;13378:3;13319:67;:::i;:::-;13312:74;;13395:93;13484:3;13395:93;:::i;:::-;13513:2;13508:3;13504:12;13497:19;;13156:366;;;:::o;13528:::-;13670:3;13691:67;13755:2;13750:3;13691:67;:::i;:::-;13684:74;;13767:93;13856:3;13767:93;:::i;:::-;13885:2;13880:3;13876:12;13869:19;;13528:366;;;:::o;13900:::-;14042:3;14063:67;14127:2;14122:3;14063:67;:::i;:::-;14056:74;;14139:93;14228:3;14139:93;:::i;:::-;14257:2;14252:3;14248:12;14241:19;;13900:366;;;:::o;14272:::-;14414:3;14435:67;14499:2;14494:3;14435:67;:::i;:::-;14428:74;;14511:93;14600:3;14511:93;:::i;:::-;14629:2;14624:3;14620:12;14613:19;;14272:366;;;:::o;14644:398::-;14803:3;14824:83;14905:1;14900:3;14824:83;:::i;:::-;14817:90;;14916:93;15005:3;14916:93;:::i;:::-;15034:1;15029:3;15025:11;15018:18;;14644:398;;;:::o;15048:366::-;15190:3;15211:67;15275:2;15270:3;15211:67;:::i;:::-;15204:74;;15287:93;15376:3;15287:93;:::i;:::-;15405:2;15400:3;15396:12;15389:19;;15048:366;;;:::o;15420:::-;15562:3;15583:67;15647:2;15642:3;15583:67;:::i;:::-;15576:74;;15659:93;15748:3;15659:93;:::i;:::-;15777:2;15772:3;15768:12;15761:19;;15420:366;;;:::o;15792:::-;15934:3;15955:67;16019:2;16014:3;15955:67;:::i;:::-;15948:74;;16031:93;16120:3;16031:93;:::i;:::-;16149:2;16144:3;16140:12;16133:19;;15792:366;;;:::o;16164:118::-;16251:24;16269:5;16251:24;:::i;:::-;16246:3;16239:37;16164:118;;:::o;16288:112::-;16371:22;16387:5;16371:22;:::i;:::-;16366:3;16359:35;16288:112;;:::o;16406:695::-;16684:3;16706:92;16794:3;16785:6;16706:92;:::i;:::-;16699:99;;16815:95;16906:3;16897:6;16815:95;:::i;:::-;16808:102;;16927:148;17071:3;16927:148;:::i;:::-;16920:155;;17092:3;17085:10;;16406:695;;;;;:::o;17107:522::-;17320:3;17342:148;17486:3;17342:148;:::i;:::-;17335:155;;17500:75;17571:3;17562:6;17500:75;:::i;:::-;17600:2;17595:3;17591:12;17584:19;;17620:3;17613:10;;17107:522;;;;:::o;17635:663::-;17876:3;17898:148;18042:3;17898:148;:::i;:::-;17891:155;;18056:75;18127:3;18118:6;18056:75;:::i;:::-;18156:2;18151:3;18147:12;18140:19;;18169:75;18240:3;18231:6;18169:75;:::i;:::-;18269:2;18264:3;18260:12;18253:19;;18289:3;18282:10;;17635:663;;;;;:::o;18304:379::-;18488:3;18510:147;18653:3;18510:147;:::i;:::-;18503:154;;18674:3;18667:10;;18304:379;;;:::o;18689:222::-;18782:4;18820:2;18809:9;18805:18;18797:26;;18833:71;18901:1;18890:9;18886:17;18877:6;18833:71;:::i;:::-;18689:222;;;;:::o;18917:640::-;19112:4;19150:3;19139:9;19135:19;19127:27;;19164:71;19232:1;19221:9;19217:17;19208:6;19164:71;:::i;:::-;19245:72;19313:2;19302:9;19298:18;19289:6;19245:72;:::i;:::-;19327;19395:2;19384:9;19380:18;19371:6;19327:72;:::i;:::-;19446:9;19440:4;19436:20;19431:2;19420:9;19416:18;19409:48;19474:76;19545:4;19536:6;19474:76;:::i;:::-;19466:84;;18917:640;;;;;;;:::o;19563:210::-;19650:4;19688:2;19677:9;19673:18;19665:26;;19701:65;19763:1;19752:9;19748:17;19739:6;19701:65;:::i;:::-;19563:210;;;;:::o;19779:222::-;19872:4;19910:2;19899:9;19895:18;19887:26;;19923:71;19991:1;19980:9;19976:17;19967:6;19923:71;:::i;:::-;19779:222;;;;:::o;20007:442::-;20156:4;20194:2;20183:9;20179:18;20171:26;;20207:71;20275:1;20264:9;20260:17;20251:6;20207:71;:::i;:::-;20288:72;20356:2;20345:9;20341:18;20332:6;20288:72;:::i;:::-;20370;20438:2;20427:9;20423:18;20414:6;20370:72;:::i;:::-;20007:442;;;;;;:::o;20455:664::-;20660:4;20698:3;20687:9;20683:19;20675:27;;20712:71;20780:1;20769:9;20765:17;20756:6;20712:71;:::i;:::-;20793:72;20861:2;20850:9;20846:18;20837:6;20793:72;:::i;:::-;20875;20943:2;20932:9;20928:18;20919:6;20875:72;:::i;:::-;20957;21025:2;21014:9;21010:18;21001:6;20957:72;:::i;:::-;21039:73;21107:3;21096:9;21092:19;21083:6;21039:73;:::i;:::-;20455:664;;;;;;;;:::o;21125:545::-;21298:4;21336:3;21325:9;21321:19;21313:27;;21350:71;21418:1;21407:9;21403:17;21394:6;21350:71;:::i;:::-;21431:68;21495:2;21484:9;21480:18;21471:6;21431:68;:::i;:::-;21509:72;21577:2;21566:9;21562:18;21553:6;21509:72;:::i;:::-;21591;21659:2;21648:9;21644:18;21635:6;21591:72;:::i;:::-;21125:545;;;;;;;:::o;21676:313::-;21789:4;21827:2;21816:9;21812:18;21804:26;;21876:9;21870:4;21866:20;21862:1;21851:9;21847:17;21840:47;21904:78;21977:4;21968:6;21904:78;:::i;:::-;21896:86;;21676:313;;;;:::o;21995:419::-;22161:4;22199:2;22188:9;22184:18;22176:26;;22248:9;22242:4;22238:20;22234:1;22223:9;22219:17;22212:47;22276:131;22402:4;22276:131;:::i;:::-;22268:139;;21995:419;;;:::o;22420:::-;22586:4;22624:2;22613:9;22609:18;22601:26;;22673:9;22667:4;22663:20;22659:1;22648:9;22644:17;22637:47;22701:131;22827:4;22701:131;:::i;:::-;22693:139;;22420:419;;;:::o;22845:::-;23011:4;23049:2;23038:9;23034:18;23026:26;;23098:9;23092:4;23088:20;23084:1;23073:9;23069:17;23062:47;23126:131;23252:4;23126:131;:::i;:::-;23118:139;;22845:419;;;:::o;23270:::-;23436:4;23474:2;23463:9;23459:18;23451:26;;23523:9;23517:4;23513:20;23509:1;23498:9;23494:17;23487:47;23551:131;23677:4;23551:131;:::i;:::-;23543:139;;23270:419;;;:::o;23695:::-;23861:4;23899:2;23888:9;23884:18;23876:26;;23948:9;23942:4;23938:20;23934:1;23923:9;23919:17;23912:47;23976:131;24102:4;23976:131;:::i;:::-;23968:139;;23695:419;;;:::o;24120:::-;24286:4;24324:2;24313:9;24309:18;24301:26;;24373:9;24367:4;24363:20;24359:1;24348:9;24344:17;24337:47;24401:131;24527:4;24401:131;:::i;:::-;24393:139;;24120:419;;;:::o;24545:::-;24711:4;24749:2;24738:9;24734:18;24726:26;;24798:9;24792:4;24788:20;24784:1;24773:9;24769:17;24762:47;24826:131;24952:4;24826:131;:::i;:::-;24818:139;;24545:419;;;:::o;24970:::-;25136:4;25174:2;25163:9;25159:18;25151:26;;25223:9;25217:4;25213:20;25209:1;25198:9;25194:17;25187:47;25251:131;25377:4;25251:131;:::i;:::-;25243:139;;24970:419;;;:::o;25395:::-;25561:4;25599:2;25588:9;25584:18;25576:26;;25648:9;25642:4;25638:20;25634:1;25623:9;25619:17;25612:47;25676:131;25802:4;25676:131;:::i;:::-;25668:139;;25395:419;;;:::o;25820:::-;25986:4;26024:2;26013:9;26009:18;26001:26;;26073:9;26067:4;26063:20;26059:1;26048:9;26044:17;26037:47;26101:131;26227:4;26101:131;:::i;:::-;26093:139;;25820:419;;;:::o;26245:::-;26411:4;26449:2;26438:9;26434:18;26426:26;;26498:9;26492:4;26488:20;26484:1;26473:9;26469:17;26462:47;26526:131;26652:4;26526:131;:::i;:::-;26518:139;;26245:419;;;:::o;26670:222::-;26763:4;26801:2;26790:9;26786:18;26778:26;;26814:71;26882:1;26871:9;26867:17;26858:6;26814:71;:::i;:::-;26670:222;;;;:::o;26898:129::-;26932:6;26959:20;;:::i;:::-;26949:30;;26988:33;27016:4;27008:6;26988:33;:::i;:::-;26898:129;;;:::o;27033:75::-;27066:6;27099:2;27093:9;27083:19;;27033:75;:::o;27114:307::-;27175:4;27265:18;27257:6;27254:30;27251:56;;;27287:18;;:::i;:::-;27251:56;27325:29;27347:6;27325:29;:::i;:::-;27317:37;;27409:4;27403;27399:15;27391:23;;27114:307;;;:::o;27427:308::-;27489:4;27579:18;27571:6;27568:30;27565:56;;;27601:18;;:::i;:::-;27565:56;27639:29;27661:6;27639:29;:::i;:::-;27631:37;;27723:4;27717;27713:15;27705:23;;27427:308;;;:::o;27741:141::-;27790:4;27813:3;27805:11;;27836:3;27833:1;27826:14;27870:4;27867:1;27857:18;27849:26;;27741:141;;;:::o;27888:98::-;27939:6;27973:5;27967:12;27957:22;;27888:98;;;:::o;27992:99::-;28044:6;28078:5;28072:12;28062:22;;27992:99;;;:::o;28097:168::-;28180:11;28214:6;28209:3;28202:19;28254:4;28249:3;28245:14;28230:29;;28097:168;;;;:::o;28271:147::-;28372:11;28409:3;28394:18;;28271:147;;;;:::o;28424:169::-;28508:11;28542:6;28537:3;28530:19;28582:4;28577:3;28573:14;28558:29;;28424:169;;;;:::o;28599:148::-;28701:11;28738:3;28723:18;;28599:148;;;;:::o;28753:305::-;28793:3;28812:20;28830:1;28812:20;:::i;:::-;28807:25;;28846:20;28864:1;28846:20;:::i;:::-;28841:25;;29000:1;28932:66;28928:74;28925:1;28922:81;28919:107;;;29006:18;;:::i;:::-;28919:107;29050:1;29047;29043:9;29036:16;;28753:305;;;;:::o;29064:185::-;29104:1;29121:20;29139:1;29121:20;:::i;:::-;29116:25;;29155:20;29173:1;29155:20;:::i;:::-;29150:25;;29194:1;29184:35;;29199:18;;:::i;:::-;29184:35;29241:1;29238;29234:9;29229:14;;29064:185;;;;:::o;29255:348::-;29295:7;29318:20;29336:1;29318:20;:::i;:::-;29313:25;;29352:20;29370:1;29352:20;:::i;:::-;29347:25;;29540:1;29472:66;29468:74;29465:1;29462:81;29457:1;29450:9;29443:17;29439:105;29436:131;;;29547:18;;:::i;:::-;29436:131;29595:1;29592;29588:9;29577:20;;29255:348;;;;:::o;29609:191::-;29649:4;29669:20;29687:1;29669:20;:::i;:::-;29664:25;;29703:20;29721:1;29703:20;:::i;:::-;29698:25;;29742:1;29739;29736:8;29733:34;;;29747:18;;:::i;:::-;29733:34;29792:1;29789;29785:9;29777:17;;29609:191;;;;:::o;29806:96::-;29843:7;29872:24;29890:5;29872:24;:::i;:::-;29861:35;;29806:96;;;:::o;29908:90::-;29942:7;29985:5;29978:13;29971:21;29960:32;;29908:90;;;:::o;30004:77::-;30041:7;30070:5;30059:16;;30004:77;;;:::o;30087:149::-;30123:7;30163:66;30156:5;30152:78;30141:89;;30087:149;;;:::o;30242:126::-;30279:7;30319:42;30312:5;30308:54;30297:65;;30242:126;;;:::o;30374:77::-;30411:7;30440:5;30429:16;;30374:77;;;:::o;30457:86::-;30492:7;30532:4;30525:5;30521:16;30510:27;;30457:86;;;:::o;30549:154::-;30633:6;30628:3;30623;30610:30;30695:1;30686:6;30681:3;30677:16;30670:27;30549:154;;;:::o;30709:307::-;30777:1;30787:113;30801:6;30798:1;30795:13;30787:113;;;30886:1;30881:3;30877:11;30871:18;30867:1;30862:3;30858:11;30851:39;30823:2;30820:1;30816:10;30811:15;;30787:113;;;30918:6;30915:1;30912:13;30909:101;;;30998:1;30989:6;30984:3;30980:16;30973:27;30909:101;30758:258;30709:307;;;:::o;31022:320::-;31066:6;31103:1;31097:4;31093:12;31083:22;;31150:1;31144:4;31140:12;31171:18;31161:81;;31227:4;31219:6;31215:17;31205:27;;31161:81;31289:2;31281:6;31278:14;31258:18;31255:38;31252:84;;;31308:18;;:::i;:::-;31252:84;31073:269;31022:320;;;:::o;31348:281::-;31431:27;31453:4;31431:27;:::i;:::-;31423:6;31419:40;31561:6;31549:10;31546:22;31525:18;31513:10;31510:34;31507:62;31504:88;;;31572:18;;:::i;:::-;31504:88;31612:10;31608:2;31601:22;31391:238;31348:281;;:::o;31635:233::-;31674:3;31697:24;31715:5;31697:24;:::i;:::-;31688:33;;31743:66;31736:5;31733:77;31730:103;;;31813:18;;:::i;:::-;31730:103;31860:1;31853:5;31849:13;31842:20;;31635:233;;;:::o;31874:79::-;31913:7;31942:5;31931:16;;31874:79;;;:::o;31959:176::-;31991:1;32008:20;32026:1;32008:20;:::i;:::-;32003:25;;32042:20;32060:1;32042:20;:::i;:::-;32037:25;;32081:1;32071:35;;32086:18;;:::i;:::-;32071:35;32127:1;32124;32120:9;32115:14;;31959:176;;;;:::o;32141:180::-;32189:77;32186:1;32179:88;32286:4;32283:1;32276:15;32310:4;32307:1;32300:15;32327:180;32375:77;32372:1;32365:88;32472:4;32469:1;32462:15;32496:4;32493:1;32486:15;32513:180;32561:77;32558:1;32551:88;32658:4;32655:1;32648:15;32682:4;32679:1;32672:15;32699:180;32747:77;32744:1;32737:88;32844:4;32841:1;32834:15;32868:4;32865:1;32858:15;32885:180;32933:77;32930:1;32923:88;33030:4;33027:1;33020:15;33054:4;33051:1;33044:15;33071:117;33180:1;33177;33170:12;33194:117;33303:1;33300;33293:12;33317:117;33426:1;33423;33416:12;33440:117;33549:1;33546;33539:12;33563:102;33604:6;33655:2;33651:7;33646:2;33639:5;33635:14;33631:28;33621:38;;33563:102;;;:::o;33671:214::-;33811:66;33807:1;33799:6;33795:14;33788:90;33671:214;:::o;33891:225::-;34031:34;34027:1;34019:6;34015:14;34008:58;34100:8;34095:2;34087:6;34083:15;34076:33;33891:225;:::o;34122:214::-;34262:66;34258:1;34250:6;34246:14;34239:90;34122:214;:::o;34342:170::-;34482:22;34478:1;34470:6;34466:14;34459:46;34342:170;:::o;34518:169::-;34658:21;34654:1;34646:6;34642:14;34635:45;34518:169;:::o;34693:164::-;34833:16;34829:1;34821:6;34817:14;34810:40;34693:164;:::o;34863:155::-;35003:7;34999:1;34991:6;34987:14;34980:31;34863:155;:::o;35024:182::-;35164:34;35160:1;35152:6;35148:14;35141:58;35024:182;:::o;35212:174::-;35352:26;35348:1;35340:6;35336:14;35329:50;35212:174;:::o;35392:234::-;35532:34;35528:1;35520:6;35516:14;35509:58;35601:17;35596:2;35588:6;35584:15;35577:42;35392:234;:::o;35632:179::-;35772:31;35768:1;35760:6;35756:14;35749:55;35632:179;:::o;35817:114::-;;:::o;35937:166::-;36077:18;36073:1;36065:6;36061:14;36054:42;35937:166;:::o;36109:223::-;36249:34;36245:1;36237:6;36233:14;36226:58;36318:6;36313:2;36305:6;36301:15;36294:31;36109:223;:::o;36338:169::-;36478:21;36474:1;36466:6;36462:14;36455:45;36338:169;:::o;36513:122::-;36586:24;36604:5;36586:24;:::i;:::-;36579:5;36576:35;36566:63;;36625:1;36622;36615:12;36566:63;36513:122;:::o;36641:116::-;36711:21;36726:5;36711:21;:::i;:::-;36704:5;36701:32;36691:60;;36747:1;36744;36737:12;36691:60;36641:116;:::o;36763:122::-;36836:24;36854:5;36836:24;:::i;:::-;36829:5;36826:35;36816:63;;36875:1;36872;36865:12;36816:63;36763:122;:::o;36891:120::-;36963:23;36980:5;36963:23;:::i;:::-;36956:5;36953:34;36943:62;;37001:1;36998;36991:12;36943:62;36891:120;:::o;37017:122::-;37090:24;37108:5;37090:24;:::i;:::-;37083:5;37080:35;37070:63;;37129:1;37126;37119:12;37070:63;37017:122;:::o
Swarm Source
ipfs://2fe6a5cb6ad4cc99f50d3e9c743df3522b1d0c555056e1fa4881a4c90010bf66
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.