More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 97 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer From | 19261574 | 256 days ago | IN | 0 ETH | 0.00198249 | ||||
Safe Transfer Fr... | 17394304 | 517 days ago | IN | 0 ETH | 0.00321269 | ||||
Transfer Ownersh... | 17288961 | 532 days ago | IN | 0 ETH | 0.00122149 | ||||
Mint | 17123615 | 556 days ago | IN | 5 ETH | 0.00452389 | ||||
Safe Transfer Fr... | 16919292 | 585 days ago | IN | 0 ETH | 0.00434951 | ||||
Mint | 16798532 | 602 days ago | IN | 1 ETH | 0.00342191 | ||||
Mint | 16621480 | 626 days ago | IN | 1 ETH | 0.00359118 | ||||
Safe Transfer Fr... | 16543582 | 637 days ago | IN | 0 ETH | 0.00205472 | ||||
Mint | 16543204 | 637 days ago | IN | 1 ETH | 0.00414912 | ||||
Safe Transfer Fr... | 16500056 | 643 days ago | IN | 0 ETH | 0.00154745 | ||||
Mint | 16499672 | 643 days ago | IN | 1 ETH | 0.00343792 | ||||
Safe Transfer Fr... | 16498922 | 644 days ago | IN | 0 ETH | 0.00188006 | ||||
Safe Transfer Fr... | 16498911 | 644 days ago | IN | 0 ETH | 0.00258532 | ||||
Mint | 16498899 | 644 days ago | IN | 2 ETH | 0.00225217 | ||||
Safe Transfer Fr... | 16498709 | 644 days ago | IN | 0 ETH | 0.00154822 | ||||
Mint | 16494990 | 644 days ago | IN | 1 ETH | 0.00204031 | ||||
Safe Transfer Fr... | 16449947 | 650 days ago | IN | 0 ETH | 0.00202396 | ||||
Mint | 16449931 | 650 days ago | IN | 1 ETH | 0.0029885 | ||||
Safe Transfer Fr... | 16428023 | 653 days ago | IN | 0 ETH | 0.00215167 | ||||
Safe Transfer Fr... | 16420702 | 654 days ago | IN | 0 ETH | 0.0016128 | ||||
Mint | 16270945 | 675 days ago | IN | 1 ETH | 0.00205038 | ||||
Transfer From | 16267874 | 676 days ago | IN | 0 ETH | 0.00080385 | ||||
Safe Transfer Fr... | 16190587 | 687 days ago | IN | 0 ETH | 0.00168413 | ||||
Safe Transfer Fr... | 16020792 | 710 days ago | IN | 0 ETH | 0.00097704 | ||||
Mint | 15992438 | 714 days ago | IN | 1 ETH | 0.00204545 |
Latest 17 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
17123615 | 556 days ago | 5 ETH | ||||
16798532 | 602 days ago | 1 ETH | ||||
16621480 | 626 days ago | 1 ETH | ||||
16543204 | 637 days ago | 1 ETH | ||||
16499672 | 643 days ago | 1 ETH | ||||
16498899 | 644 days ago | 2 ETH | ||||
16494990 | 644 days ago | 1 ETH | ||||
16449931 | 650 days ago | 1 ETH | ||||
16270945 | 675 days ago | 1 ETH | ||||
15992438 | 714 days ago | 1 ETH | ||||
15990633 | 715 days ago | 1 ETH | ||||
15969534 | 717 days ago | 1 ETH | ||||
15842781 | 735 days ago | 1 ETH | ||||
15167257 | 837 days ago | 1 ETH | ||||
14988247 | 866 days ago | 1 ETH | ||||
14964882 | 870 days ago | 1 ETH | ||||
14904153 | 881 days ago | 3 ETH |
Loading...
Loading
Contract Name:
CEX
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "./ERC721A.sol"; import "./ReentrancyGuard.sol"; import "./MerkleProof.sol"; contract CEX is ERC721A, Ownable, ReentrancyGuard { // Max supply uint256 public maxSupply; uint256 public maxPerTx; // Merkle Root bytes32 public merkleRoot; // Price Per NFT uint256 public alPrice; // The address to receive payment from sales address payable payee; // Boolean value, if true only allowlist can buy, if false public can buy bool public alOnly; bool public saleOpen; // allowlist mapping mapping(address => bool) public hasMinted; // Events event minted(address minter, uint256 price, address recipient, uint256 amount); event burned(address from, address to, uint256 id); uint256[] public quarters = [750000000000000000, 750000000000000000, 1000000000000000000, 1250000000000000000]; constructor( string memory name, // CEX Never Ending Tickets string memory symbol, // CNET uint256 _alPrice, // 750000000000000000 uint256 _maxSupply, // 100 uint256 _maxPerTx, // 10 address payable _payee, // 0x81FE0aDB11c01D3ab91F0a478B9De71083e48067 string memory _uri // https://us-central1-cex1-332319.cloudfunctions.net/get-ipfs?tokenid= ) ERC721A(name, symbol, 50, _maxSupply) { maxSupply = _maxSupply; maxPerTx = _maxPerTx; alPrice = _alPrice; payee = _payee; URI = _uri; alOnly = false; saleOpen = true; } function currentPrice() public view returns(uint256) { return quarters[totalSupply() / 25]; } function isAllowListed(address _recipient, bytes32[] calldata _merkleProof) public view returns(bool) { bytes32 leaf = keccak256(abi.encodePacked(_recipient)); return MerkleProof.verify(_merkleProof, merkleRoot, leaf); } function mint(uint256 amount, bytes32[] calldata _merkleProof) external payable nonReentrant { require(saleOpen, "Sale is closed"); require(totalSupply() + amount <= maxSupply, "Exceeds max supply"); require(amount <= maxPerTx, "Exceeds transaction maximum"); // Check if allowListed if(isAllowListed(_msgSender(), _merkleProof) && !hasMinted[_msgSender()]) { // Restrict to one transaction per whitelisted account require(msg.value == alPrice * amount, "Incorrect amount of ETH sent"); hasMinted[_msgSender()] = true; } else { require(!alOnly, "Purchasing only available for whitelisted addresses"); require(msg.value == currentPrice() * amount, "Incorrect amount of ETH sent"); } // Pay payee (bool success,) = payee.call{value: msg.value}(""); require(success, "Transfer fail"); // Mint NFT to user wallet _safeMint(_msgSender(), amount); emit minted(_msgSender(), msg.value, _msgSender(), amount); } function burn(uint256 tokenId) external { transferFrom(_msgSender(), address(0), tokenId); emit burned(_msgSender(), address(0), tokenId); } function ownerMint(uint amount, address _recipient) public onlyOwner { require(totalSupply() + amount <= maxSupply, "Exceeds max supply"); _safeMint(_recipient, amount); } function withdraw() external onlyOwner { uint256 balance = address(this).balance; (bool success,) = _msgSender().call{value: balance}(""); require(success, "Transfer fail"); } function setURI(string memory _uri) public onlyOwner { URI = _uri; } function resetWhitelists(address[] memory whitelistedAddress) external onlyOwner { for(uint256 i = 0; i < whitelistedAddress.length; i++){ hasMinted[whitelistedAddress[i]] = false; } } function flipALState() external onlyOwner { alOnly = !alOnly; } function flipSaleState() external onlyOwner { saleOpen = !saleOpen; } function setRoot(bytes32 root) external onlyOwner { merkleRoot = root; } function setPrice(uint256 quarterToChange, uint256 newPrice) external onlyOwner { quarters[quarterToChange] = newPrice; } function addPriceBracket(uint256 newPrice) external onlyOwner { quarters.push(newPrice); } function changePayee(address payable _payee) external onlyOwner { payee = _payee; } function setMaxPerTX(uint256 _maxPerTx) external onlyOwner { maxPerTx = _maxPerTx; } function setALPrice(uint256 _alPrice) external onlyOwner { alPrice = _alPrice; } function pay() public payable { } }
// SPDX-License-Identifier: MIT 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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// 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; 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 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"; import "./Ownable.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())) : ""; //https://google-project/nft/123 } /** * @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. */ string URI; function _baseURI() internal view virtual returns (string memory) { return URI; //https://google-project/nft/ } /** * @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); } /** * @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); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); 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); } /** * @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 {} }
// 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 "@openzeppelin/contracts/utils/Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; import "./Ownable.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128. * * Does not support burning tokens to address(0). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex = 0; uint256 internal immutable collectionSize; uint256 internal immutable maxBatchSize; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev * `maxBatchSize` refers to how much a minter can mint at a time. * `collectionSize_` refers to how many tokens are in the collection. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_, uint256 collectionSize_ ) { require( collectionSize_ > 0, "ERC721A: collection must have a nonzero supply" ); require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; collectionSize = collectionSize_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get token of owner by index"); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721A: balance query for the zero address"); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); uint256 lowestTokenToCheck; if (tokenId >= maxBatchSize) { lowestTokenToCheck = tokenId - maxBatchSize + 1; } for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } revert("ERC721A: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ string URI; function _baseURI() internal view virtual returns (string memory) { return URI; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721A: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - there must be `quantity` tokens remaining unminted in the total collection. * - `to` cannot be the zero address. * - `quantity` cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the zero address"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); //require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > collectionSize - 1) { endIndex = collectionSize - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721A: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) 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 // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) 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); /** * @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 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 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 // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) 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() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT 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":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"_alPrice","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_maxPerTx","type":"uint256"},{"internalType":"address payable","name":"_payee","type":"address"},{"internalType":"string","name":"_uri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"minted","type":"event"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"addPriceBracket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"alOnly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"alPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_payee","type":"address"}],"name":"changePayee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipALState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"isAllowListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pay","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"quarters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"whitelistedAddress","type":"address[]"}],"name":"resetWhitelists","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_alPrice","type":"uint256"}],"name":"setALPrice","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":"uint256","name":"_maxPerTx","type":"uint256"}],"name":"setMaxPerTX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quarterToChange","type":"uint256"},{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setURI","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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040526000805560006008556040518060800160405280670a688906bd8b000067ffffffffffffffff168152602001670a688906bd8b000067ffffffffffffffff168152602001670de0b6b3a764000067ffffffffffffffff168152602001671158e460913d000067ffffffffffffffff168152506011906004620000889291906200033b565b503480156200009657600080fd5b5060405162005f6f38038062005f6f8339818101604052810190620000bc919062000686565b86866032866000811162000107576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000fe906200081d565b60405180910390fd5b600082116200014d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200014490620008b5565b60405180910390fd5b83600190805190602001906200016592919062000399565b5082600290805190602001906200017e92919062000399565b508160a08181525050806080818152505050505050620001b3620001a76200026d60201b60201c565b6200027560201b60201c565b6001600a8190555083600b8190555082600c8190555084600e8190555081600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600790805190602001906200022992919062000399565b506000600f60146101000a81548160ff0219169083151502179055506001600f60156101000a81548160ff021916908315150217905550505050505050506200093b565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805482825590600052602060002090810192821562000386579160200282015b8281111562000385578251829067ffffffffffffffff169055916020019190600101906200035c565b5b5090506200039591906200042a565b5090565b828054620003a79062000906565b90600052602060002090601f016020900481019282620003cb576000855562000417565b82601f10620003e657805160ff191683800117855562000417565b8280016001018555821562000417579182015b8281111562000416578251825591602001919060010190620003f9565b5b5090506200042691906200042a565b5090565b5b80821115620004455760008160009055506001016200042b565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004b28262000467565b810181811067ffffffffffffffff82111715620004d457620004d362000478565b5b80604052505050565b6000620004e962000449565b9050620004f78282620004a7565b919050565b600067ffffffffffffffff8211156200051a576200051962000478565b5b620005258262000467565b9050602081019050919050565b60005b838110156200055257808201518184015260208101905062000535565b8381111562000562576000848401525b50505050565b60006200057f6200057984620004fc565b620004dd565b9050828152602081018484840111156200059e576200059d62000462565b5b620005ab84828562000532565b509392505050565b600082601f830112620005cb57620005ca6200045d565b5b8151620005dd84826020860162000568565b91505092915050565b6000819050919050565b620005fb81620005e6565b81146200060757600080fd5b50565b6000815190506200061b81620005f0565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200064e8262000621565b9050919050565b620006608162000641565b81146200066c57600080fd5b50565b600081519050620006808162000655565b92915050565b600080600080600080600060e0888a031215620006a857620006a762000453565b5b600088015167ffffffffffffffff811115620006c957620006c862000458565b5b620006d78a828b01620005b3565b975050602088015167ffffffffffffffff811115620006fb57620006fa62000458565b5b620007098a828b01620005b3565b96505060406200071c8a828b016200060a565b95505060606200072f8a828b016200060a565b9450506080620007428a828b016200060a565b93505060a0620007558a828b016200066f565b92505060c088015167ffffffffffffffff81111562000779576200077862000458565b5b620007878a828b01620005b3565b91505092959891949750929550565b600082825260208201905092915050565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b600062000805602e8362000796565b91506200081282620007a7565b604082019050919050565b600060208201905081810360008301526200083881620007f6565b9050919050565b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b60006200089d60278362000796565b9150620008aa826200083f565b604082019050919050565b60006020820190508181036000830152620008d0816200088e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200091f57607f821691505b602082108103620009355762000934620008d7565b5b50919050565b60805160a0516156036200096c60003960008181612bd301528181612bfc015261334a0152600050506156036000f3fe6080604052600436106102725760003560e01c80636352211e1161014f578063ba41b0c6116100c1578063e5a4756c1161007a578063e5a4756c1461090c578063e985e9c514610935578063ef7ccafd14610972578063f2fde38b146109af578063f7d97577146109d8578063f968adbe14610a0157610272565b8063ba41b0c61461080b578063c87b56dd14610827578063d52c57e014610864578063d5abeb011461088d578063d7224ba0146108b8578063dab5f340146108e357610272565b806395d89b411161011357806395d89b411461070d57806399288dbb146107385780639d1b464a14610763578063a22cb4651461078e578063a7bd3610146107b7578063b88d4fde146107e257610272565b80636352211e14610614578063677621691461065157806370a082311461068e578063715018a6146106cb5780638da5cb5b146106e257610272565b80632eb4a7ab116101e85780633ccfd60b116101ac5780633ccfd60b1461052e5780633e3b7ec21461054557806342842e0e1461056e57806342966c68146105975780634674a23c146105c05780634f6ccce7146105d757610272565b80632eb4a7ab146104495780632f745c59146104745780632fde065c146104b157806334918dfd146104da57806338e21cce146104f157610272565b80630e03ebe91161023a5780630e03ebe91461036e57806318160ddd146103975780631b8926a9146103c25780631b9265b8146103ed5780631c1bc850146103f757806323b872dd1461042057610272565b806301ffc9a71461027757806302fe5305146102b457806306fdde03146102dd578063081812fc14610308578063095ea7b314610345575b600080fd5b34801561028357600080fd5b5061029e600480360381019061029991906138c8565b610a2c565b6040516102ab9190613910565b60405180910390f35b3480156102c057600080fd5b506102db60048036038101906102d69190613a71565b610b76565b005b3480156102e957600080fd5b506102f2610c0c565b6040516102ff9190613b42565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a9190613b9a565b610c9e565b60405161033c9190613c08565b60405180910390f35b34801561035157600080fd5b5061036c60048036038101906103679190613c4f565b610d23565b005b34801561037a57600080fd5b5061039560048036038101906103909190613b9a565b610e3b565b005b3480156103a357600080fd5b506103ac610ec1565b6040516103b99190613c9e565b60405180910390f35b3480156103ce57600080fd5b506103d7610eca565b6040516103e49190613c9e565b60405180910390f35b6103f5610ed0565b005b34801561040357600080fd5b5061041e60048036038101906104199190613cf7565b610ed2565b005b34801561042c57600080fd5b5061044760048036038101906104429190613d24565b610f92565b005b34801561045557600080fd5b5061045e610fa2565b60405161046b9190613d90565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190613c4f565b610fa8565b6040516104a89190613c9e565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d39190613b9a565b6111a4565b005b3480156104e657600080fd5b506104ef61124c565b005b3480156104fd57600080fd5b5061051860048036038101906105139190613dab565b6112f4565b6040516105259190613910565b60405180910390f35b34801561053a57600080fd5b50610543611314565b005b34801561055157600080fd5b5061056c60048036038101906105679190613ea0565b61144c565b005b34801561057a57600080fd5b5061059560048036038101906105909190613d24565b61155d565b005b3480156105a357600080fd5b506105be60048036038101906105b99190613b9a565b61157d565b005b3480156105cc57600080fd5b506105d56115d6565b005b3480156105e357600080fd5b506105fe60048036038101906105f99190613b9a565b61167e565b60405161060b9190613c9e565b60405180910390f35b34801561062057600080fd5b5061063b60048036038101906106369190613b9a565b6116d1565b6040516106489190613c08565b60405180910390f35b34801561065d57600080fd5b5061067860048036038101906106739190613f44565b6116e7565b6040516106859190613910565b60405180910390f35b34801561069a57600080fd5b506106b560048036038101906106b09190613dab565b61176b565b6040516106c29190613c9e565b60405180910390f35b3480156106d757600080fd5b506106e0611853565b005b3480156106ee57600080fd5b506106f76118db565b6040516107049190613c08565b60405180910390f35b34801561071957600080fd5b50610722611905565b60405161072f9190613b42565b60405180910390f35b34801561074457600080fd5b5061074d611997565b60405161075a9190613910565b60405180910390f35b34801561076f57600080fd5b506107786119aa565b6040516107859190613c9e565b60405180910390f35b34801561079a57600080fd5b506107b560048036038101906107b09190613fd0565b6119e3565b005b3480156107c357600080fd5b506107cc611b63565b6040516107d99190613910565b60405180910390f35b3480156107ee57600080fd5b50610809600480360381019061080491906140b1565b611b76565b005b61082560048036038101906108209190614134565b611bd2565b005b34801561083357600080fd5b5061084e60048036038101906108499190613b9a565b61200e565b60405161085b9190613b42565b60405180910390f35b34801561087057600080fd5b5061088b60048036038101906108869190614194565b6120b5565b005b34801561089957600080fd5b506108a2612196565b6040516108af9190613c9e565b60405180910390f35b3480156108c457600080fd5b506108cd61219c565b6040516108da9190613c9e565b60405180910390f35b3480156108ef57600080fd5b5061090a60048036038101906109059190614200565b6121a2565b005b34801561091857600080fd5b50610933600480360381019061092e9190613b9a565b612228565b005b34801561094157600080fd5b5061095c6004803603810190610957919061422d565b6122ae565b6040516109699190613910565b60405180910390f35b34801561097e57600080fd5b5061099960048036038101906109949190613b9a565b612342565b6040516109a69190613c9e565b60405180910390f35b3480156109bb57600080fd5b506109d660048036038101906109d19190613dab565b612366565b005b3480156109e457600080fd5b506109ff60048036038101906109fa919061426d565b61245d565b005b348015610a0d57600080fd5b50610a16612500565b604051610a239190613c9e565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610af757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b5f57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b6f5750610b6e82612506565b5b9050919050565b610b7e612570565b73ffffffffffffffffffffffffffffffffffffffff16610b9c6118db565b73ffffffffffffffffffffffffffffffffffffffff1614610bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be9906142f9565b60405180910390fd5b8060079080519060200190610c0892919061377f565b5050565b606060018054610c1b90614348565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4790614348565b8015610c945780601f10610c6957610100808354040283529160200191610c94565b820191906000526020600020905b815481529060010190602001808311610c7757829003601f168201915b5050505050905090565b6000610ca982612578565b610ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdf906143eb565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d2e826116d1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d959061447d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dbd612570565b73ffffffffffffffffffffffffffffffffffffffff161480610dec5750610deb81610de6612570565b6122ae565b5b610e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e229061450f565b60405180910390fd5b610e36838383612585565b505050565b610e43612570565b73ffffffffffffffffffffffffffffffffffffffff16610e616118db565b73ffffffffffffffffffffffffffffffffffffffff1614610eb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eae906142f9565b60405180910390fd5b80600e8190555050565b60008054905090565b600e5481565b565b610eda612570565b73ffffffffffffffffffffffffffffffffffffffff16610ef86118db565b73ffffffffffffffffffffffffffffffffffffffff1614610f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f45906142f9565b60405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610f9d838383612637565b505050565b600d5481565b6000610fb38361176b565b8210610ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610feb906145a1565b60405180910390fd5b6000610ffe610ec1565b905060008060005b83811015611162576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146110f857806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361114e5786840361113f57819550505050505061119e565b838061114a906145f0565b9450505b50808061115a906145f0565b915050611006565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611195906146aa565b60405180910390fd5b92915050565b6111ac612570565b73ffffffffffffffffffffffffffffffffffffffff166111ca6118db565b73ffffffffffffffffffffffffffffffffffffffff1614611220576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611217906142f9565b60405180910390fd5b601181908060018154018082558091505060019003906000526020600020016000909190919091505550565b611254612570565b73ffffffffffffffffffffffffffffffffffffffff166112726118db565b73ffffffffffffffffffffffffffffffffffffffff16146112c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bf906142f9565b60405180910390fd5b600f60159054906101000a900460ff1615600f60156101000a81548160ff021916908315150217905550565b60106020528060005260406000206000915054906101000a900460ff1681565b61131c612570565b73ffffffffffffffffffffffffffffffffffffffff1661133a6118db565b73ffffffffffffffffffffffffffffffffffffffff1614611390576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611387906142f9565b60405180910390fd5b6000479050600061139f612570565b73ffffffffffffffffffffffffffffffffffffffff16826040516113c2906146fb565b60006040518083038185875af1925050503d80600081146113ff576040519150601f19603f3d011682016040523d82523d6000602084013e611404565b606091505b5050905080611448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143f9061475c565b60405180910390fd5b5050565b611454612570565b73ffffffffffffffffffffffffffffffffffffffff166114726118db565b73ffffffffffffffffffffffffffffffffffffffff16146114c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bf906142f9565b60405180910390fd5b60005b8151811015611559576000601060008484815181106114ed576114ec61477c565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611551906145f0565b9150506114cb565b5050565b61157883838360405180602001604052806000815250611b76565b505050565b611590611588612570565b600083610f92565b7f4911fc0126af9455d0aa4a23d3cf11a705afa45b85f7721bf29a93ccbbf76a876115b9612570565b6000836040516115cb939291906147ab565b60405180910390a150565b6115de612570565b73ffffffffffffffffffffffffffffffffffffffff166115fc6118db565b73ffffffffffffffffffffffffffffffffffffffff1614611652576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611649906142f9565b60405180910390fd5b600f60149054906101000a900460ff1615600f60146101000a81548160ff021916908315150217905550565b6000611688610ec1565b82106116c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c090614854565b60405180910390fd5b819050919050565b60006116dc82612b7f565b600001519050919050565b600080846040516020016116fb91906148bc565b604051602081830303815290604052805190602001209050611761848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d5483612d82565b9150509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d290614949565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61185b612570565b73ffffffffffffffffffffffffffffffffffffffff166118796118db565b73ffffffffffffffffffffffffffffffffffffffff16146118cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c6906142f9565b60405180910390fd5b6118d96000612d99565b565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461191490614348565b80601f016020809104026020016040519081016040528092919081815260200182805461194090614348565b801561198d5780601f106119625761010080835404028352916020019161198d565b820191906000526020600020905b81548152906001019060200180831161197057829003601f168201915b5050505050905090565b600f60159054906101000a900460ff1681565b6000601160196119b8610ec1565b6119c29190614998565b815481106119d3576119d261477c565b5b9060005260206000200154905090565b6119eb612570565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4f90614a15565b60405180910390fd5b8060066000611a65612570565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b12612570565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b579190613910565b60405180910390a35050565b600f60149054906101000a900460ff1681565b611b81848484612637565b611b8d84848484612e5f565b611bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc390614aa7565b60405180910390fd5b50505050565b6002600a5403611c17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0e90614b13565b60405180910390fd5b6002600a81905550600f60159054906101000a900460ff16611c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6590614b7f565b60405180910390fd5b600b5483611c7a610ec1565b611c849190614b9f565b1115611cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbc90614c41565b60405180910390fd5b600c54831115611d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0190614cad565b60405180910390fd5b611d1c611d15612570565b83836116e7565b8015611d79575060106000611d2f612570565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611e315782600e54611d8c9190614ccd565b3414611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc490614d73565b60405180910390fd5b600160106000611ddb612570565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611ed6565b600f60149054906101000a900460ff1615611e81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7890614e05565b60405180910390fd5b82611e8a6119aa565b611e949190614ccd565b3414611ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecc90614d73565b60405180910390fd5b5b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1634604051611f1e906146fb565b60006040518083038185875af1925050503d8060008114611f5b576040519150601f19603f3d011682016040523d82523d6000602084013e611f60565b606091505b5050905080611fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9b9061475c565b60405180910390fd5b611fb5611faf612570565b85612fe6565b7f58303c2ecff4b8a524f2f8ca478d8683b492b3419026f7199667453c2f15412a611fde612570565b34611fe7612570565b87604051611ff89493929190614e25565b60405180910390a1506001600a81905550505050565b606061201982612578565b612058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204f90614edc565b60405180910390fd5b6000612062613004565b9050600081511161208257604051806020016040528060008152506120ad565b8061208c84613096565b60405160200161209d929190614f38565b6040516020818303038152906040525b915050919050565b6120bd612570565b73ffffffffffffffffffffffffffffffffffffffff166120db6118db565b73ffffffffffffffffffffffffffffffffffffffff1614612131576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612128906142f9565b60405180910390fd5b600b548261213d610ec1565b6121479190614b9f565b1115612188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217f90614c41565b60405180910390fd5b6121928183612fe6565b5050565b600b5481565b60085481565b6121aa612570565b73ffffffffffffffffffffffffffffffffffffffff166121c86118db565b73ffffffffffffffffffffffffffffffffffffffff161461221e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612215906142f9565b60405180910390fd5b80600d8190555050565b612230612570565b73ffffffffffffffffffffffffffffffffffffffff1661224e6118db565b73ffffffffffffffffffffffffffffffffffffffff16146122a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229b906142f9565b60405180910390fd5b80600c8190555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6011818154811061235257600080fd5b906000526020600020016000915090505481565b61236e612570565b73ffffffffffffffffffffffffffffffffffffffff1661238c6118db565b73ffffffffffffffffffffffffffffffffffffffff16146123e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d9906142f9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612451576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244890614fce565b60405180910390fd5b61245a81612d99565b50565b612465612570565b73ffffffffffffffffffffffffffffffffffffffff166124836118db565b73ffffffffffffffffffffffffffffffffffffffff16146124d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d0906142f9565b60405180910390fd5b80601183815481106124ee576124ed61477c565b5b90600052602060002001819055505050565b600c5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061264282612b7f565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612669612570565b73ffffffffffffffffffffffffffffffffffffffff1614806126c5575061268e612570565b73ffffffffffffffffffffffffffffffffffffffff166126ad84610c9e565b73ffffffffffffffffffffffffffffffffffffffff16145b806126e157506126e082600001516126db612570565b6122ae565b5b905080612723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271a90615060565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278c906150f2565b60405180910390fd5b6127a285858560016131f6565b6127b26000848460000151612585565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612820919061512e565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166128c49190615162565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846129ca9190614b9f565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612b0f57612a3f81612578565b15612b0e576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b7786868660016131fc565b505050505050565b612b87613805565b612b9082612578565b612bcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc69061521a565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000008310612c335760017f000000000000000000000000000000000000000000000000000000000000000084612c26919061523a565b612c309190614b9f565b90505b60008390505b818110612d41576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d2d57809350505050612d7d565b508080612d399061526e565b915050612c39565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7490615309565b60405180910390fd5b919050565b600082612d8f8584613202565b1490509392505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612e808473ffffffffffffffffffffffffffffffffffffffff16613277565b15612fd9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ea9612570565b8786866040518563ffffffff1660e01b8152600401612ecb949392919061537e565b6020604051808303816000875af1925050508015612f0757506040513d601f19601f82011682018060405250810190612f0491906153df565b60015b612f89573d8060008114612f37576040519150601f19603f3d011682016040523d82523d6000602084013e612f3c565b606091505b506000815103612f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7890614aa7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612fde565b600190505b949350505050565b61300082826040518060200160405280600081525061328a565b5050565b60606007805461301390614348565b80601f016020809104026020016040519081016040528092919081815260200182805461303f90614348565b801561308c5780601f106130615761010080835404028352916020019161308c565b820191906000526020600020905b81548152906001019060200180831161306f57829003601f168201915b5050505050905090565b6060600082036130dd576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131f1565b600082905060005b6000821461310f5780806130f8906145f0565b915050600a826131089190614998565b91506130e5565b60008167ffffffffffffffff81111561312b5761312a613946565b5b6040519080825280601f01601f19166020018201604052801561315d5781602001600182028036833780820191505090505b5090505b600085146131ea57600182613176919061523a565b9150600a85613185919061540c565b60306131919190614b9f565b60f81b8183815181106131a7576131a661477c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131e39190614998565b9450613161565b8093505050505b919050565b50505050565b50505050565b60008082905060005b845181101561326c5760008582815181106132295761322861477c565b5b6020026020010151905080831161324b576132448382613768565b9250613258565b6132558184613768565b92505b508080613264906145f0565b91505061320b565b508091505092915050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036132ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f6906154af565b60405180910390fd5b61330881612578565b15613348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333f9061551b565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008311156133ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a2906155ad565b60405180910390fd5b6133b860008583866131f6565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516134b59190615162565b6fffffffffffffffffffffffffffffffff1681526020018583602001516134dc9190615162565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561374b57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46136eb6000888488612e5f565b61372a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372190614aa7565b60405180910390fd5b8180613735906145f0565b9250508080613743906145f0565b91505061367a565b508060008190555061376060008785886131fc565b505050505050565b600082600052816020526040600020905092915050565b82805461378b90614348565b90600052602060002090601f0160209004810192826137ad57600085556137f4565b82601f106137c657805160ff19168380011785556137f4565b828001600101855582156137f4579182015b828111156137f35782518255916020019190600101906137d8565b5b509050613801919061383f565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613858576000816000905550600101613840565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138a581613870565b81146138b057600080fd5b50565b6000813590506138c28161389c565b92915050565b6000602082840312156138de576138dd613866565b5b60006138ec848285016138b3565b91505092915050565b60008115159050919050565b61390a816138f5565b82525050565b60006020820190506139256000830184613901565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61397e82613935565b810181811067ffffffffffffffff8211171561399d5761399c613946565b5b80604052505050565b60006139b061385c565b90506139bc8282613975565b919050565b600067ffffffffffffffff8211156139dc576139db613946565b5b6139e582613935565b9050602081019050919050565b82818337600083830152505050565b6000613a14613a0f846139c1565b6139a6565b905082815260208101848484011115613a3057613a2f613930565b5b613a3b8482856139f2565b509392505050565b600082601f830112613a5857613a5761392b565b5b8135613a68848260208601613a01565b91505092915050565b600060208284031215613a8757613a86613866565b5b600082013567ffffffffffffffff811115613aa557613aa461386b565b5b613ab184828501613a43565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613af4578082015181840152602081019050613ad9565b83811115613b03576000848401525b50505050565b6000613b1482613aba565b613b1e8185613ac5565b9350613b2e818560208601613ad6565b613b3781613935565b840191505092915050565b60006020820190508181036000830152613b5c8184613b09565b905092915050565b6000819050919050565b613b7781613b64565b8114613b8257600080fd5b50565b600081359050613b9481613b6e565b92915050565b600060208284031215613bb057613baf613866565b5b6000613bbe84828501613b85565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bf282613bc7565b9050919050565b613c0281613be7565b82525050565b6000602082019050613c1d6000830184613bf9565b92915050565b613c2c81613be7565b8114613c3757600080fd5b50565b600081359050613c4981613c23565b92915050565b60008060408385031215613c6657613c65613866565b5b6000613c7485828601613c3a565b9250506020613c8585828601613b85565b9150509250929050565b613c9881613b64565b82525050565b6000602082019050613cb36000830184613c8f565b92915050565b6000613cc482613bc7565b9050919050565b613cd481613cb9565b8114613cdf57600080fd5b50565b600081359050613cf181613ccb565b92915050565b600060208284031215613d0d57613d0c613866565b5b6000613d1b84828501613ce2565b91505092915050565b600080600060608486031215613d3d57613d3c613866565b5b6000613d4b86828701613c3a565b9350506020613d5c86828701613c3a565b9250506040613d6d86828701613b85565b9150509250925092565b6000819050919050565b613d8a81613d77565b82525050565b6000602082019050613da56000830184613d81565b92915050565b600060208284031215613dc157613dc0613866565b5b6000613dcf84828501613c3a565b91505092915050565b600067ffffffffffffffff821115613df357613df2613946565b5b602082029050602081019050919050565b600080fd5b6000613e1c613e1784613dd8565b6139a6565b90508083825260208201905060208402830185811115613e3f57613e3e613e04565b5b835b81811015613e685780613e548882613c3a565b845260208401935050602081019050613e41565b5050509392505050565b600082601f830112613e8757613e8661392b565b5b8135613e97848260208601613e09565b91505092915050565b600060208284031215613eb657613eb5613866565b5b600082013567ffffffffffffffff811115613ed457613ed361386b565b5b613ee084828501613e72565b91505092915050565b600080fd5b60008083601f840112613f0457613f0361392b565b5b8235905067ffffffffffffffff811115613f2157613f20613ee9565b5b602083019150836020820283011115613f3d57613f3c613e04565b5b9250929050565b600080600060408486031215613f5d57613f5c613866565b5b6000613f6b86828701613c3a565b935050602084013567ffffffffffffffff811115613f8c57613f8b61386b565b5b613f9886828701613eee565b92509250509250925092565b613fad816138f5565b8114613fb857600080fd5b50565b600081359050613fca81613fa4565b92915050565b60008060408385031215613fe757613fe6613866565b5b6000613ff585828601613c3a565b925050602061400685828601613fbb565b9150509250929050565b600067ffffffffffffffff82111561402b5761402a613946565b5b61403482613935565b9050602081019050919050565b600061405461404f84614010565b6139a6565b9050828152602081018484840111156140705761406f613930565b5b61407b8482856139f2565b509392505050565b600082601f8301126140985761409761392b565b5b81356140a8848260208601614041565b91505092915050565b600080600080608085870312156140cb576140ca613866565b5b60006140d987828801613c3a565b94505060206140ea87828801613c3a565b93505060406140fb87828801613b85565b925050606085013567ffffffffffffffff81111561411c5761411b61386b565b5b61412887828801614083565b91505092959194509250565b60008060006040848603121561414d5761414c613866565b5b600061415b86828701613b85565b935050602084013567ffffffffffffffff81111561417c5761417b61386b565b5b61418886828701613eee565b92509250509250925092565b600080604083850312156141ab576141aa613866565b5b60006141b985828601613b85565b92505060206141ca85828601613c3a565b9150509250929050565b6141dd81613d77565b81146141e857600080fd5b50565b6000813590506141fa816141d4565b92915050565b60006020828403121561421657614215613866565b5b6000614224848285016141eb565b91505092915050565b6000806040838503121561424457614243613866565b5b600061425285828601613c3a565b925050602061426385828601613c3a565b9150509250929050565b6000806040838503121561428457614283613866565b5b600061429285828601613b85565b92505060206142a385828601613b85565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006142e3602083613ac5565b91506142ee826142ad565b602082019050919050565b60006020820190508181036000830152614312816142d6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061436057607f821691505b60208210810361437357614372614319565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b60006143d5602d83613ac5565b91506143e082614379565b604082019050919050565b60006020820190508181036000830152614404816143c8565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000614467602283613ac5565b91506144728261440b565b604082019050919050565b600060208201905081810360008301526144968161445a565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b60006144f9603983613ac5565b91506145048261449d565b604082019050919050565b60006020820190508181036000830152614528816144ec565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b600061458b602283613ac5565b91506145968261452f565b604082019050919050565b600060208201905081810360008301526145ba8161457e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006145fb82613b64565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361462d5761462c6145c1565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000614694602e83613ac5565b915061469f82614638565b604082019050919050565b600060208201905081810360008301526146c381614687565b9050919050565b600081905092915050565b50565b60006146e56000836146ca565b91506146f0826146d5565b600082019050919050565b6000614706826146d8565b9150819050919050565b7f5472616e73666572206661696c00000000000000000000000000000000000000600082015250565b6000614746600d83613ac5565b915061475182614710565b602082019050919050565b6000602082019050818103600083015261477581614739565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006060820190506147c06000830186613bf9565b6147cd6020830185613bf9565b6147da6040830184613c8f565b949350505050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b600061483e602383613ac5565b9150614849826147e2565b604082019050919050565b6000602082019050818103600083015261486d81614831565b9050919050565b60008160601b9050919050565b600061488c82614874565b9050919050565b600061489e82614881565b9050919050565b6148b66148b182613be7565b614893565b82525050565b60006148c882846148a5565b60148201915081905092915050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614933602b83613ac5565b915061493e826148d7565b604082019050919050565b6000602082019050818103600083015261496281614926565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006149a382613b64565b91506149ae83613b64565b9250826149be576149bd614969565b5b828204905092915050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b60006149ff601a83613ac5565b9150614a0a826149c9565b602082019050919050565b60006020820190508181036000830152614a2e816149f2565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000614a91603383613ac5565b9150614a9c82614a35565b604082019050919050565b60006020820190508181036000830152614ac081614a84565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614afd601f83613ac5565b9150614b0882614ac7565b602082019050919050565b60006020820190508181036000830152614b2c81614af0565b9050919050565b7f53616c6520697320636c6f736564000000000000000000000000000000000000600082015250565b6000614b69600e83613ac5565b9150614b7482614b33565b602082019050919050565b60006020820190508181036000830152614b9881614b5c565b9050919050565b6000614baa82613b64565b9150614bb583613b64565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614bea57614be96145c1565b5b828201905092915050565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b6000614c2b601283613ac5565b9150614c3682614bf5565b602082019050919050565b60006020820190508181036000830152614c5a81614c1e565b9050919050565b7f45786365656473207472616e73616374696f6e206d6178696d756d0000000000600082015250565b6000614c97601b83613ac5565b9150614ca282614c61565b602082019050919050565b60006020820190508181036000830152614cc681614c8a565b9050919050565b6000614cd882613b64565b9150614ce383613b64565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d1c57614d1b6145c1565b5b828202905092915050565b7f496e636f727265637420616d6f756e74206f66204554482073656e7400000000600082015250565b6000614d5d601c83613ac5565b9150614d6882614d27565b602082019050919050565b60006020820190508181036000830152614d8c81614d50565b9050919050565b7f50757263686173696e67206f6e6c7920617661696c61626c6520666f7220776860008201527f6974656c69737465642061646472657373657300000000000000000000000000602082015250565b6000614def603383613ac5565b9150614dfa82614d93565b604082019050919050565b60006020820190508181036000830152614e1e81614de2565b9050919050565b6000608082019050614e3a6000830187613bf9565b614e476020830186613c8f565b614e546040830185613bf9565b614e616060830184613c8f565b95945050505050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614ec6602f83613ac5565b9150614ed182614e6a565b604082019050919050565b60006020820190508181036000830152614ef581614eb9565b9050919050565b600081905092915050565b6000614f1282613aba565b614f1c8185614efc565b9350614f2c818560208601613ad6565b80840191505092915050565b6000614f448285614f07565b9150614f508284614f07565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614fb8602683613ac5565b9150614fc382614f5c565b604082019050919050565b60006020820190508181036000830152614fe781614fab565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b600061504a603283613ac5565b915061505582614fee565b604082019050919050565b600060208201905081810360008301526150798161503d565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006150dc602683613ac5565b91506150e782615080565b604082019050919050565b6000602082019050818103600083015261510b816150cf565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600061513982615112565b915061514483615112565b925082821015615157576151566145c1565b5b828203905092915050565b600061516d82615112565b915061517883615112565b9250826fffffffffffffffffffffffffffffffff0382111561519d5761519c6145c1565b5b828201905092915050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000615204602a83613ac5565b915061520f826151a8565b604082019050919050565b60006020820190508181036000830152615233816151f7565b9050919050565b600061524582613b64565b915061525083613b64565b925082821015615263576152626145c1565b5b828203905092915050565b600061527982613b64565b91506000820361528c5761528b6145c1565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b60006152f3602f83613ac5565b91506152fe82615297565b604082019050919050565b60006020820190508181036000830152615322816152e6565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061535082615329565b61535a8185615334565b935061536a818560208601613ad6565b61537381613935565b840191505092915050565b60006080820190506153936000830187613bf9565b6153a06020830186613bf9565b6153ad6040830185613c8f565b81810360608301526153bf8184615345565b905095945050505050565b6000815190506153d98161389c565b92915050565b6000602082840312156153f5576153f4613866565b5b6000615403848285016153ca565b91505092915050565b600061541782613b64565b915061542283613b64565b92508261543257615431614969565b5b828206905092915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615499602183613ac5565b91506154a48261543d565b604082019050919050565b600060208201905081810360008301526154c88161548c565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b6000615505601d83613ac5565b9150615510826154cf565b602082019050919050565b60006020820190508181036000830152615534816154f8565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b6000615597602283613ac5565b91506155a28261553b565b604082019050919050565b600060208201905081810360008301526155c68161558a565b905091905056fea2646970667358221220d0fe81067b47f7d65ff9cef7b5c97a895d19c86c983670953d3eb1250e30c28364736f6c634300080d003300000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000a688906bd8b00000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000081fe0adb11c01d3ab91f0a478b9de71083e4806700000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000018434558204e6576657220456e64696e67205469636b65747300000000000000000000000000000000000000000000000000000000000000000000000000000004434e455400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f75732d63656e7472616c312d636578312d3333323331392e636c6f756466756e6374696f6e732e6e65742f6765742d697066733f746f6b656e69643d00000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102725760003560e01c80636352211e1161014f578063ba41b0c6116100c1578063e5a4756c1161007a578063e5a4756c1461090c578063e985e9c514610935578063ef7ccafd14610972578063f2fde38b146109af578063f7d97577146109d8578063f968adbe14610a0157610272565b8063ba41b0c61461080b578063c87b56dd14610827578063d52c57e014610864578063d5abeb011461088d578063d7224ba0146108b8578063dab5f340146108e357610272565b806395d89b411161011357806395d89b411461070d57806399288dbb146107385780639d1b464a14610763578063a22cb4651461078e578063a7bd3610146107b7578063b88d4fde146107e257610272565b80636352211e14610614578063677621691461065157806370a082311461068e578063715018a6146106cb5780638da5cb5b146106e257610272565b80632eb4a7ab116101e85780633ccfd60b116101ac5780633ccfd60b1461052e5780633e3b7ec21461054557806342842e0e1461056e57806342966c68146105975780634674a23c146105c05780634f6ccce7146105d757610272565b80632eb4a7ab146104495780632f745c59146104745780632fde065c146104b157806334918dfd146104da57806338e21cce146104f157610272565b80630e03ebe91161023a5780630e03ebe91461036e57806318160ddd146103975780631b8926a9146103c25780631b9265b8146103ed5780631c1bc850146103f757806323b872dd1461042057610272565b806301ffc9a71461027757806302fe5305146102b457806306fdde03146102dd578063081812fc14610308578063095ea7b314610345575b600080fd5b34801561028357600080fd5b5061029e600480360381019061029991906138c8565b610a2c565b6040516102ab9190613910565b60405180910390f35b3480156102c057600080fd5b506102db60048036038101906102d69190613a71565b610b76565b005b3480156102e957600080fd5b506102f2610c0c565b6040516102ff9190613b42565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a9190613b9a565b610c9e565b60405161033c9190613c08565b60405180910390f35b34801561035157600080fd5b5061036c60048036038101906103679190613c4f565b610d23565b005b34801561037a57600080fd5b5061039560048036038101906103909190613b9a565b610e3b565b005b3480156103a357600080fd5b506103ac610ec1565b6040516103b99190613c9e565b60405180910390f35b3480156103ce57600080fd5b506103d7610eca565b6040516103e49190613c9e565b60405180910390f35b6103f5610ed0565b005b34801561040357600080fd5b5061041e60048036038101906104199190613cf7565b610ed2565b005b34801561042c57600080fd5b5061044760048036038101906104429190613d24565b610f92565b005b34801561045557600080fd5b5061045e610fa2565b60405161046b9190613d90565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190613c4f565b610fa8565b6040516104a89190613c9e565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d39190613b9a565b6111a4565b005b3480156104e657600080fd5b506104ef61124c565b005b3480156104fd57600080fd5b5061051860048036038101906105139190613dab565b6112f4565b6040516105259190613910565b60405180910390f35b34801561053a57600080fd5b50610543611314565b005b34801561055157600080fd5b5061056c60048036038101906105679190613ea0565b61144c565b005b34801561057a57600080fd5b5061059560048036038101906105909190613d24565b61155d565b005b3480156105a357600080fd5b506105be60048036038101906105b99190613b9a565b61157d565b005b3480156105cc57600080fd5b506105d56115d6565b005b3480156105e357600080fd5b506105fe60048036038101906105f99190613b9a565b61167e565b60405161060b9190613c9e565b60405180910390f35b34801561062057600080fd5b5061063b60048036038101906106369190613b9a565b6116d1565b6040516106489190613c08565b60405180910390f35b34801561065d57600080fd5b5061067860048036038101906106739190613f44565b6116e7565b6040516106859190613910565b60405180910390f35b34801561069a57600080fd5b506106b560048036038101906106b09190613dab565b61176b565b6040516106c29190613c9e565b60405180910390f35b3480156106d757600080fd5b506106e0611853565b005b3480156106ee57600080fd5b506106f76118db565b6040516107049190613c08565b60405180910390f35b34801561071957600080fd5b50610722611905565b60405161072f9190613b42565b60405180910390f35b34801561074457600080fd5b5061074d611997565b60405161075a9190613910565b60405180910390f35b34801561076f57600080fd5b506107786119aa565b6040516107859190613c9e565b60405180910390f35b34801561079a57600080fd5b506107b560048036038101906107b09190613fd0565b6119e3565b005b3480156107c357600080fd5b506107cc611b63565b6040516107d99190613910565b60405180910390f35b3480156107ee57600080fd5b50610809600480360381019061080491906140b1565b611b76565b005b61082560048036038101906108209190614134565b611bd2565b005b34801561083357600080fd5b5061084e60048036038101906108499190613b9a565b61200e565b60405161085b9190613b42565b60405180910390f35b34801561087057600080fd5b5061088b60048036038101906108869190614194565b6120b5565b005b34801561089957600080fd5b506108a2612196565b6040516108af9190613c9e565b60405180910390f35b3480156108c457600080fd5b506108cd61219c565b6040516108da9190613c9e565b60405180910390f35b3480156108ef57600080fd5b5061090a60048036038101906109059190614200565b6121a2565b005b34801561091857600080fd5b50610933600480360381019061092e9190613b9a565b612228565b005b34801561094157600080fd5b5061095c6004803603810190610957919061422d565b6122ae565b6040516109699190613910565b60405180910390f35b34801561097e57600080fd5b5061099960048036038101906109949190613b9a565b612342565b6040516109a69190613c9e565b60405180910390f35b3480156109bb57600080fd5b506109d660048036038101906109d19190613dab565b612366565b005b3480156109e457600080fd5b506109ff60048036038101906109fa919061426d565b61245d565b005b348015610a0d57600080fd5b50610a16612500565b604051610a239190613c9e565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610af757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b5f57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b6f5750610b6e82612506565b5b9050919050565b610b7e612570565b73ffffffffffffffffffffffffffffffffffffffff16610b9c6118db565b73ffffffffffffffffffffffffffffffffffffffff1614610bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be9906142f9565b60405180910390fd5b8060079080519060200190610c0892919061377f565b5050565b606060018054610c1b90614348565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4790614348565b8015610c945780601f10610c6957610100808354040283529160200191610c94565b820191906000526020600020905b815481529060010190602001808311610c7757829003601f168201915b5050505050905090565b6000610ca982612578565b610ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdf906143eb565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d2e826116d1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d959061447d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dbd612570565b73ffffffffffffffffffffffffffffffffffffffff161480610dec5750610deb81610de6612570565b6122ae565b5b610e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e229061450f565b60405180910390fd5b610e36838383612585565b505050565b610e43612570565b73ffffffffffffffffffffffffffffffffffffffff16610e616118db565b73ffffffffffffffffffffffffffffffffffffffff1614610eb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eae906142f9565b60405180910390fd5b80600e8190555050565b60008054905090565b600e5481565b565b610eda612570565b73ffffffffffffffffffffffffffffffffffffffff16610ef86118db565b73ffffffffffffffffffffffffffffffffffffffff1614610f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f45906142f9565b60405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610f9d838383612637565b505050565b600d5481565b6000610fb38361176b565b8210610ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610feb906145a1565b60405180910390fd5b6000610ffe610ec1565b905060008060005b83811015611162576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146110f857806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361114e5786840361113f57819550505050505061119e565b838061114a906145f0565b9450505b50808061115a906145f0565b915050611006565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611195906146aa565b60405180910390fd5b92915050565b6111ac612570565b73ffffffffffffffffffffffffffffffffffffffff166111ca6118db565b73ffffffffffffffffffffffffffffffffffffffff1614611220576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611217906142f9565b60405180910390fd5b601181908060018154018082558091505060019003906000526020600020016000909190919091505550565b611254612570565b73ffffffffffffffffffffffffffffffffffffffff166112726118db565b73ffffffffffffffffffffffffffffffffffffffff16146112c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bf906142f9565b60405180910390fd5b600f60159054906101000a900460ff1615600f60156101000a81548160ff021916908315150217905550565b60106020528060005260406000206000915054906101000a900460ff1681565b61131c612570565b73ffffffffffffffffffffffffffffffffffffffff1661133a6118db565b73ffffffffffffffffffffffffffffffffffffffff1614611390576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611387906142f9565b60405180910390fd5b6000479050600061139f612570565b73ffffffffffffffffffffffffffffffffffffffff16826040516113c2906146fb565b60006040518083038185875af1925050503d80600081146113ff576040519150601f19603f3d011682016040523d82523d6000602084013e611404565b606091505b5050905080611448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143f9061475c565b60405180910390fd5b5050565b611454612570565b73ffffffffffffffffffffffffffffffffffffffff166114726118db565b73ffffffffffffffffffffffffffffffffffffffff16146114c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bf906142f9565b60405180910390fd5b60005b8151811015611559576000601060008484815181106114ed576114ec61477c565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611551906145f0565b9150506114cb565b5050565b61157883838360405180602001604052806000815250611b76565b505050565b611590611588612570565b600083610f92565b7f4911fc0126af9455d0aa4a23d3cf11a705afa45b85f7721bf29a93ccbbf76a876115b9612570565b6000836040516115cb939291906147ab565b60405180910390a150565b6115de612570565b73ffffffffffffffffffffffffffffffffffffffff166115fc6118db565b73ffffffffffffffffffffffffffffffffffffffff1614611652576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611649906142f9565b60405180910390fd5b600f60149054906101000a900460ff1615600f60146101000a81548160ff021916908315150217905550565b6000611688610ec1565b82106116c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c090614854565b60405180910390fd5b819050919050565b60006116dc82612b7f565b600001519050919050565b600080846040516020016116fb91906148bc565b604051602081830303815290604052805190602001209050611761848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d5483612d82565b9150509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d290614949565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61185b612570565b73ffffffffffffffffffffffffffffffffffffffff166118796118db565b73ffffffffffffffffffffffffffffffffffffffff16146118cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c6906142f9565b60405180910390fd5b6118d96000612d99565b565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461191490614348565b80601f016020809104026020016040519081016040528092919081815260200182805461194090614348565b801561198d5780601f106119625761010080835404028352916020019161198d565b820191906000526020600020905b81548152906001019060200180831161197057829003601f168201915b5050505050905090565b600f60159054906101000a900460ff1681565b6000601160196119b8610ec1565b6119c29190614998565b815481106119d3576119d261477c565b5b9060005260206000200154905090565b6119eb612570565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4f90614a15565b60405180910390fd5b8060066000611a65612570565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b12612570565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b579190613910565b60405180910390a35050565b600f60149054906101000a900460ff1681565b611b81848484612637565b611b8d84848484612e5f565b611bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc390614aa7565b60405180910390fd5b50505050565b6002600a5403611c17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0e90614b13565b60405180910390fd5b6002600a81905550600f60159054906101000a900460ff16611c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6590614b7f565b60405180910390fd5b600b5483611c7a610ec1565b611c849190614b9f565b1115611cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbc90614c41565b60405180910390fd5b600c54831115611d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0190614cad565b60405180910390fd5b611d1c611d15612570565b83836116e7565b8015611d79575060106000611d2f612570565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611e315782600e54611d8c9190614ccd565b3414611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc490614d73565b60405180910390fd5b600160106000611ddb612570565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611ed6565b600f60149054906101000a900460ff1615611e81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7890614e05565b60405180910390fd5b82611e8a6119aa565b611e949190614ccd565b3414611ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecc90614d73565b60405180910390fd5b5b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1634604051611f1e906146fb565b60006040518083038185875af1925050503d8060008114611f5b576040519150601f19603f3d011682016040523d82523d6000602084013e611f60565b606091505b5050905080611fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9b9061475c565b60405180910390fd5b611fb5611faf612570565b85612fe6565b7f58303c2ecff4b8a524f2f8ca478d8683b492b3419026f7199667453c2f15412a611fde612570565b34611fe7612570565b87604051611ff89493929190614e25565b60405180910390a1506001600a81905550505050565b606061201982612578565b612058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204f90614edc565b60405180910390fd5b6000612062613004565b9050600081511161208257604051806020016040528060008152506120ad565b8061208c84613096565b60405160200161209d929190614f38565b6040516020818303038152906040525b915050919050565b6120bd612570565b73ffffffffffffffffffffffffffffffffffffffff166120db6118db565b73ffffffffffffffffffffffffffffffffffffffff1614612131576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612128906142f9565b60405180910390fd5b600b548261213d610ec1565b6121479190614b9f565b1115612188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217f90614c41565b60405180910390fd5b6121928183612fe6565b5050565b600b5481565b60085481565b6121aa612570565b73ffffffffffffffffffffffffffffffffffffffff166121c86118db565b73ffffffffffffffffffffffffffffffffffffffff161461221e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612215906142f9565b60405180910390fd5b80600d8190555050565b612230612570565b73ffffffffffffffffffffffffffffffffffffffff1661224e6118db565b73ffffffffffffffffffffffffffffffffffffffff16146122a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229b906142f9565b60405180910390fd5b80600c8190555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6011818154811061235257600080fd5b906000526020600020016000915090505481565b61236e612570565b73ffffffffffffffffffffffffffffffffffffffff1661238c6118db565b73ffffffffffffffffffffffffffffffffffffffff16146123e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d9906142f9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612451576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244890614fce565b60405180910390fd5b61245a81612d99565b50565b612465612570565b73ffffffffffffffffffffffffffffffffffffffff166124836118db565b73ffffffffffffffffffffffffffffffffffffffff16146124d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d0906142f9565b60405180910390fd5b80601183815481106124ee576124ed61477c565b5b90600052602060002001819055505050565b600c5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061264282612b7f565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612669612570565b73ffffffffffffffffffffffffffffffffffffffff1614806126c5575061268e612570565b73ffffffffffffffffffffffffffffffffffffffff166126ad84610c9e565b73ffffffffffffffffffffffffffffffffffffffff16145b806126e157506126e082600001516126db612570565b6122ae565b5b905080612723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271a90615060565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278c906150f2565b60405180910390fd5b6127a285858560016131f6565b6127b26000848460000151612585565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612820919061512e565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166128c49190615162565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846129ca9190614b9f565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612b0f57612a3f81612578565b15612b0e576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b7786868660016131fc565b505050505050565b612b87613805565b612b9082612578565b612bcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc69061521a565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000328310612c335760017f000000000000000000000000000000000000000000000000000000000000003284612c26919061523a565b612c309190614b9f565b90505b60008390505b818110612d41576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d2d57809350505050612d7d565b508080612d399061526e565b915050612c39565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7490615309565b60405180910390fd5b919050565b600082612d8f8584613202565b1490509392505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612e808473ffffffffffffffffffffffffffffffffffffffff16613277565b15612fd9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ea9612570565b8786866040518563ffffffff1660e01b8152600401612ecb949392919061537e565b6020604051808303816000875af1925050508015612f0757506040513d601f19601f82011682018060405250810190612f0491906153df565b60015b612f89573d8060008114612f37576040519150601f19603f3d011682016040523d82523d6000602084013e612f3c565b606091505b506000815103612f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7890614aa7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612fde565b600190505b949350505050565b61300082826040518060200160405280600081525061328a565b5050565b60606007805461301390614348565b80601f016020809104026020016040519081016040528092919081815260200182805461303f90614348565b801561308c5780601f106130615761010080835404028352916020019161308c565b820191906000526020600020905b81548152906001019060200180831161306f57829003601f168201915b5050505050905090565b6060600082036130dd576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131f1565b600082905060005b6000821461310f5780806130f8906145f0565b915050600a826131089190614998565b91506130e5565b60008167ffffffffffffffff81111561312b5761312a613946565b5b6040519080825280601f01601f19166020018201604052801561315d5781602001600182028036833780820191505090505b5090505b600085146131ea57600182613176919061523a565b9150600a85613185919061540c565b60306131919190614b9f565b60f81b8183815181106131a7576131a661477c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131e39190614998565b9450613161565b8093505050505b919050565b50505050565b50505050565b60008082905060005b845181101561326c5760008582815181106132295761322861477c565b5b6020026020010151905080831161324b576132448382613768565b9250613258565b6132558184613768565b92505b508080613264906145f0565b91505061320b565b508091505092915050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036132ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f6906154af565b60405180910390fd5b61330881612578565b15613348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333f9061551b565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000328311156133ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a2906155ad565b60405180910390fd5b6133b860008583866131f6565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516134b59190615162565b6fffffffffffffffffffffffffffffffff1681526020018583602001516134dc9190615162565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561374b57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46136eb6000888488612e5f565b61372a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372190614aa7565b60405180910390fd5b8180613735906145f0565b9250508080613743906145f0565b91505061367a565b508060008190555061376060008785886131fc565b505050505050565b600082600052816020526040600020905092915050565b82805461378b90614348565b90600052602060002090601f0160209004810192826137ad57600085556137f4565b82601f106137c657805160ff19168380011785556137f4565b828001600101855582156137f4579182015b828111156137f35782518255916020019190600101906137d8565b5b509050613801919061383f565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613858576000816000905550600101613840565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138a581613870565b81146138b057600080fd5b50565b6000813590506138c28161389c565b92915050565b6000602082840312156138de576138dd613866565b5b60006138ec848285016138b3565b91505092915050565b60008115159050919050565b61390a816138f5565b82525050565b60006020820190506139256000830184613901565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61397e82613935565b810181811067ffffffffffffffff8211171561399d5761399c613946565b5b80604052505050565b60006139b061385c565b90506139bc8282613975565b919050565b600067ffffffffffffffff8211156139dc576139db613946565b5b6139e582613935565b9050602081019050919050565b82818337600083830152505050565b6000613a14613a0f846139c1565b6139a6565b905082815260208101848484011115613a3057613a2f613930565b5b613a3b8482856139f2565b509392505050565b600082601f830112613a5857613a5761392b565b5b8135613a68848260208601613a01565b91505092915050565b600060208284031215613a8757613a86613866565b5b600082013567ffffffffffffffff811115613aa557613aa461386b565b5b613ab184828501613a43565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613af4578082015181840152602081019050613ad9565b83811115613b03576000848401525b50505050565b6000613b1482613aba565b613b1e8185613ac5565b9350613b2e818560208601613ad6565b613b3781613935565b840191505092915050565b60006020820190508181036000830152613b5c8184613b09565b905092915050565b6000819050919050565b613b7781613b64565b8114613b8257600080fd5b50565b600081359050613b9481613b6e565b92915050565b600060208284031215613bb057613baf613866565b5b6000613bbe84828501613b85565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bf282613bc7565b9050919050565b613c0281613be7565b82525050565b6000602082019050613c1d6000830184613bf9565b92915050565b613c2c81613be7565b8114613c3757600080fd5b50565b600081359050613c4981613c23565b92915050565b60008060408385031215613c6657613c65613866565b5b6000613c7485828601613c3a565b9250506020613c8585828601613b85565b9150509250929050565b613c9881613b64565b82525050565b6000602082019050613cb36000830184613c8f565b92915050565b6000613cc482613bc7565b9050919050565b613cd481613cb9565b8114613cdf57600080fd5b50565b600081359050613cf181613ccb565b92915050565b600060208284031215613d0d57613d0c613866565b5b6000613d1b84828501613ce2565b91505092915050565b600080600060608486031215613d3d57613d3c613866565b5b6000613d4b86828701613c3a565b9350506020613d5c86828701613c3a565b9250506040613d6d86828701613b85565b9150509250925092565b6000819050919050565b613d8a81613d77565b82525050565b6000602082019050613da56000830184613d81565b92915050565b600060208284031215613dc157613dc0613866565b5b6000613dcf84828501613c3a565b91505092915050565b600067ffffffffffffffff821115613df357613df2613946565b5b602082029050602081019050919050565b600080fd5b6000613e1c613e1784613dd8565b6139a6565b90508083825260208201905060208402830185811115613e3f57613e3e613e04565b5b835b81811015613e685780613e548882613c3a565b845260208401935050602081019050613e41565b5050509392505050565b600082601f830112613e8757613e8661392b565b5b8135613e97848260208601613e09565b91505092915050565b600060208284031215613eb657613eb5613866565b5b600082013567ffffffffffffffff811115613ed457613ed361386b565b5b613ee084828501613e72565b91505092915050565b600080fd5b60008083601f840112613f0457613f0361392b565b5b8235905067ffffffffffffffff811115613f2157613f20613ee9565b5b602083019150836020820283011115613f3d57613f3c613e04565b5b9250929050565b600080600060408486031215613f5d57613f5c613866565b5b6000613f6b86828701613c3a565b935050602084013567ffffffffffffffff811115613f8c57613f8b61386b565b5b613f9886828701613eee565b92509250509250925092565b613fad816138f5565b8114613fb857600080fd5b50565b600081359050613fca81613fa4565b92915050565b60008060408385031215613fe757613fe6613866565b5b6000613ff585828601613c3a565b925050602061400685828601613fbb565b9150509250929050565b600067ffffffffffffffff82111561402b5761402a613946565b5b61403482613935565b9050602081019050919050565b600061405461404f84614010565b6139a6565b9050828152602081018484840111156140705761406f613930565b5b61407b8482856139f2565b509392505050565b600082601f8301126140985761409761392b565b5b81356140a8848260208601614041565b91505092915050565b600080600080608085870312156140cb576140ca613866565b5b60006140d987828801613c3a565b94505060206140ea87828801613c3a565b93505060406140fb87828801613b85565b925050606085013567ffffffffffffffff81111561411c5761411b61386b565b5b61412887828801614083565b91505092959194509250565b60008060006040848603121561414d5761414c613866565b5b600061415b86828701613b85565b935050602084013567ffffffffffffffff81111561417c5761417b61386b565b5b61418886828701613eee565b92509250509250925092565b600080604083850312156141ab576141aa613866565b5b60006141b985828601613b85565b92505060206141ca85828601613c3a565b9150509250929050565b6141dd81613d77565b81146141e857600080fd5b50565b6000813590506141fa816141d4565b92915050565b60006020828403121561421657614215613866565b5b6000614224848285016141eb565b91505092915050565b6000806040838503121561424457614243613866565b5b600061425285828601613c3a565b925050602061426385828601613c3a565b9150509250929050565b6000806040838503121561428457614283613866565b5b600061429285828601613b85565b92505060206142a385828601613b85565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006142e3602083613ac5565b91506142ee826142ad565b602082019050919050565b60006020820190508181036000830152614312816142d6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061436057607f821691505b60208210810361437357614372614319565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b60006143d5602d83613ac5565b91506143e082614379565b604082019050919050565b60006020820190508181036000830152614404816143c8565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000614467602283613ac5565b91506144728261440b565b604082019050919050565b600060208201905081810360008301526144968161445a565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b60006144f9603983613ac5565b91506145048261449d565b604082019050919050565b60006020820190508181036000830152614528816144ec565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b600061458b602283613ac5565b91506145968261452f565b604082019050919050565b600060208201905081810360008301526145ba8161457e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006145fb82613b64565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361462d5761462c6145c1565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000614694602e83613ac5565b915061469f82614638565b604082019050919050565b600060208201905081810360008301526146c381614687565b9050919050565b600081905092915050565b50565b60006146e56000836146ca565b91506146f0826146d5565b600082019050919050565b6000614706826146d8565b9150819050919050565b7f5472616e73666572206661696c00000000000000000000000000000000000000600082015250565b6000614746600d83613ac5565b915061475182614710565b602082019050919050565b6000602082019050818103600083015261477581614739565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006060820190506147c06000830186613bf9565b6147cd6020830185613bf9565b6147da6040830184613c8f565b949350505050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b600061483e602383613ac5565b9150614849826147e2565b604082019050919050565b6000602082019050818103600083015261486d81614831565b9050919050565b60008160601b9050919050565b600061488c82614874565b9050919050565b600061489e82614881565b9050919050565b6148b66148b182613be7565b614893565b82525050565b60006148c882846148a5565b60148201915081905092915050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614933602b83613ac5565b915061493e826148d7565b604082019050919050565b6000602082019050818103600083015261496281614926565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006149a382613b64565b91506149ae83613b64565b9250826149be576149bd614969565b5b828204905092915050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b60006149ff601a83613ac5565b9150614a0a826149c9565b602082019050919050565b60006020820190508181036000830152614a2e816149f2565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000614a91603383613ac5565b9150614a9c82614a35565b604082019050919050565b60006020820190508181036000830152614ac081614a84565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614afd601f83613ac5565b9150614b0882614ac7565b602082019050919050565b60006020820190508181036000830152614b2c81614af0565b9050919050565b7f53616c6520697320636c6f736564000000000000000000000000000000000000600082015250565b6000614b69600e83613ac5565b9150614b7482614b33565b602082019050919050565b60006020820190508181036000830152614b9881614b5c565b9050919050565b6000614baa82613b64565b9150614bb583613b64565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614bea57614be96145c1565b5b828201905092915050565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b6000614c2b601283613ac5565b9150614c3682614bf5565b602082019050919050565b60006020820190508181036000830152614c5a81614c1e565b9050919050565b7f45786365656473207472616e73616374696f6e206d6178696d756d0000000000600082015250565b6000614c97601b83613ac5565b9150614ca282614c61565b602082019050919050565b60006020820190508181036000830152614cc681614c8a565b9050919050565b6000614cd882613b64565b9150614ce383613b64565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d1c57614d1b6145c1565b5b828202905092915050565b7f496e636f727265637420616d6f756e74206f66204554482073656e7400000000600082015250565b6000614d5d601c83613ac5565b9150614d6882614d27565b602082019050919050565b60006020820190508181036000830152614d8c81614d50565b9050919050565b7f50757263686173696e67206f6e6c7920617661696c61626c6520666f7220776860008201527f6974656c69737465642061646472657373657300000000000000000000000000602082015250565b6000614def603383613ac5565b9150614dfa82614d93565b604082019050919050565b60006020820190508181036000830152614e1e81614de2565b9050919050565b6000608082019050614e3a6000830187613bf9565b614e476020830186613c8f565b614e546040830185613bf9565b614e616060830184613c8f565b95945050505050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614ec6602f83613ac5565b9150614ed182614e6a565b604082019050919050565b60006020820190508181036000830152614ef581614eb9565b9050919050565b600081905092915050565b6000614f1282613aba565b614f1c8185614efc565b9350614f2c818560208601613ad6565b80840191505092915050565b6000614f448285614f07565b9150614f508284614f07565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614fb8602683613ac5565b9150614fc382614f5c565b604082019050919050565b60006020820190508181036000830152614fe781614fab565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b600061504a603283613ac5565b915061505582614fee565b604082019050919050565b600060208201905081810360008301526150798161503d565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006150dc602683613ac5565b91506150e782615080565b604082019050919050565b6000602082019050818103600083015261510b816150cf565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600061513982615112565b915061514483615112565b925082821015615157576151566145c1565b5b828203905092915050565b600061516d82615112565b915061517883615112565b9250826fffffffffffffffffffffffffffffffff0382111561519d5761519c6145c1565b5b828201905092915050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000615204602a83613ac5565b915061520f826151a8565b604082019050919050565b60006020820190508181036000830152615233816151f7565b9050919050565b600061524582613b64565b915061525083613b64565b925082821015615263576152626145c1565b5b828203905092915050565b600061527982613b64565b91506000820361528c5761528b6145c1565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b60006152f3602f83613ac5565b91506152fe82615297565b604082019050919050565b60006020820190508181036000830152615322816152e6565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061535082615329565b61535a8185615334565b935061536a818560208601613ad6565b61537381613935565b840191505092915050565b60006080820190506153936000830187613bf9565b6153a06020830186613bf9565b6153ad6040830185613c8f565b81810360608301526153bf8184615345565b905095945050505050565b6000815190506153d98161389c565b92915050565b6000602082840312156153f5576153f4613866565b5b6000615403848285016153ca565b91505092915050565b600061541782613b64565b915061542283613b64565b92508261543257615431614969565b5b828206905092915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615499602183613ac5565b91506154a48261543d565b604082019050919050565b600060208201905081810360008301526154c88161548c565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b6000615505601d83613ac5565b9150615510826154cf565b602082019050919050565b60006020820190508181036000830152615534816154f8565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b6000615597602283613ac5565b91506155a28261553b565b604082019050919050565b600060208201905081810360008301526155c68161558a565b905091905056fea2646970667358221220d0fe81067b47f7d65ff9cef7b5c97a895d19c86c983670953d3eb1250e30c28364736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000a688906bd8b00000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000081fe0adb11c01d3ab91f0a478b9de71083e4806700000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000018434558204e6576657220456e64696e67205469636b65747300000000000000000000000000000000000000000000000000000000000000000000000000000004434e455400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f75732d63656e7472616c312d636578312d3333323331392e636c6f756466756e6374696f6e732e6e65742f6765742d697066733f746f6b656e69643d00000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): CEX Never Ending Tickets
Arg [1] : symbol (string): CNET
Arg [2] : _alPrice (uint256): 750000000000000000
Arg [3] : _maxSupply (uint256): 100
Arg [4] : _maxPerTx (uint256): 10
Arg [5] : _payee (address): 0x81FE0aDB11c01D3ab91F0a478B9De71083e48067
Arg [6] : _uri (string): https://us-central1-cex1-332319.cloudfunctions.net/get-ipfs?tokenid=
-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 0000000000000000000000000000000000000000000000000a688906bd8b0000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [5] : 00000000000000000000000081fe0adb11c01d3ab91f0a478b9de71083e48067
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000018
Arg [8] : 434558204e6576657220456e64696e67205469636b6574730000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [10] : 434e455400000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000044
Arg [12] : 68747470733a2f2f75732d63656e7472616c312d636578312d3333323331392e
Arg [13] : 636c6f756466756e6374696f6e732e6e65742f6765742d697066733f746f6b65
Arg [14] : 6e69643d00000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
148:4668:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3880:358:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3661:80:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5544:92:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7024:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6602:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4677:92:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2486::5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;355:22:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4775:38;;;:::i;:::-;;4474:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7842:136:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;302:25:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3100:721:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4366:102:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4050:81;;;;;;;;;;;;;:::i;:::-;;623:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3452:203;;;;;;;;;;;;;:::i;:::-;;3747:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8036:151:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3089:160:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3969:75;;;;;;;;;;;;;:::i;:::-;;2642:174:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5374:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1731:240:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4289:208:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:13;;;;;;;;;;;;;:::i;:::-;;1029:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5692:96:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;567:20:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1620:105;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7283:269:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;543:18:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8245:300:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1981:1102:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5846:377:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3255:191:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;223:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12517:43:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4137:84:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4575:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7610:178:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;826:110:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1911:198:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4227:133:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;253:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3880:358:5;4002:4;4044:25;4029:40;;;:11;:40;;;;:98;;;;4094:33;4079:48;;;:11;:48;;;;4029:98;:158;;;;4152:35;4137:50;;;:11;:50;;;;4029:158;:204;;;;4197:36;4221:11;4197:23;:36::i;:::-;4029:204;4016:217;;3880:358;;;:::o;3661:80:1:-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3730:4:1::1;3724:3;:10;;;;;;;;;;;;:::i;:::-;;3661:80:::0;:::o;5544:92:5:-;5598:13;5626:5;5619:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5544:92;:::o;7024:200::-;7092:7;7115:16;7123:7;7115;:16::i;:::-;7107:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;7195:15;:24;7211:7;7195:24;;;;;;;;;;;;;;;;;;;;;7188:31;;7024:200;;;:::o;6602:369::-;6670:13;6686:24;6702:7;6686:15;:24::i;:::-;6670:40;;6730:5;6724:11;;:2;:11;;;6716:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;6812:5;6796:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;6821:37;6838:5;6845:12;:10;:12::i;:::-;6821:16;:37::i;:::-;6796:62;6781:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;6938:28;6947:2;6951:7;6960:5;6938:8;:28::i;:::-;6664:307;6602:369;;:::o;4677:92:1:-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4754:8:1::1;4744:7;:18;;;;4677:92:::0;:::o;2486::5:-;2539:7;2561:12;;2554:19;;2486:92;:::o;355:22:1:-;;;;:::o;4775:38::-;:::o;4474:95::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4556:6:1::1;4548:5;;:14;;;;;;;;;;;;;;;;;;4474:95:::0;:::o;7842:136:5:-;7945:28;7955:4;7961:2;7965:7;7945:9;:28::i;:::-;7842:136;;;:::o;302:25:1:-;;;;:::o;3100:721:5:-;3205:7;3238:16;3248:5;3238:9;:16::i;:::-;3230:5;:24;3222:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;3299:22;3324:13;:11;:13::i;:::-;3299:38;;3343:19;3372:25;3421:9;3416:339;3440:14;3436:1;:18;3416:339;;;3469:31;3503:11;:14;3515:1;3503:14;;;;;;;;;;;3469:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3555:1;3529:28;;:9;:14;;;:28;;;3525:87;;3589:9;:14;;;3569:34;;3525:87;3644:5;3623:26;;:17;:26;;;3619:130;;3680:5;3665:11;:20;3661:57;;3706:1;3699:8;;;;;;;;;3661:57;3727:13;;;;;:::i;:::-;;;;3619:130;3461:294;3456:3;;;;;:::i;:::-;;;;3416:339;;;;3760:56;;;;;;;;;;:::i;:::-;;;;;;;;3100:721;;;;;:::o;4366:102:1:-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4438:8:1::1;4452;4438:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4366:102:::0;:::o;4050:81::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4116:8:1::1;;;;;;;;;;;4115:9;4104:8;;:20;;;;;;;;;;;;;;;;;;4050:81::o:0;623:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;3452:203::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3501:15:1::1;3519:21;3501:39;;3551:12;3568;:10;:12::i;:::-;:17;;3593:7;3568:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3550:55;;;3623:7;3615:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;3491:164;;3452:203::o:0;3747:216::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3842:9:1::1;3838:119;3861:18;:25;3857:1;:29;3838:119;;;3941:5;3906:9;:32;3916:18;3935:1;3916:21;;;;;;;;:::i;:::-;;;;;;;;3906:32;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;3888:3;;;;;:::i;:::-;;;;3838:119;;;;3747:216:::0;:::o;8036:151:5:-;8143:39;8160:4;8166:2;8170:7;8143:39;;;;;;;;;;;;:16;:39::i;:::-;8036:151;;;:::o;3089:160:1:-;3139:47;3152:12;:10;:12::i;:::-;3174:1;3178:7;3139:12;:47::i;:::-;3201:41;3208:12;:10;:12::i;:::-;3230:1;3234:7;3201:41;;;;;;;;:::i;:::-;;;;;;;;3089:160;:::o;3969:75::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4031:6:1::1;;;;;;;;;;;4030:7;4021:6;;:16;;;;;;;;;;;;;;;;;;3969:75::o:0;2642:174:5:-;2709:7;2740:13;:11;:13::i;:::-;2732:5;:21;2724:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;2806:5;2799:12;;2642:174;;;:::o;5374:116::-;5438:7;5460:20;5472:7;5460:11;:20::i;:::-;:25;;;5453:32;;5374:116;;;:::o;1731:240:1:-;1827:4;1843:12;1885:10;1868:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;1858:39;;;;;;1843:54;;1914:50;1933:12;;1914:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1947:10;;1959:4;1914:18;:50::i;:::-;1907:57;;;1731:240;;;;;:::o;4289:208:5:-;4353:7;4393:1;4376:19;;:5;:19;;;4368:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;4464:12;:19;4477:5;4464:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;4456:36;;4449:43;;4289:208;;;:::o;1661:101:13:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;1029:85::-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;5692:96:5:-;5748:13;5776:7;5769:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5692:96;:::o;567:20:1:-;;;;;;;;;;;;;:::o;1620:105::-;1664:7;1690:8;1715:2;1699:13;:11;:13::i;:::-;:18;;;;:::i;:::-;1690:28;;;;;;;;:::i;:::-;;;;;;;;;;1683:35;;1620:105;:::o;7283:269:5:-;7385:12;:10;:12::i;:::-;7373:24;;:8;:24;;;7365:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;7480:8;7435:18;:32;7454:12;:10;:12::i;:::-;7435:32;;;;;;;;;;;;;;;:42;7468:8;7435:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;7528:8;7499:48;;7514:12;:10;:12::i;:::-;7499:48;;;7538:8;7499:48;;;;;;:::i;:::-;;;;;;;;7283:269;;:::o;543:18:1:-;;;;;;;;;;;;;:::o;8245:300:5:-;8376:28;8386:4;8392:2;8396:7;8376:9;:28::i;:::-;8425:48;8448:4;8454:2;8458:7;8467:5;8425:22;:48::i;:::-;8410:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;8245:300;;;;:::o;1981:1102:1:-;1680:1:14;2259:7;;:19;2251:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1680:1;2389:7;:18;;;;2092:8:1::1;;;;;;;;;;;2084:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;2163:9;;2153:6;2137:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;2129:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;2223:8;;2213:6;:18;;2205:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;2317:41;2331:12;:10;:12::i;:::-;2345;;2317:13;:41::i;:::-;:69;;;;;2363:9;:23;2373:12;:10;:12::i;:::-;2363:23;;;;;;;;;;;;;;;;;;;;;;;;;2362:24;2317:69;2314:486;;;2500:6;2490:7;;:16;;;;:::i;:::-;2477:9;:29;2469:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;2592:4;2566:9;:23;2576:12;:10;:12::i;:::-;2566:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;2314:486;;;2636:6;;;;;;;;;;;2635:7;2627:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;2750:6;2733:14;:12;:14::i;:::-;:23;;;;:::i;:::-;2720:9;:36;2712:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;2314:486;2831:12;2848:5;;;;;;;;;;;:10;;2866:9;2848:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2830:50;;;2898:7;2890:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;2977:31;2987:12;:10;:12::i;:::-;3001:6;2977:9;:31::i;:::-;3023:53;3030:12;:10;:12::i;:::-;3044:9;3055:12;:10;:12::i;:::-;3069:6;3023:53;;;;;;;;;:::i;:::-;;;;;;;;2074:1009;1637:1:14::0;2562:7;:22;;;;1981:1102:1;;;:::o;5846:377:5:-;5939:13;5977:16;5985:7;5977;:16::i;:::-;5962:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;6063:21;6087:10;:8;:10::i;:::-;6063:34;;6140:1;6122:7;6116:21;:25;:102;;;;;;;;;;;;;;;;;6176:7;6185:18;:7;:16;:18::i;:::-;6159:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6116:102;6103:115;;;5846:377;;;:::o;3255:191:1:-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3368:9:1::1;;3358:6;3342:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;3334:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;3410:29;3420:10;3432:6;3410:9;:29::i;:::-;3255:191:::0;;:::o;223:24::-;;;;:::o;12517:43:5:-;;;;:::o;4137:84:1:-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4210:4:1::1;4197:10;:17;;;;4137:84:::0;:::o;4575:96::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4655:9:1::1;4644:8;:20;;;;4575:96:::0;:::o;7610:178:5:-;7727:4;7748:18;:25;7767:5;7748:25;;;;;;;;;;;;;;;:35;7774:8;7748:35;;;;;;;;;;;;;;;;;;;;;;;;;7741:42;;7610:178;;;;:::o;826:110:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1911:198:13:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;::::0;1991:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;4227:133:1:-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4345:8:1::1;4317;4326:15;4317:25;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;4227:133:::0;;:::o;253:23::-;;;;:::o;763:155:3:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;588:96:2:-;641:7;667:10;660:17;;588:96;:::o;8775:103:5:-;8832:4;8861:12;;8851:7;:22;8844:29;;8775:103;;;:::o;12348:165::-;12467:2;12440:15;:24;12456:7;12440:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;12500:7;12496:2;12480:28;;12489:5;12480:28;;;;;;;;;;;;12348:165;;;:::o;10763:1486::-;10855:35;10893:20;10905:7;10893:11;:20::i;:::-;10855:58;;10920:22;10962:13;:18;;;10946:34;;:12;:10;:12::i;:::-;:34;;;:80;;;;11014:12;:10;:12::i;:::-;10990:36;;:20;11002:7;10990:11;:20::i;:::-;:36;;;10946:80;:140;;;;11036:50;11053:13;:18;;;11073:12;:10;:12::i;:::-;11036:16;:50::i;:::-;10946:140;10920:167;;11109:17;11094:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;11236:4;11214:26;;:13;:18;;;:26;;;11199:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;11375:43;11397:4;11403:2;11407:7;11416:1;11375:21;:43::i;:::-;11472:49;11489:1;11493:7;11502:13;:18;;;11472:8;:49::i;:::-;11558:1;11528:12;:18;11541:4;11528:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;11593:1;11565:12;:16;11578:2;11565:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;11623:43;;;;;;;;11638:2;11623:43;;;;;;11649:15;11623:43;;;;;11600:11;:20;11612:7;11600:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11890:19;11922:1;11912:7;:11;;;;:::i;:::-;11890:33;;11974:1;11933:43;;:11;:24;11945:11;11933:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;11929:229;;11990:20;11998:11;11990:7;:20::i;:::-;11986:166;;;12049:94;;;;;;;;12075:13;:18;;;12049:94;;;;;;12105:13;:28;;;12049:94;;;;;12022:11;:24;12034:11;12022:24;;;;;;;;;;;:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11986:166;11929:229;12188:7;12184:2;12169:27;;12178:4;12169:27;;;;;;;;;;;;12202:42;12223:4;12229:2;12233:7;12242:1;12202:20;:42::i;:::-;10849:1400;;;10763:1486;;;:::o;4739:586::-;4812:21;;:::i;:::-;4851:16;4859:7;4851;:16::i;:::-;4843:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;4921:26;4968:12;4957:7;:23;4953:91;;5036:1;5021:12;5011:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;4990:47;;4953:91;5055:12;5070:7;5055:22;;5050:207;5087:18;5079:4;:26;5050:207;;5123:31;5157:11;:17;5169:4;5157:17;;;;;;;;;;;5123:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5212:1;5186:28;;:9;:14;;;:28;;;5182:69;;5233:9;5226:16;;;;;;;5182:69;5115:142;5107:6;;;;;:::i;:::-;;;;5050:207;;;;5263:57;;;;;;;;;;:::i;:::-;;;;;;;;4739:586;;;;:::o;1154:184:12:-;1275:4;1327;1298:25;1311:5;1318:4;1298:12;:25::i;:::-;:33;1291:40;;1154:184;;;;;:::o;2263:187:13:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2326:124;2263:187;:::o;14018:667:5:-;14150:4;14166:15;:2;:13;;;:15::i;:::-;14162:519;;;14219:2;14203:36;;;14240:12;:10;:12::i;:::-;14254:4;14260:7;14269:5;14203:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14191:452;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14447:1;14430:6;:13;:18;14426:209;;14462:61;;;;;;;;;;:::i;:::-;;;;;;;;14426:209;14605:6;14599:13;14590:6;14586:2;14582:15;14575:38;14191:452;14333:45;;;14323:55;;;:6;:55;;;;14316:62;;;;;14162:519;14670:4;14663:11;;14018:667;;;;;;;:::o;8882:96::-;8946:27;8956:2;8960:8;8946:27;;;;;;;;;;;;:9;:27::i;:::-;8882:96;;:::o;6466:87::-;6517:13;6545:3;6538:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6466:87;:::o;275:703:15:-;331:13;557:1;548:5;:10;544:51;;574:10;;;;;;;;;;;;;;;;;;;;;544:51;604:12;619:5;604:20;;634:14;658:75;673:1;665:4;:9;658:75;;690:8;;;;;:::i;:::-;;;;720:2;712:10;;;;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;742:39;;791:150;807:1;798:5;:10;791:150;;834:1;824:11;;;;;:::i;:::-;;;900:2;892:5;:10;;;;:::i;:::-;879:2;:24;;;;:::i;:::-;866:39;;849:6;856;849:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;928:2;919:11;;;;;:::i;:::-;;;791:150;;;964:6;950:21;;;;;275:703;;;;:::o;15133:136:5:-;;;;;:::o;15641:135::-;;;;;:::o;1689:662:12:-;1772:7;1791:20;1814:4;1791:27;;1833:9;1828:488;1852:5;:12;1848:1;:16;1828:488;;;1885:20;1908:5;1914:1;1908:8;;;;;;;;:::i;:::-;;;;;;;;1885:31;;1950:12;1934;:28;1930:376;;2075:42;2090:12;2104;2075:14;:42::i;:::-;2060:57;;1930:376;;;2249:42;2264:12;2278;2249:14;:42::i;:::-;2234:57;;1930:376;1871:445;1866:3;;;;;:::i;:::-;;;;1828:488;;;;2332:12;2325:19;;;1689:662;;;;:::o;718:413:0:-;778:4;981:12;1090:7;1078:20;1070:28;;1123:1;1116:4;:8;1109:15;;;718:413;;;:::o;9304:1239:5:-;9404:20;9427:12;;9404:35;;9467:1;9453:16;;:2;:16;;;9445:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;9642:21;9650:12;9642:7;:21::i;:::-;9641:22;9633:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;9723:12;9711:8;:24;;9703:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;9781:61;9811:1;9815:2;9819:12;9833:8;9781:21;:61::i;:::-;9849:30;9882:12;:16;9895:2;9882:16;;;;;;;;;;;;;;;9849:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9923:116;;;;;;;;9972:8;9942:11;:19;;;:39;;;;:::i;:::-;9923:116;;;;;;10024:8;9989:11;:24;;;:44;;;;:::i;:::-;9923:116;;;;;9904:12;:16;9917:2;9904:16;;;;;;;;;;;;;;;:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10073:43;;;;;;;;10088:2;10073:43;;;;;;10099:15;10073:43;;;;;10045:11;:25;10057:12;10045:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10123:20;10146:12;10123:35;;10170:9;10165:274;10189:8;10185:1;:12;10165:274;;;10242:12;10238:2;10217:38;;10234:1;10217:38;;;;;;;;;;;;10280:59;10311:1;10315:2;10319:12;10333:5;10280:22;:59::i;:::-;10263:147;;;;;;;;;;;;:::i;:::-;;;;;;;;;10418:14;;;;;:::i;:::-;;;;10199:3;;;;;:::i;:::-;;;;10165:274;;;;10460:12;10445;:27;;;;10478:60;10507:1;10511:2;10515:12;10529:8;10478:20;:60::i;:::-;9398:1145;;;9304:1239;;;:::o;2357:218:12:-;2425:13;2486:1;2480:4;2473:15;2514:1;2508:4;2501:15;2554:4;2548;2538:21;2529:30;;2357:218;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:16:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:117::-;1627:1;1624;1617:12;1641:117;1750:1;1747;1740:12;1764:102;1805:6;1856:2;1852:7;1847:2;1840:5;1836:14;1832:28;1822:38;;1764:102;;;:::o;1872:180::-;1920:77;1917:1;1910:88;2017:4;2014:1;2007:15;2041:4;2038:1;2031:15;2058:281;2141:27;2163:4;2141:27;:::i;:::-;2133:6;2129:40;2271:6;2259:10;2256:22;2235:18;2223:10;2220:34;2217:62;2214:88;;;2282:18;;:::i;:::-;2214:88;2322:10;2318:2;2311:22;2101:238;2058:281;;:::o;2345:129::-;2379:6;2406:20;;:::i;:::-;2396:30;;2435:33;2463:4;2455:6;2435:33;:::i;:::-;2345:129;;;:::o;2480:308::-;2542:4;2632:18;2624:6;2621:30;2618:56;;;2654:18;;:::i;:::-;2618:56;2692:29;2714:6;2692:29;:::i;:::-;2684:37;;2776:4;2770;2766:15;2758:23;;2480:308;;;:::o;2794:154::-;2878:6;2873:3;2868;2855:30;2940:1;2931:6;2926:3;2922:16;2915:27;2794:154;;;:::o;2954:412::-;3032:5;3057:66;3073:49;3115:6;3073:49;:::i;:::-;3057:66;:::i;:::-;3048:75;;3146:6;3139:5;3132:21;3184:4;3177:5;3173:16;3222:3;3213:6;3208:3;3204:16;3201:25;3198:112;;;3229:79;;:::i;:::-;3198:112;3319:41;3353:6;3348:3;3343;3319:41;:::i;:::-;3038:328;2954:412;;;;;:::o;3386:340::-;3442:5;3491:3;3484:4;3476:6;3472:17;3468:27;3458:122;;3499:79;;:::i;:::-;3458:122;3616:6;3603:20;3641:79;3716:3;3708:6;3701:4;3693:6;3689:17;3641:79;:::i;:::-;3632:88;;3448:278;3386:340;;;;:::o;3732:509::-;3801:6;3850:2;3838:9;3829:7;3825:23;3821:32;3818:119;;;3856:79;;:::i;:::-;3818:119;4004:1;3993:9;3989:17;3976:31;4034:18;4026:6;4023:30;4020:117;;;4056:79;;:::i;:::-;4020:117;4161:63;4216:7;4207:6;4196:9;4192:22;4161:63;:::i;:::-;4151:73;;3947:287;3732:509;;;;:::o;4247:99::-;4299:6;4333:5;4327:12;4317:22;;4247:99;;;:::o;4352:169::-;4436:11;4470:6;4465:3;4458:19;4510:4;4505:3;4501:14;4486:29;;4352:169;;;;:::o;4527:307::-;4595:1;4605:113;4619:6;4616:1;4613:13;4605:113;;;4704:1;4699:3;4695:11;4689:18;4685:1;4680:3;4676:11;4669:39;4641:2;4638:1;4634:10;4629:15;;4605:113;;;4736:6;4733:1;4730:13;4727:101;;;4816:1;4807:6;4802:3;4798:16;4791:27;4727:101;4576:258;4527:307;;;:::o;4840:364::-;4928:3;4956:39;4989:5;4956:39;:::i;:::-;5011:71;5075:6;5070:3;5011:71;:::i;:::-;5004:78;;5091:52;5136:6;5131:3;5124:4;5117:5;5113:16;5091:52;:::i;:::-;5168:29;5190:6;5168:29;:::i;:::-;5163:3;5159:39;5152:46;;4932:272;4840:364;;;;:::o;5210:313::-;5323:4;5361:2;5350:9;5346:18;5338:26;;5410:9;5404:4;5400:20;5396:1;5385:9;5381:17;5374:47;5438:78;5511:4;5502:6;5438:78;:::i;:::-;5430:86;;5210:313;;;;:::o;5529:77::-;5566:7;5595:5;5584:16;;5529:77;;;:::o;5612:122::-;5685:24;5703:5;5685:24;:::i;:::-;5678:5;5675:35;5665:63;;5724:1;5721;5714:12;5665:63;5612:122;:::o;5740:139::-;5786:5;5824:6;5811:20;5802:29;;5840:33;5867:5;5840:33;:::i;:::-;5740:139;;;;:::o;5885:329::-;5944:6;5993:2;5981:9;5972:7;5968:23;5964:32;5961:119;;;5999:79;;:::i;:::-;5961:119;6119:1;6144:53;6189:7;6180:6;6169:9;6165:22;6144:53;:::i;:::-;6134:63;;6090:117;5885:329;;;;:::o;6220:126::-;6257:7;6297:42;6290:5;6286:54;6275:65;;6220:126;;;:::o;6352:96::-;6389:7;6418:24;6436:5;6418:24;:::i;:::-;6407:35;;6352:96;;;:::o;6454:118::-;6541:24;6559:5;6541:24;:::i;:::-;6536:3;6529:37;6454:118;;:::o;6578:222::-;6671:4;6709:2;6698:9;6694:18;6686:26;;6722:71;6790:1;6779:9;6775:17;6766:6;6722:71;:::i;:::-;6578:222;;;;:::o;6806:122::-;6879:24;6897:5;6879:24;:::i;:::-;6872:5;6869:35;6859:63;;6918:1;6915;6908:12;6859:63;6806:122;:::o;6934:139::-;6980:5;7018:6;7005:20;6996:29;;7034:33;7061:5;7034:33;:::i;:::-;6934:139;;;;:::o;7079:474::-;7147:6;7155;7204:2;7192:9;7183:7;7179:23;7175:32;7172:119;;;7210:79;;:::i;:::-;7172:119;7330:1;7355:53;7400:7;7391:6;7380:9;7376:22;7355:53;:::i;:::-;7345:63;;7301:117;7457:2;7483:53;7528:7;7519:6;7508:9;7504:22;7483:53;:::i;:::-;7473:63;;7428:118;7079:474;;;;;:::o;7559:118::-;7646:24;7664:5;7646:24;:::i;:::-;7641:3;7634:37;7559:118;;:::o;7683:222::-;7776:4;7814:2;7803:9;7799:18;7791:26;;7827:71;7895:1;7884:9;7880:17;7871:6;7827:71;:::i;:::-;7683:222;;;;:::o;7911:104::-;7956:7;7985:24;8003:5;7985:24;:::i;:::-;7974:35;;7911:104;;;:::o;8021:138::-;8102:32;8128:5;8102:32;:::i;:::-;8095:5;8092:43;8082:71;;8149:1;8146;8139:12;8082:71;8021:138;:::o;8165:155::-;8219:5;8257:6;8244:20;8235:29;;8273:41;8308:5;8273:41;:::i;:::-;8165:155;;;;:::o;8326:345::-;8393:6;8442:2;8430:9;8421:7;8417:23;8413:32;8410:119;;;8448:79;;:::i;:::-;8410:119;8568:1;8593:61;8646:7;8637:6;8626:9;8622:22;8593:61;:::i;:::-;8583:71;;8539:125;8326:345;;;;:::o;8677:619::-;8754:6;8762;8770;8819:2;8807:9;8798:7;8794:23;8790:32;8787:119;;;8825:79;;:::i;:::-;8787:119;8945:1;8970:53;9015:7;9006:6;8995:9;8991:22;8970:53;:::i;:::-;8960:63;;8916:117;9072:2;9098:53;9143:7;9134:6;9123:9;9119:22;9098:53;:::i;:::-;9088:63;;9043:118;9200:2;9226:53;9271:7;9262:6;9251:9;9247:22;9226:53;:::i;:::-;9216:63;;9171:118;8677:619;;;;;:::o;9302:77::-;9339:7;9368:5;9357:16;;9302:77;;;:::o;9385:118::-;9472:24;9490:5;9472:24;:::i;:::-;9467:3;9460:37;9385:118;;:::o;9509:222::-;9602:4;9640:2;9629:9;9625:18;9617:26;;9653:71;9721:1;9710:9;9706:17;9697:6;9653:71;:::i;:::-;9509:222;;;;:::o;9737:329::-;9796:6;9845:2;9833:9;9824:7;9820:23;9816:32;9813:119;;;9851:79;;:::i;:::-;9813:119;9971:1;9996:53;10041:7;10032:6;10021:9;10017:22;9996:53;:::i;:::-;9986:63;;9942:117;9737:329;;;;:::o;10072:311::-;10149:4;10239:18;10231:6;10228:30;10225:56;;;10261:18;;:::i;:::-;10225:56;10311:4;10303:6;10299:17;10291:25;;10371:4;10365;10361:15;10353:23;;10072:311;;;:::o;10389:117::-;10498:1;10495;10488:12;10529:710;10625:5;10650:81;10666:64;10723:6;10666:64;:::i;:::-;10650:81;:::i;:::-;10641:90;;10751:5;10780:6;10773:5;10766:21;10814:4;10807:5;10803:16;10796:23;;10867:4;10859:6;10855:17;10847:6;10843:30;10896:3;10888:6;10885:15;10882:122;;;10915:79;;:::i;:::-;10882:122;11030:6;11013:220;11047:6;11042:3;11039:15;11013:220;;;11122:3;11151:37;11184:3;11172:10;11151:37;:::i;:::-;11146:3;11139:50;11218:4;11213:3;11209:14;11202:21;;11089:144;11073:4;11068:3;11064:14;11057:21;;11013:220;;;11017:21;10631:608;;10529:710;;;;;:::o;11262:370::-;11333:5;11382:3;11375:4;11367:6;11363:17;11359:27;11349:122;;11390:79;;:::i;:::-;11349:122;11507:6;11494:20;11532:94;11622:3;11614:6;11607:4;11599:6;11595:17;11532:94;:::i;:::-;11523:103;;11339:293;11262:370;;;;:::o;11638:539::-;11722:6;11771:2;11759:9;11750:7;11746:23;11742:32;11739:119;;;11777:79;;:::i;:::-;11739:119;11925:1;11914:9;11910:17;11897:31;11955:18;11947:6;11944:30;11941:117;;;11977:79;;:::i;:::-;11941:117;12082:78;12152:7;12143:6;12132:9;12128:22;12082:78;:::i;:::-;12072:88;;11868:302;11638:539;;;;:::o;12183:117::-;12292:1;12289;12282:12;12323:568;12396:8;12406:6;12456:3;12449:4;12441:6;12437:17;12433:27;12423:122;;12464:79;;:::i;:::-;12423:122;12577:6;12564:20;12554:30;;12607:18;12599:6;12596:30;12593:117;;;12629:79;;:::i;:::-;12593:117;12743:4;12735:6;12731:17;12719:29;;12797:3;12789:4;12781:6;12777:17;12767:8;12763:32;12760:41;12757:128;;;12804:79;;:::i;:::-;12757:128;12323:568;;;;;:::o;12897:704::-;12992:6;13000;13008;13057:2;13045:9;13036:7;13032:23;13028:32;13025:119;;;13063:79;;:::i;:::-;13025:119;13183:1;13208:53;13253:7;13244:6;13233:9;13229:22;13208:53;:::i;:::-;13198:63;;13154:117;13338:2;13327:9;13323:18;13310:32;13369:18;13361:6;13358:30;13355:117;;;13391:79;;:::i;:::-;13355:117;13504:80;13576:7;13567:6;13556:9;13552:22;13504:80;:::i;:::-;13486:98;;;;13281:313;12897:704;;;;;:::o;13607:116::-;13677:21;13692:5;13677:21;:::i;:::-;13670:5;13667:32;13657:60;;13713:1;13710;13703:12;13657:60;13607:116;:::o;13729:133::-;13772:5;13810:6;13797:20;13788:29;;13826:30;13850:5;13826:30;:::i;:::-;13729:133;;;;:::o;13868:468::-;13933:6;13941;13990:2;13978:9;13969:7;13965:23;13961:32;13958:119;;;13996:79;;:::i;:::-;13958:119;14116:1;14141:53;14186:7;14177:6;14166:9;14162:22;14141:53;:::i;:::-;14131:63;;14087:117;14243:2;14269:50;14311:7;14302:6;14291:9;14287:22;14269:50;:::i;:::-;14259:60;;14214:115;13868:468;;;;;:::o;14342:307::-;14403:4;14493:18;14485:6;14482:30;14479:56;;;14515:18;;:::i;:::-;14479:56;14553:29;14575:6;14553:29;:::i;:::-;14545:37;;14637:4;14631;14627:15;14619:23;;14342:307;;;:::o;14655:410::-;14732:5;14757:65;14773:48;14814:6;14773:48;:::i;:::-;14757:65;:::i;:::-;14748:74;;14845:6;14838:5;14831:21;14883:4;14876:5;14872:16;14921:3;14912:6;14907:3;14903:16;14900:25;14897:112;;;14928:79;;:::i;:::-;14897:112;15018:41;15052:6;15047:3;15042;15018:41;:::i;:::-;14738:327;14655:410;;;;;:::o;15084:338::-;15139:5;15188:3;15181:4;15173:6;15169:17;15165:27;15155:122;;15196:79;;:::i;:::-;15155:122;15313:6;15300:20;15338:78;15412:3;15404:6;15397:4;15389:6;15385:17;15338:78;:::i;:::-;15329:87;;15145:277;15084:338;;;;:::o;15428:943::-;15523:6;15531;15539;15547;15596:3;15584:9;15575:7;15571:23;15567:33;15564:120;;;15603:79;;:::i;:::-;15564:120;15723:1;15748:53;15793:7;15784:6;15773:9;15769:22;15748:53;:::i;:::-;15738:63;;15694:117;15850:2;15876:53;15921:7;15912:6;15901:9;15897:22;15876:53;:::i;:::-;15866:63;;15821:118;15978:2;16004:53;16049:7;16040:6;16029:9;16025:22;16004:53;:::i;:::-;15994:63;;15949:118;16134:2;16123:9;16119:18;16106:32;16165:18;16157:6;16154:30;16151:117;;;16187:79;;:::i;:::-;16151:117;16292:62;16346:7;16337:6;16326:9;16322:22;16292:62;:::i;:::-;16282:72;;16077:287;15428:943;;;;;;;:::o;16377:704::-;16472:6;16480;16488;16537:2;16525:9;16516:7;16512:23;16508:32;16505:119;;;16543:79;;:::i;:::-;16505:119;16663:1;16688:53;16733:7;16724:6;16713:9;16709:22;16688:53;:::i;:::-;16678:63;;16634:117;16818:2;16807:9;16803:18;16790:32;16849:18;16841:6;16838:30;16835:117;;;16871:79;;:::i;:::-;16835:117;16984:80;17056:7;17047:6;17036:9;17032:22;16984:80;:::i;:::-;16966:98;;;;16761:313;16377:704;;;;;:::o;17087:474::-;17155:6;17163;17212:2;17200:9;17191:7;17187:23;17183:32;17180:119;;;17218:79;;:::i;:::-;17180:119;17338:1;17363:53;17408:7;17399:6;17388:9;17384:22;17363:53;:::i;:::-;17353:63;;17309:117;17465:2;17491:53;17536:7;17527:6;17516:9;17512:22;17491:53;:::i;:::-;17481:63;;17436:118;17087:474;;;;;:::o;17567:122::-;17640:24;17658:5;17640:24;:::i;:::-;17633:5;17630:35;17620:63;;17679:1;17676;17669:12;17620:63;17567:122;:::o;17695:139::-;17741:5;17779:6;17766:20;17757:29;;17795:33;17822:5;17795:33;:::i;:::-;17695:139;;;;:::o;17840:329::-;17899:6;17948:2;17936:9;17927:7;17923:23;17919:32;17916:119;;;17954:79;;:::i;:::-;17916:119;18074:1;18099:53;18144:7;18135:6;18124:9;18120:22;18099:53;:::i;:::-;18089:63;;18045:117;17840:329;;;;:::o;18175:474::-;18243:6;18251;18300:2;18288:9;18279:7;18275:23;18271:32;18268:119;;;18306:79;;:::i;:::-;18268:119;18426:1;18451:53;18496:7;18487:6;18476:9;18472:22;18451:53;:::i;:::-;18441:63;;18397:117;18553:2;18579:53;18624:7;18615:6;18604:9;18600:22;18579:53;:::i;:::-;18569:63;;18524:118;18175:474;;;;;:::o;18655:::-;18723:6;18731;18780:2;18768:9;18759:7;18755:23;18751:32;18748:119;;;18786:79;;:::i;:::-;18748:119;18906:1;18931:53;18976:7;18967:6;18956:9;18952:22;18931:53;:::i;:::-;18921:63;;18877:117;19033:2;19059:53;19104:7;19095:6;19084:9;19080:22;19059:53;:::i;:::-;19049:63;;19004:118;18655:474;;;;;:::o;19135:182::-;19275:34;19271:1;19263:6;19259:14;19252:58;19135:182;:::o;19323:366::-;19465:3;19486:67;19550:2;19545:3;19486:67;:::i;:::-;19479:74;;19562:93;19651:3;19562:93;:::i;:::-;19680:2;19675:3;19671:12;19664:19;;19323:366;;;:::o;19695:419::-;19861:4;19899:2;19888:9;19884:18;19876:26;;19948:9;19942:4;19938:20;19934:1;19923:9;19919:17;19912:47;19976:131;20102:4;19976:131;:::i;:::-;19968:139;;19695:419;;;:::o;20120:180::-;20168:77;20165:1;20158:88;20265:4;20262:1;20255:15;20289:4;20286:1;20279:15;20306:320;20350:6;20387:1;20381:4;20377:12;20367:22;;20434:1;20428:4;20424:12;20455:18;20445:81;;20511:4;20503:6;20499:17;20489:27;;20445:81;20573:2;20565:6;20562:14;20542:18;20539:38;20536:84;;20592:18;;:::i;:::-;20536:84;20357:269;20306:320;;;:::o;20632:232::-;20772:34;20768:1;20760:6;20756:14;20749:58;20841:15;20836:2;20828:6;20824:15;20817:40;20632:232;:::o;20870:366::-;21012:3;21033:67;21097:2;21092:3;21033:67;:::i;:::-;21026:74;;21109:93;21198:3;21109:93;:::i;:::-;21227:2;21222:3;21218:12;21211:19;;20870:366;;;:::o;21242:419::-;21408:4;21446:2;21435:9;21431:18;21423:26;;21495:9;21489:4;21485:20;21481:1;21470:9;21466:17;21459:47;21523:131;21649:4;21523:131;:::i;:::-;21515:139;;21242:419;;;:::o;21667:221::-;21807:34;21803:1;21795:6;21791:14;21784:58;21876:4;21871:2;21863:6;21859:15;21852:29;21667:221;:::o;21894:366::-;22036:3;22057:67;22121:2;22116:3;22057:67;:::i;:::-;22050:74;;22133:93;22222:3;22133:93;:::i;:::-;22251:2;22246:3;22242:12;22235:19;;21894:366;;;:::o;22266:419::-;22432:4;22470:2;22459:9;22455:18;22447:26;;22519:9;22513:4;22509:20;22505:1;22494:9;22490:17;22483:47;22547:131;22673:4;22547:131;:::i;:::-;22539:139;;22266:419;;;:::o;22691:244::-;22831:34;22827:1;22819:6;22815:14;22808:58;22900:27;22895:2;22887:6;22883:15;22876:52;22691:244;:::o;22941:366::-;23083:3;23104:67;23168:2;23163:3;23104:67;:::i;:::-;23097:74;;23180:93;23269:3;23180:93;:::i;:::-;23298:2;23293:3;23289:12;23282:19;;22941:366;;;:::o;23313:419::-;23479:4;23517:2;23506:9;23502:18;23494:26;;23566:9;23560:4;23556:20;23552:1;23541:9;23537:17;23530:47;23594:131;23720:4;23594:131;:::i;:::-;23586:139;;23313:419;;;:::o;23738:221::-;23878:34;23874:1;23866:6;23862:14;23855:58;23947:4;23942:2;23934:6;23930:15;23923:29;23738:221;:::o;23965:366::-;24107:3;24128:67;24192:2;24187:3;24128:67;:::i;:::-;24121:74;;24204:93;24293:3;24204:93;:::i;:::-;24322:2;24317:3;24313:12;24306:19;;23965:366;;;:::o;24337:419::-;24503:4;24541:2;24530:9;24526:18;24518:26;;24590:9;24584:4;24580:20;24576:1;24565:9;24561:17;24554:47;24618:131;24744:4;24618:131;:::i;:::-;24610:139;;24337:419;;;:::o;24762:180::-;24810:77;24807:1;24800:88;24907:4;24904:1;24897:15;24931:4;24928:1;24921:15;24948:233;24987:3;25010:24;25028:5;25010:24;:::i;:::-;25001:33;;25056:66;25049:5;25046:77;25043:103;;25126:18;;:::i;:::-;25043:103;25173:1;25166:5;25162:13;25155:20;;24948:233;;;:::o;25187:::-;25327:34;25323:1;25315:6;25311:14;25304:58;25396:16;25391:2;25383:6;25379:15;25372:41;25187:233;:::o;25426:366::-;25568:3;25589:67;25653:2;25648:3;25589:67;:::i;:::-;25582:74;;25665:93;25754:3;25665:93;:::i;:::-;25783:2;25778:3;25774:12;25767:19;;25426:366;;;:::o;25798:419::-;25964:4;26002:2;25991:9;25987:18;25979:26;;26051:9;26045:4;26041:20;26037:1;26026:9;26022:17;26015:47;26079:131;26205:4;26079:131;:::i;:::-;26071:139;;25798:419;;;:::o;26223:147::-;26324:11;26361:3;26346:18;;26223:147;;;;:::o;26376:114::-;;:::o;26496:398::-;26655:3;26676:83;26757:1;26752:3;26676:83;:::i;:::-;26669:90;;26768:93;26857:3;26768:93;:::i;:::-;26886:1;26881:3;26877:11;26870:18;;26496:398;;;:::o;26900:379::-;27084:3;27106:147;27249:3;27106:147;:::i;:::-;27099:154;;27270:3;27263:10;;26900:379;;;:::o;27285:163::-;27425:15;27421:1;27413:6;27409:14;27402:39;27285:163;:::o;27454:366::-;27596:3;27617:67;27681:2;27676:3;27617:67;:::i;:::-;27610:74;;27693:93;27782:3;27693:93;:::i;:::-;27811:2;27806:3;27802:12;27795:19;;27454:366;;;:::o;27826:419::-;27992:4;28030:2;28019:9;28015:18;28007:26;;28079:9;28073:4;28069:20;28065:1;28054:9;28050:17;28043:47;28107:131;28233:4;28107:131;:::i;:::-;28099:139;;27826:419;;;:::o;28251:180::-;28299:77;28296:1;28289:88;28396:4;28393:1;28386:15;28420:4;28417:1;28410:15;28437:442;28586:4;28624:2;28613:9;28609:18;28601:26;;28637:71;28705:1;28694:9;28690:17;28681:6;28637:71;:::i;:::-;28718:72;28786:2;28775:9;28771:18;28762:6;28718:72;:::i;:::-;28800;28868:2;28857:9;28853:18;28844:6;28800:72;:::i;:::-;28437:442;;;;;;:::o;28885:222::-;29025:34;29021:1;29013:6;29009:14;29002:58;29094:5;29089:2;29081:6;29077:15;29070:30;28885:222;:::o;29113:366::-;29255:3;29276:67;29340:2;29335:3;29276:67;:::i;:::-;29269:74;;29352:93;29441:3;29352:93;:::i;:::-;29470:2;29465:3;29461:12;29454:19;;29113:366;;;:::o;29485:419::-;29651:4;29689:2;29678:9;29674:18;29666:26;;29738:9;29732:4;29728:20;29724:1;29713:9;29709:17;29702:47;29766:131;29892:4;29766:131;:::i;:::-;29758:139;;29485:419;;;:::o;29910:94::-;29943:8;29991:5;29987:2;29983:14;29962:35;;29910:94;;;:::o;30010:::-;30049:7;30078:20;30092:5;30078:20;:::i;:::-;30067:31;;30010:94;;;:::o;30110:100::-;30149:7;30178:26;30198:5;30178:26;:::i;:::-;30167:37;;30110:100;;;:::o;30216:157::-;30321:45;30341:24;30359:5;30341:24;:::i;:::-;30321:45;:::i;:::-;30316:3;30309:58;30216:157;;:::o;30379:256::-;30491:3;30506:75;30577:3;30568:6;30506:75;:::i;:::-;30606:2;30601:3;30597:12;30590:19;;30626:3;30619:10;;30379:256;;;;:::o;30641:230::-;30781:34;30777:1;30769:6;30765:14;30758:58;30850:13;30845:2;30837:6;30833:15;30826:38;30641:230;:::o;30877:366::-;31019:3;31040:67;31104:2;31099:3;31040:67;:::i;:::-;31033:74;;31116:93;31205:3;31116:93;:::i;:::-;31234:2;31229:3;31225:12;31218:19;;30877:366;;;:::o;31249:419::-;31415:4;31453:2;31442:9;31438:18;31430:26;;31502:9;31496:4;31492:20;31488:1;31477:9;31473:17;31466:47;31530:131;31656:4;31530:131;:::i;:::-;31522:139;;31249:419;;;:::o;31674:180::-;31722:77;31719:1;31712:88;31819:4;31816:1;31809:15;31843:4;31840:1;31833:15;31860:185;31900:1;31917:20;31935:1;31917:20;:::i;:::-;31912:25;;31951:20;31969:1;31951:20;:::i;:::-;31946:25;;31990:1;31980:35;;31995:18;;:::i;:::-;31980:35;32037:1;32034;32030:9;32025:14;;31860:185;;;;:::o;32051:176::-;32191:28;32187:1;32179:6;32175:14;32168:52;32051:176;:::o;32233:366::-;32375:3;32396:67;32460:2;32455:3;32396:67;:::i;:::-;32389:74;;32472:93;32561:3;32472:93;:::i;:::-;32590:2;32585:3;32581:12;32574:19;;32233:366;;;:::o;32605:419::-;32771:4;32809:2;32798:9;32794:18;32786:26;;32858:9;32852:4;32848:20;32844:1;32833:9;32829:17;32822:47;32886:131;33012:4;32886:131;:::i;:::-;32878:139;;32605:419;;;:::o;33030:238::-;33170:34;33166:1;33158:6;33154:14;33147:58;33239:21;33234:2;33226:6;33222:15;33215:46;33030:238;:::o;33274:366::-;33416:3;33437:67;33501:2;33496:3;33437:67;:::i;:::-;33430:74;;33513:93;33602:3;33513:93;:::i;:::-;33631:2;33626:3;33622:12;33615:19;;33274:366;;;:::o;33646:419::-;33812:4;33850:2;33839:9;33835:18;33827:26;;33899:9;33893:4;33889:20;33885:1;33874:9;33870:17;33863:47;33927:131;34053:4;33927:131;:::i;:::-;33919:139;;33646:419;;;:::o;34071:181::-;34211:33;34207:1;34199:6;34195:14;34188:57;34071:181;:::o;34258:366::-;34400:3;34421:67;34485:2;34480:3;34421:67;:::i;:::-;34414:74;;34497:93;34586:3;34497:93;:::i;:::-;34615:2;34610:3;34606:12;34599:19;;34258:366;;;:::o;34630:419::-;34796:4;34834:2;34823:9;34819:18;34811:26;;34883:9;34877:4;34873:20;34869:1;34858:9;34854:17;34847:47;34911:131;35037:4;34911:131;:::i;:::-;34903:139;;34630:419;;;:::o;35055:164::-;35195:16;35191:1;35183:6;35179:14;35172:40;35055:164;:::o;35225:366::-;35367:3;35388:67;35452:2;35447:3;35388:67;:::i;:::-;35381:74;;35464:93;35553:3;35464:93;:::i;:::-;35582:2;35577:3;35573:12;35566:19;;35225:366;;;:::o;35597:419::-;35763:4;35801:2;35790:9;35786:18;35778:26;;35850:9;35844:4;35840:20;35836:1;35825:9;35821:17;35814:47;35878:131;36004:4;35878:131;:::i;:::-;35870:139;;35597:419;;;:::o;36022:305::-;36062:3;36081:20;36099:1;36081:20;:::i;:::-;36076:25;;36115:20;36133:1;36115:20;:::i;:::-;36110:25;;36269:1;36201:66;36197:74;36194:1;36191:81;36188:107;;;36275:18;;:::i;:::-;36188:107;36319:1;36316;36312:9;36305:16;;36022:305;;;;:::o;36333:168::-;36473:20;36469:1;36461:6;36457:14;36450:44;36333:168;:::o;36507:366::-;36649:3;36670:67;36734:2;36729:3;36670:67;:::i;:::-;36663:74;;36746:93;36835:3;36746:93;:::i;:::-;36864:2;36859:3;36855:12;36848:19;;36507:366;;;:::o;36879:419::-;37045:4;37083:2;37072:9;37068:18;37060:26;;37132:9;37126:4;37122:20;37118:1;37107:9;37103:17;37096:47;37160:131;37286:4;37160:131;:::i;:::-;37152:139;;36879:419;;;:::o;37304:177::-;37444:29;37440:1;37432:6;37428:14;37421:53;37304:177;:::o;37487:366::-;37629:3;37650:67;37714:2;37709:3;37650:67;:::i;:::-;37643:74;;37726:93;37815:3;37726:93;:::i;:::-;37844:2;37839:3;37835:12;37828:19;;37487:366;;;:::o;37859:419::-;38025:4;38063:2;38052:9;38048:18;38040:26;;38112:9;38106:4;38102:20;38098:1;38087:9;38083:17;38076:47;38140:131;38266:4;38140:131;:::i;:::-;38132:139;;37859:419;;;:::o;38284:348::-;38324:7;38347:20;38365:1;38347:20;:::i;:::-;38342:25;;38381:20;38399:1;38381:20;:::i;:::-;38376:25;;38569:1;38501:66;38497:74;38494:1;38491:81;38486:1;38479:9;38472:17;38468:105;38465:131;;;38576:18;;:::i;:::-;38465:131;38624:1;38621;38617:9;38606:20;;38284:348;;;;:::o;38638:178::-;38778:30;38774:1;38766:6;38762:14;38755:54;38638:178;:::o;38822:366::-;38964:3;38985:67;39049:2;39044:3;38985:67;:::i;:::-;38978:74;;39061:93;39150:3;39061:93;:::i;:::-;39179:2;39174:3;39170:12;39163:19;;38822:366;;;:::o;39194:419::-;39360:4;39398:2;39387:9;39383:18;39375:26;;39447:9;39441:4;39437:20;39433:1;39422:9;39418:17;39411:47;39475:131;39601:4;39475:131;:::i;:::-;39467:139;;39194:419;;;:::o;39619:238::-;39759:34;39755:1;39747:6;39743:14;39736:58;39828:21;39823:2;39815:6;39811:15;39804:46;39619:238;:::o;39863:366::-;40005:3;40026:67;40090:2;40085:3;40026:67;:::i;:::-;40019:74;;40102:93;40191:3;40102:93;:::i;:::-;40220:2;40215:3;40211:12;40204:19;;39863:366;;;:::o;40235:419::-;40401:4;40439:2;40428:9;40424:18;40416:26;;40488:9;40482:4;40478:20;40474:1;40463:9;40459:17;40452:47;40516:131;40642:4;40516:131;:::i;:::-;40508:139;;40235:419;;;:::o;40660:553::-;40837:4;40875:3;40864:9;40860:19;40852:27;;40889:71;40957:1;40946:9;40942:17;40933:6;40889:71;:::i;:::-;40970:72;41038:2;41027:9;41023:18;41014:6;40970:72;:::i;:::-;41052;41120:2;41109:9;41105:18;41096:6;41052:72;:::i;:::-;41134;41202:2;41191:9;41187:18;41178:6;41134:72;:::i;:::-;40660:553;;;;;;;:::o;41219:234::-;41359:34;41355:1;41347:6;41343:14;41336:58;41428:17;41423:2;41415:6;41411:15;41404:42;41219:234;:::o;41459:366::-;41601:3;41622:67;41686:2;41681:3;41622:67;:::i;:::-;41615:74;;41698:93;41787:3;41698:93;:::i;:::-;41816:2;41811:3;41807:12;41800:19;;41459:366;;;:::o;41831:419::-;41997:4;42035:2;42024:9;42020:18;42012:26;;42084:9;42078:4;42074:20;42070:1;42059:9;42055:17;42048:47;42112:131;42238:4;42112:131;:::i;:::-;42104:139;;41831:419;;;:::o;42256:148::-;42358:11;42395:3;42380:18;;42256:148;;;;:::o;42410:377::-;42516:3;42544:39;42577:5;42544:39;:::i;:::-;42599:89;42681:6;42676:3;42599:89;:::i;:::-;42592:96;;42697:52;42742:6;42737:3;42730:4;42723:5;42719:16;42697:52;:::i;:::-;42774:6;42769:3;42765:16;42758:23;;42520:267;42410:377;;;;:::o;42793:435::-;42973:3;42995:95;43086:3;43077:6;42995:95;:::i;:::-;42988:102;;43107:95;43198:3;43189:6;43107:95;:::i;:::-;43100:102;;43219:3;43212:10;;42793:435;;;;;:::o;43234:225::-;43374:34;43370:1;43362:6;43358:14;43351:58;43443:8;43438:2;43430:6;43426:15;43419:33;43234:225;:::o;43465:366::-;43607:3;43628:67;43692:2;43687:3;43628:67;:::i;:::-;43621:74;;43704:93;43793:3;43704:93;:::i;:::-;43822:2;43817:3;43813:12;43806:19;;43465:366;;;:::o;43837:419::-;44003:4;44041:2;44030:9;44026:18;44018:26;;44090:9;44084:4;44080:20;44076:1;44065:9;44061:17;44054:47;44118:131;44244:4;44118:131;:::i;:::-;44110:139;;43837:419;;;:::o;44262:237::-;44402:34;44398:1;44390:6;44386:14;44379:58;44471:20;44466:2;44458:6;44454:15;44447:45;44262:237;:::o;44505:366::-;44647:3;44668:67;44732:2;44727:3;44668:67;:::i;:::-;44661:74;;44744:93;44833:3;44744:93;:::i;:::-;44862:2;44857:3;44853:12;44846:19;;44505:366;;;:::o;44877:419::-;45043:4;45081:2;45070:9;45066:18;45058:26;;45130:9;45124:4;45120:20;45116:1;45105:9;45101:17;45094:47;45158:131;45284:4;45158:131;:::i;:::-;45150:139;;44877:419;;;:::o;45302:225::-;45442:34;45438:1;45430:6;45426:14;45419:58;45511:8;45506:2;45498:6;45494:15;45487:33;45302:225;:::o;45533:366::-;45675:3;45696:67;45760:2;45755:3;45696:67;:::i;:::-;45689:74;;45772:93;45861:3;45772:93;:::i;:::-;45890:2;45885:3;45881:12;45874:19;;45533:366;;;:::o;45905:419::-;46071:4;46109:2;46098:9;46094:18;46086:26;;46158:9;46152:4;46148:20;46144:1;46133:9;46129:17;46122:47;46186:131;46312:4;46186:131;:::i;:::-;46178:139;;45905:419;;;:::o;46330:118::-;46367:7;46407:34;46400:5;46396:46;46385:57;;46330:118;;;:::o;46454:191::-;46494:4;46514:20;46532:1;46514:20;:::i;:::-;46509:25;;46548:20;46566:1;46548:20;:::i;:::-;46543:25;;46587:1;46584;46581:8;46578:34;;;46592:18;;:::i;:::-;46578:34;46637:1;46634;46630:9;46622:17;;46454:191;;;;:::o;46651:273::-;46691:3;46710:20;46728:1;46710:20;:::i;:::-;46705:25;;46744:20;46762:1;46744:20;:::i;:::-;46739:25;;46866:1;46830:34;46826:42;46823:1;46820:49;46817:75;;;46872:18;;:::i;:::-;46817:75;46916:1;46913;46909:9;46902:16;;46651:273;;;;:::o;46930:229::-;47070:34;47066:1;47058:6;47054:14;47047:58;47139:12;47134:2;47126:6;47122:15;47115:37;46930:229;:::o;47165:366::-;47307:3;47328:67;47392:2;47387:3;47328:67;:::i;:::-;47321:74;;47404:93;47493:3;47404:93;:::i;:::-;47522:2;47517:3;47513:12;47506:19;;47165:366;;;:::o;47537:419::-;47703:4;47741:2;47730:9;47726:18;47718:26;;47790:9;47784:4;47780:20;47776:1;47765:9;47761:17;47754:47;47818:131;47944:4;47818:131;:::i;:::-;47810:139;;47537:419;;;:::o;47962:191::-;48002:4;48022:20;48040:1;48022:20;:::i;:::-;48017:25;;48056:20;48074:1;48056:20;:::i;:::-;48051:25;;48095:1;48092;48089:8;48086:34;;;48100:18;;:::i;:::-;48086:34;48145:1;48142;48138:9;48130:17;;47962:191;;;;:::o;48159:171::-;48198:3;48221:24;48239:5;48221:24;:::i;:::-;48212:33;;48267:4;48260:5;48257:15;48254:41;;48275:18;;:::i;:::-;48254:41;48322:1;48315:5;48311:13;48304:20;;48159:171;;;:::o;48336:234::-;48476:34;48472:1;48464:6;48460:14;48453:58;48545:17;48540:2;48532:6;48528:15;48521:42;48336:234;:::o;48576:366::-;48718:3;48739:67;48803:2;48798:3;48739:67;:::i;:::-;48732:74;;48815:93;48904:3;48815:93;:::i;:::-;48933:2;48928:3;48924:12;48917:19;;48576:366;;;:::o;48948:419::-;49114:4;49152:2;49141:9;49137:18;49129:26;;49201:9;49195:4;49191:20;49187:1;49176:9;49172:17;49165:47;49229:131;49355:4;49229:131;:::i;:::-;49221:139;;48948:419;;;:::o;49373:98::-;49424:6;49458:5;49452:12;49442:22;;49373:98;;;:::o;49477:168::-;49560:11;49594:6;49589:3;49582:19;49634:4;49629:3;49625:14;49610:29;;49477:168;;;;:::o;49651:360::-;49737:3;49765:38;49797:5;49765:38;:::i;:::-;49819:70;49882:6;49877:3;49819:70;:::i;:::-;49812:77;;49898:52;49943:6;49938:3;49931:4;49924:5;49920:16;49898:52;:::i;:::-;49975:29;49997:6;49975:29;:::i;:::-;49970:3;49966:39;49959:46;;49741:270;49651:360;;;;:::o;50017:640::-;50212:4;50250:3;50239:9;50235:19;50227:27;;50264:71;50332:1;50321:9;50317:17;50308:6;50264:71;:::i;:::-;50345:72;50413:2;50402:9;50398:18;50389:6;50345:72;:::i;:::-;50427;50495:2;50484:9;50480:18;50471:6;50427:72;:::i;:::-;50546:9;50540:4;50536:20;50531:2;50520:9;50516:18;50509:48;50574:76;50645:4;50636:6;50574:76;:::i;:::-;50566:84;;50017:640;;;;;;;:::o;50663:141::-;50719:5;50750:6;50744:13;50735:22;;50766:32;50792:5;50766:32;:::i;:::-;50663:141;;;;:::o;50810:349::-;50879:6;50928:2;50916:9;50907:7;50903:23;50899:32;50896:119;;;50934:79;;:::i;:::-;50896:119;51054:1;51079:63;51134:7;51125:6;51114:9;51110:22;51079:63;:::i;:::-;51069:73;;51025:127;50810:349;;;;:::o;51165:176::-;51197:1;51214:20;51232:1;51214:20;:::i;:::-;51209:25;;51248:20;51266:1;51248:20;:::i;:::-;51243:25;;51287:1;51277:35;;51292:18;;:::i;:::-;51277:35;51333:1;51330;51326:9;51321:14;;51165:176;;;;:::o;51347:220::-;51487:34;51483:1;51475:6;51471:14;51464:58;51556:3;51551:2;51543:6;51539:15;51532:28;51347:220;:::o;51573:366::-;51715:3;51736:67;51800:2;51795:3;51736:67;:::i;:::-;51729:74;;51812:93;51901:3;51812:93;:::i;:::-;51930:2;51925:3;51921:12;51914:19;;51573:366;;;:::o;51945:419::-;52111:4;52149:2;52138:9;52134:18;52126:26;;52198:9;52192:4;52188:20;52184:1;52173:9;52169:17;52162:47;52226:131;52352:4;52226:131;:::i;:::-;52218:139;;51945:419;;;:::o;52370:179::-;52510:31;52506:1;52498:6;52494:14;52487:55;52370:179;:::o;52555:366::-;52697:3;52718:67;52782:2;52777:3;52718:67;:::i;:::-;52711:74;;52794:93;52883:3;52794:93;:::i;:::-;52912:2;52907:3;52903:12;52896:19;;52555:366;;;:::o;52927:419::-;53093:4;53131:2;53120:9;53116:18;53108:26;;53180:9;53174:4;53170:20;53166:1;53155:9;53151:17;53144:47;53208:131;53334:4;53208:131;:::i;:::-;53200:139;;52927:419;;;:::o;53352:221::-;53492:34;53488:1;53480:6;53476:14;53469:58;53561:4;53556:2;53548:6;53544:15;53537:29;53352:221;:::o;53579:366::-;53721:3;53742:67;53806:2;53801:3;53742:67;:::i;:::-;53735:74;;53818:93;53907:3;53818:93;:::i;:::-;53936:2;53931:3;53927:12;53920:19;;53579:366;;;:::o;53951:419::-;54117:4;54155:2;54144:9;54140:18;54132:26;;54204:9;54198:4;54194:20;54190:1;54179:9;54175:17;54168:47;54232:131;54358:4;54232:131;:::i;:::-;54224:139;;53951:419;;;:::o
Swarm Source
ipfs://d0fe81067b47f7d65ff9cef7b5c97a895d19c86c983670953d3eb1250e30c283
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.318981 | 6.3048 | $2.01 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.