Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
4,444 PS143
Holders
1,954
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 PS143Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Photosynthesis
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 "./Percentages.sol"; import "./MerkleProof.sol"; contract Photosynthesis is ERC721A, Ownable, ReentrancyGuard, Percentages { bytes32 public merkleRoot; string public PS143_PROVENANCE = "32662m6w333d34312z5o4n0z1u431g1g153q1i07642t085r0u293d2s0f4f1w0m"; IERC721 public ProbablyNothing; // Price Per NFT uint256 public price; uint256 public alPrice; // Max Supply uint256 maxSupply; // Sale States bool public saleOpen; bool public alOnly; // Mint Count Mapping mapping(address => uint256) public mints; uint256 public mintsPerPN = 2; uint256 public mintsPerAL = 2; uint256 public maxPerTx = 10; // Events event minted(address minter, uint256 price, address recipient, uint256 amount); event burned(address from, address to, uint256 id); // wallet splits for withdrawals struct Wallets { uint256 percentage; address wallet; } Wallets[] public wallets; constructor( string memory name, // Photosynthesis string memory symbol, // PS143 uint256 _price, // 70000000000000000 Wei uint256 _alPrice, // 60000000000000000 Wei uint256 _maxSupply, // 8888 string memory _uri, // https://us-central1-photosynthesis2.cloudfunctions.net/get-photosynthesis-metadata?token_id= address PN, // 0xB9aEcB63908c13b6167aD2eab9bAcD7e0DaBa78A address payout1, // Receives 8% pay split 0x19Dd9264c30c9271D301aa1b4Df9a1Ec52BdEe67 address payout2 // Receives 92% pay split 0xb43eebac012cb2f12e1ec258a6ece20a7aa4712f ) ERC721A(name, symbol, 100, _maxSupply) { maxSupply = _maxSupply; price = _price; alPrice = _alPrice; URI = _uri; ProbablyNothing = IERC721(PN); // add payout wallets wallets.push(Wallets(8, payout1)); wallets.push(Wallets(92, payout2)); alOnly = true; } function isAllowListed(address _recipient, bytes32[] calldata _merkleProof) public view returns(bool) { bytes32 leaf = keccak256(abi.encodePacked(_recipient)); bool isal = MerkleProof.verify(_merkleProof, merkleRoot, leaf); return isal; } 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 maximum per transaction"); uint256 mintPrice = price; if(ProbablyNothing.balanceOf(_msgSender()) > 0 && ((mints[_msgSender()] + amount) <= (mintsPerPN * ProbablyNothing.balanceOf(_msgSender())))) { mints[_msgSender()] += amount; mintPrice = alPrice; } else if(isAllowListed(_msgSender(), _merkleProof) && (mints[_msgSender()] + amount <= mintsPerAL)) { require(mints[_msgSender()] + amount <= mintsPerAL, "Amount exceeds max per allow list"); mints[_msgSender()] += amount; mintPrice = alPrice; } else { require(!alOnly, "Allow list only"); } require(msg.value == mintPrice * amount, "Incorrect amount of ETH sent"); _safeMint(_msgSender(), amount); emit minted(_msgSender(), mintPrice * amount, _msgSender(), amount); } function burn(uint256 tokenId) external { transferFrom(_msgSender(), address(0), tokenId); emit burned(_msgSender(), address(0), tokenId); } function ownerMint(uint amount, address _recipient) external onlyOwner { require(totalSupply() + amount <= maxSupply, "Not enough left to mint"); _safeMint(_recipient, amount); emit minted(_msgSender(), 0, _recipient, amount); } function withdraw() external onlyOwner { uint256 balance = address(this).balance; (bool success,) = _msgSender().call{value: balance}(""); require(success, "Transfer fail"); } function splitWithdraw() external onlyOwner { uint256 balance = address(this).balance; uint256 payout1 = percentageOf(balance, wallets[0].percentage); (bool success1,) = wallets[0].wallet.call{value: payout1 }(""); require(success1, 'Transfer fail'); uint256 payout2 = percentageOf(balance, wallets[1].percentage); (bool success2,) = wallets[1].wallet.call{value: payout2 }(""); require(success2, 'Transfer fail'); } function setURI(string memory _uri) external onlyOwner { URI = _uri; } function flipSaleState() external onlyOwner { saleOpen = !saleOpen; } function flipALState() external onlyOwner { alOnly = !alOnly; } function setPN(address _PN) external onlyOwner { ProbablyNothing = IERC721(_PN); } function setALPrice(uint256 _alPrice) external onlyOwner { alPrice = _alPrice; } function setPrice(uint256 _price) external onlyOwner { price = _price; } function setMintsPerPN(uint256 _mintsPerPN) external onlyOwner { mintsPerPN = _mintsPerPN; } function setMintsPerAL(uint256 _mintsPerAL) external onlyOwner { mintsPerAL = _mintsPerAL; } function setMaxPerTX(uint256 _maxPerTx) external onlyOwner { maxPerTx = _maxPerTx; } function setRoot(bytes32 root) external onlyOwner { merkleRoot = root; } function changePaySplits(uint256 indexToChange, uint256 _percentage, address payable _wallet) external onlyOwner { wallets[indexToChange].percentage = _percentage; wallets[indexToChange].wallet = _wallet; } function pay() external 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: UNLICENSED pragma solidity ^0.8.0; contract Percentages{ function percentageOf(uint256 value, uint256 percentage) public pure returns(uint256){ require(value >= 100, "Value must be >= 100"); uint256 onePC = value / 100; return onePC * percentage; } } //36000000000000000 //4500000000000000
// 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":"_price","type":"uint256"},{"internalType":"uint256","name":"_alPrice","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"address","name":"PN","type":"address"},{"internalType":"address","name":"payout1","type":"address"},{"internalType":"address","name":"payout2","type":"address"}],"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":[],"name":"PS143_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ProbablyNothing","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","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":"uint256","name":"indexToChange","type":"uint256"},{"internalType":"uint256","name":"_percentage","type":"uint256"},{"internalType":"address payable","name":"_wallet","type":"address"}],"name":"changePaySplits","outputs":[],"stateMutability":"nonpayable","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":"_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":"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":[{"internalType":"address","name":"","type":"address"}],"name":"mints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintsPerAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintsPerPN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"value","type":"uint256"},{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"percentageOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"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":"_mintsPerAL","type":"uint256"}],"name":"setMintsPerAL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintsPerPN","type":"uint256"}],"name":"setMintsPerPN","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_PN","type":"address"}],"name":"setPN","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","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":[],"name":"splitWithdraw","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"wallets","outputs":[{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"address","name":"wallet","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040526000805560006008556040518060600160405280604081526020016200699860409139600c90805190602001906200003e9291906200043b565b5060026013556002601455600a6015553480156200005b57600080fd5b50604051620069d8380380620069d8833981810160405281019062000081919062000728565b888860648760008111620000cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000c390620008eb565b60405180910390fd5b6000821162000112576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001099062000983565b60405180910390fd5b83600190805190602001906200012a9291906200043b565b508260029080519060200190620001439291906200043b565b508160a08181525050806080818152505050505050620001786200016c6200036d60201b60201c565b6200037560201b60201c565b6001600a819055508460108190555086600e8190555085600f819055508360079080519060200190620001ad9291906200043b565b5082600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060166040518060400160405280600881526020018473ffffffffffffffffffffffffffffffffffffffff1681525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505060166040518060400160405280605c81526020018373ffffffffffffffffffffffffffffffffffffffff1681525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506001601160016101000a81548160ff02191690831515021790555050505050505050505062000a09565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200044990620009d4565b90600052602060002090601f0160209004810192826200046d5760008555620004b9565b82601f106200048857805160ff1916838001178555620004b9565b82800160010185558215620004b9579182015b82811115620004b85782518255916020019190600101906200049b565b5b509050620004c89190620004cc565b5090565b5b80821115620004e7576000816000905550600101620004cd565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620005548262000509565b810181811067ffffffffffffffff821117156200057657620005756200051a565b5b80604052505050565b60006200058b620004eb565b905062000599828262000549565b919050565b600067ffffffffffffffff821115620005bc57620005bb6200051a565b5b620005c78262000509565b9050602081019050919050565b60005b83811015620005f4578082015181840152602081019050620005d7565b8381111562000604576000848401525b50505050565b6000620006216200061b846200059e565b6200057f565b90508281526020810184848401111562000640576200063f62000504565b5b6200064d848285620005d4565b509392505050565b600082601f8301126200066d576200066c620004ff565b5b81516200067f8482602086016200060a565b91505092915050565b6000819050919050565b6200069d8162000688565b8114620006a957600080fd5b50565b600081519050620006bd8162000692565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006f082620006c3565b9050919050565b6200070281620006e3565b81146200070e57600080fd5b50565b6000815190506200072281620006f7565b92915050565b60008060008060008060008060006101208a8c0312156200074e576200074d620004f5565b5b60008a015167ffffffffffffffff8111156200076f576200076e620004fa565b5b6200077d8c828d0162000655565b99505060208a015167ffffffffffffffff811115620007a157620007a0620004fa565b5b620007af8c828d0162000655565b9850506040620007c28c828d01620006ac565b9750506060620007d58c828d01620006ac565b9650506080620007e88c828d01620006ac565b95505060a08a015167ffffffffffffffff8111156200080c576200080b620004fa565b5b6200081a8c828d0162000655565b94505060c06200082d8c828d0162000711565b93505060e0620008408c828d0162000711565b925050610100620008548c828d0162000711565b9150509295985092959850929598565b600082825260208201905092915050565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b6000620008d3602e8362000864565b9150620008e08262000875565b604082019050919050565b600060208201905081810360008301526200090681620008c4565b9050919050565b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b60006200096b60278362000864565b915062000978826200090d565b604082019050919050565b600060208201905081810360008301526200099e816200095c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009ed57607f821691505b60208210810362000a035762000a02620009a5565b5b50919050565b60805160a051615f5e62000a3a6000396000818161336b015281816133940152613ae2015260005050615f5e6000f3fe6080604052600436106102e45760003560e01c80636776216911610190578063b71051e2116100dc578063dab5f34011610095578063e985e9c51161006f578063e985e9c514610ae1578063f1408da914610b1e578063f2fde38b14610b49578063f968adbe14610b72576102e4565b8063dab5f34014610a64578063dd5698c514610a8d578063e5a4756c14610ab8576102e4565b8063b71051e214610951578063b88d4fde1461098e578063ba41b0c6146109b7578063c87b56dd146109d3578063d52c57e014610a10578063d7224ba014610a39576102e4565b8063950dafd511610149578063a035b1fe11610123578063a035b1fe146108bb578063a22cb465146108e6578063a7bd36101461090f578063af573db21461093a576102e4565b8063950dafd51461083c57806395d89b411461086557806399288dbb14610890576102e4565b8063677621691461071957806370a0823114610756578063715018a6146107935780637ad71f72146107aa5780638da5cb5b146107e857806391b7f5ed14610813576102e4565b80631d1e715b1161024f578063410c9612116102085780634674a23c116101e25780634674a23c1461064b5780634f6ccce7146106625780635660f8511461069f5780636352211e146106dc576102e4565b8063410c9612146105ce57806342842e0e146105f957806342966c6814610622576102e4565b80631d1e715b146104e657806323b872dd1461050f5780632eb4a7ab146105385780632f745c591461056357806334918dfd146105a05780633ccfd60b146105b7576102e4565b80630e03ebe9116102a15780630e03ebe9146104095780630fa115161461043257806318160ddd1461045d5780631b8926a9146104885780631b9265b8146104b35780631c3db0d9146104bd576102e4565b806301ffc9a7146102e957806302fe53051461032657806306fdde031461034f578063081812fc1461037a578063095ea7b3146103b75780630afc64fe146103e0575b600080fd5b3480156102f557600080fd5b50610310600480360381019061030b9190614060565b610b9d565b60405161031d91906140a8565b60405180910390f35b34801561033257600080fd5b5061034d60048036038101906103489190614209565b610ce7565b005b34801561035b57600080fd5b50610364610d7d565b60405161037191906142da565b60405180910390f35b34801561038657600080fd5b506103a1600480360381019061039c9190614332565b610e0f565b6040516103ae91906143a0565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d991906143e7565b610e94565b005b3480156103ec57600080fd5b5061040760048036038101906104029190614332565b610fac565b005b34801561041557600080fd5b50610430600480360381019061042b9190614332565b611032565b005b34801561043e57600080fd5b506104476110b8565b6040516104549190614486565b60405180910390f35b34801561046957600080fd5b506104726110de565b60405161047f91906144b0565b60405180910390f35b34801561049457600080fd5b5061049d6110e7565b6040516104aa91906144b0565b60405180910390f35b6104bb6110ed565b005b3480156104c957600080fd5b506104e460048036038101906104df91906144cb565b6110ef565b005b3480156104f257600080fd5b5061050d60048036038101906105089190614536565b6111af565b005b34801561051b57600080fd5b5061053660048036038101906105319190614589565b6112be565b005b34801561054457600080fd5b5061054d6112ce565b60405161055a91906145f5565b60405180910390f35b34801561056f57600080fd5b5061058a600480360381019061058591906143e7565b6112d4565b60405161059791906144b0565b60405180910390f35b3480156105ac57600080fd5b506105b56114d0565b005b3480156105c357600080fd5b506105cc611578565b005b3480156105da57600080fd5b506105e36116b0565b6040516105f091906142da565b60405180910390f35b34801561060557600080fd5b50610620600480360381019061061b9190614589565b61173e565b005b34801561062e57600080fd5b5061064960048036038101906106449190614332565b61175e565b005b34801561065757600080fd5b506106606117b7565b005b34801561066e57600080fd5b5061068960048036038101906106849190614332565b61185f565b60405161069691906144b0565b60405180910390f35b3480156106ab57600080fd5b506106c660048036038101906106c191906144cb565b6118b2565b6040516106d391906144b0565b60405180910390f35b3480156106e857600080fd5b5061070360048036038101906106fe9190614332565b6118ca565b60405161071091906143a0565b60405180910390f35b34801561072557600080fd5b50610740600480360381019061073b9190614670565b6118e0565b60405161074d91906140a8565b60405180910390f35b34801561076257600080fd5b5061077d600480360381019061077891906144cb565b61196a565b60405161078a91906144b0565b60405180910390f35b34801561079f57600080fd5b506107a8611a52565b005b3480156107b657600080fd5b506107d160048036038101906107cc9190614332565b611ada565b6040516107df9291906146d0565b60405180910390f35b3480156107f457600080fd5b506107fd611b2e565b60405161080a91906143a0565b60405180910390f35b34801561081f57600080fd5b5061083a60048036038101906108359190614332565b611b58565b005b34801561084857600080fd5b50610863600480360381019061085e9190614332565b611bde565b005b34801561087157600080fd5b5061087a611c64565b60405161088791906142da565b60405180910390f35b34801561089c57600080fd5b506108a5611cf6565b6040516108b291906140a8565b60405180910390f35b3480156108c757600080fd5b506108d0611d09565b6040516108dd91906144b0565b60405180910390f35b3480156108f257600080fd5b5061090d60048036038101906109089190614725565b611d0f565b005b34801561091b57600080fd5b50610924611e8f565b60405161093191906140a8565b60405180910390f35b34801561094657600080fd5b5061094f611ea2565b005b34801561095d57600080fd5b5061097860048036038101906109739190614765565b612176565b60405161098591906144b0565b60405180910390f35b34801561099a57600080fd5b506109b560048036038101906109b09190614846565b6121e2565b005b6109d160048036038101906109cc91906148c9565b61223e565b005b3480156109df57600080fd5b506109fa60048036038101906109f59190614332565b612822565b604051610a0791906142da565b60405180910390f35b348015610a1c57600080fd5b50610a376004803603810190610a329190614929565b6128c9565b005b348015610a4557600080fd5b50610a4e6129ef565b604051610a5b91906144b0565b60405180910390f35b348015610a7057600080fd5b50610a8b6004803603810190610a869190614995565b6129f5565b005b348015610a9957600080fd5b50610aa2612a7b565b604051610aaf91906144b0565b60405180910390f35b348015610ac457600080fd5b50610adf6004803603810190610ada9190614332565b612a81565b005b348015610aed57600080fd5b50610b086004803603810190610b0391906149c2565b612b07565b604051610b1591906140a8565b60405180910390f35b348015610b2a57600080fd5b50610b33612b9b565b604051610b4091906144b0565b60405180910390f35b348015610b5557600080fd5b50610b706004803603810190610b6b91906144cb565b612ba1565b005b348015610b7e57600080fd5b50610b87612c98565b604051610b9491906144b0565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c6857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cd057507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ce05750610cdf82612c9e565b5b9050919050565b610cef612d08565b73ffffffffffffffffffffffffffffffffffffffff16610d0d611b2e565b73ffffffffffffffffffffffffffffffffffffffff1614610d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5a90614a4e565b60405180910390fd5b8060079080519060200190610d79929190613f17565b5050565b606060018054610d8c90614a9d565b80601f0160208091040260200160405190810160405280929190818152602001828054610db890614a9d565b8015610e055780601f10610dda57610100808354040283529160200191610e05565b820191906000526020600020905b815481529060010190602001808311610de857829003601f168201915b5050505050905090565b6000610e1a82612d10565b610e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5090614b40565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e9f826118ca565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0690614bd2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610f2e612d08565b73ffffffffffffffffffffffffffffffffffffffff161480610f5d5750610f5c81610f57612d08565b612b07565b5b610f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9390614c64565b60405180910390fd5b610fa7838383612d1d565b505050565b610fb4612d08565b73ffffffffffffffffffffffffffffffffffffffff16610fd2611b2e565b73ffffffffffffffffffffffffffffffffffffffff1614611028576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101f90614a4e565b60405180910390fd5b8060148190555050565b61103a612d08565b73ffffffffffffffffffffffffffffffffffffffff16611058611b2e565b73ffffffffffffffffffffffffffffffffffffffff16146110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a590614a4e565b60405180910390fd5b80600f8190555050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054905090565b600f5481565b565b6110f7612d08565b73ffffffffffffffffffffffffffffffffffffffff16611115611b2e565b73ffffffffffffffffffffffffffffffffffffffff161461116b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116290614a4e565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6111b7612d08565b73ffffffffffffffffffffffffffffffffffffffff166111d5611b2e565b73ffffffffffffffffffffffffffffffffffffffff161461122b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122290614a4e565b60405180910390fd5b81601684815481106112405761123f614c84565b5b906000526020600020906002020160000181905550806016848154811061126a57611269614c84565b5b906000526020600020906002020160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b6112c9838383612dcf565b505050565b600b5481565b60006112df8361196a565b8210611320576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131790614d25565b60405180910390fd5b600061132a6110de565b905060008060005b8381101561148e576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461142457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361147a5786840361146b5781955050505050506114ca565b838061147690614d74565b9450505b50808061148690614d74565b915050611332565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c190614e2e565b60405180910390fd5b92915050565b6114d8612d08565b73ffffffffffffffffffffffffffffffffffffffff166114f6611b2e565b73ffffffffffffffffffffffffffffffffffffffff161461154c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154390614a4e565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b611580612d08565b73ffffffffffffffffffffffffffffffffffffffff1661159e611b2e565b73ffffffffffffffffffffffffffffffffffffffff16146115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb90614a4e565b60405180910390fd5b60004790506000611603612d08565b73ffffffffffffffffffffffffffffffffffffffff168260405161162690614e7f565b60006040518083038185875af1925050503d8060008114611663576040519150601f19603f3d011682016040523d82523d6000602084013e611668565b606091505b50509050806116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614ee0565b60405180910390fd5b5050565b600c80546116bd90614a9d565b80601f01602080910402602001604051908101604052809291908181526020018280546116e990614a9d565b80156117365780601f1061170b57610100808354040283529160200191611736565b820191906000526020600020905b81548152906001019060200180831161171957829003601f168201915b505050505081565b611759838383604051806020016040528060008152506121e2565b505050565b611771611769612d08565b6000836112be565b7f4911fc0126af9455d0aa4a23d3cf11a705afa45b85f7721bf29a93ccbbf76a8761179a612d08565b6000836040516117ac93929190614f00565b60405180910390a150565b6117bf612d08565b73ffffffffffffffffffffffffffffffffffffffff166117dd611b2e565b73ffffffffffffffffffffffffffffffffffffffff1614611833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182a90614a4e565b60405180910390fd5b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b60006118696110de565b82106118aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a190614fa9565b60405180910390fd5b819050919050565b60126020528060005260406000206000915090505481565b60006118d582613317565b600001519050919050565b600080846040516020016118f49190615011565b604051602081830303815290604052805190602001209050600061195c858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b548461351a565b905080925050509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d19061509e565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611a5a612d08565b73ffffffffffffffffffffffffffffffffffffffff16611a78611b2e565b73ffffffffffffffffffffffffffffffffffffffff1614611ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac590614a4e565b60405180910390fd5b611ad86000613531565b565b60168181548110611aea57600080fd5b90600052602060002090600202016000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b60612d08565b73ffffffffffffffffffffffffffffffffffffffff16611b7e611b2e565b73ffffffffffffffffffffffffffffffffffffffff1614611bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcb90614a4e565b60405180910390fd5b80600e8190555050565b611be6612d08565b73ffffffffffffffffffffffffffffffffffffffff16611c04611b2e565b73ffffffffffffffffffffffffffffffffffffffff1614611c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5190614a4e565b60405180910390fd5b8060138190555050565b606060028054611c7390614a9d565b80601f0160208091040260200160405190810160405280929190818152602001828054611c9f90614a9d565b8015611cec5780601f10611cc157610100808354040283529160200191611cec565b820191906000526020600020905b815481529060010190602001808311611ccf57829003601f168201915b5050505050905090565b601160009054906101000a900460ff1681565b600e5481565b611d17612d08565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7b9061510a565b60405180910390fd5b8060066000611d91612d08565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e3e612d08565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e8391906140a8565b60405180910390a35050565b601160019054906101000a900460ff1681565b611eaa612d08565b73ffffffffffffffffffffffffffffffffffffffff16611ec8611b2e565b73ffffffffffffffffffffffffffffffffffffffff1614611f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1590614a4e565b60405180910390fd5b60004790506000611f55826016600081548110611f3e57611f3d614c84565b5b906000526020600020906002020160000154612176565b905060006016600081548110611f6e57611f6d614c84565b5b906000526020600020906002020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051611fc390614e7f565b60006040518083038185875af1925050503d8060008114612000576040519150601f19603f3d011682016040523d82523d6000602084013e612005565b606091505b5050905080612049576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204090614ee0565b60405180910390fd5b600061207b84601660018154811061206457612063614c84565b5b906000526020600020906002020160000154612176565b90506000601660018154811061209457612093614c84565b5b906000526020600020906002020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516120e990614e7f565b60006040518083038185875af1925050503d8060008114612126576040519150601f19603f3d011682016040523d82523d6000602084013e61212b565b606091505b505090508061216f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216690614ee0565b60405180910390fd5b5050505050565b600060648310156121bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b390615176565b60405180910390fd5b60006064846121cb91906151c5565b905082816121d991906151f6565b91505092915050565b6121ed848484612dcf565b6121f9848484846135f7565b612238576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222f906152c2565b60405180910390fd5b50505050565b6002600a5403612283576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227a9061532e565b60405180910390fd5b6002600a81905550601160009054906101000a900460ff166122da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d19061539a565b60405180910390fd5b601054836122e66110de565b6122f091906153ba565b1115612331576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123289061545c565b60405180910390fd5b601554831115612376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236d906154c8565b60405180910390fd5b6000600e5490506000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082316123c5612d08565b6040518263ffffffff1660e01b81526004016123e191906143a0565b602060405180830381865afa1580156123fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242291906154fd565b11801561252f5750600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231612470612d08565b6040518263ffffffff1660e01b815260040161248c91906143a0565b602060405180830381865afa1580156124a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cd91906154fd565b6013546124da91906151f6565b84601260006124e7612d08565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461252c91906153ba565b11155b1561259b578360126000612541612d08565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461258a91906153ba565b92505081905550600f549050612760565b6125ad6125a6612d08565b84846118e0565b801561260c575060145484601260006125c4612d08565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461260991906153ba565b11155b1561270e576014548460126000612621612d08565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461266691906153ba565b11156126a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269e9061559c565b60405180910390fd5b83601260006126b4612d08565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126fd91906153ba565b92505081905550600f54905061275f565b601160019054906101000a900460ff161561275e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275590615608565b60405180910390fd5b5b5b838161276c91906151f6565b34146127ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a490615674565b60405180910390fd5b6127be6127b8612d08565b8561377e565b7f58303c2ecff4b8a524f2f8ca478d8683b492b3419026f7199667453c2f15412a6127e7612d08565b85836127f391906151f6565b6127fb612d08565b8760405161280c9493929190615694565b60405180910390a1506001600a81905550505050565b606061282d82612d10565b61286c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128639061574b565b60405180910390fd5b600061287661379c565b9050600081511161289657604051806020016040528060008152506128c1565b806128a08461382e565b6040516020016128b19291906157a7565b6040516020818303038152906040525b915050919050565b6128d1612d08565b73ffffffffffffffffffffffffffffffffffffffff166128ef611b2e565b73ffffffffffffffffffffffffffffffffffffffff1614612945576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293c90614a4e565b60405180910390fd5b601054826129516110de565b61295b91906153ba565b111561299c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299390615817565b60405180910390fd5b6129a6818361377e565b7f58303c2ecff4b8a524f2f8ca478d8683b492b3419026f7199667453c2f15412a6129cf612d08565b600083856040516129e39493929190615872565b60405180910390a15050565b60085481565b6129fd612d08565b73ffffffffffffffffffffffffffffffffffffffff16612a1b611b2e565b73ffffffffffffffffffffffffffffffffffffffff1614612a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6890614a4e565b60405180910390fd5b80600b8190555050565b60135481565b612a89612d08565b73ffffffffffffffffffffffffffffffffffffffff16612aa7611b2e565b73ffffffffffffffffffffffffffffffffffffffff1614612afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af490614a4e565b60405180910390fd5b8060158190555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60145481565b612ba9612d08565b73ffffffffffffffffffffffffffffffffffffffff16612bc7611b2e565b73ffffffffffffffffffffffffffffffffffffffff1614612c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1490614a4e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8390615929565b60405180910390fd5b612c9581613531565b50565b60155481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612dda82613317565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612e01612d08565b73ffffffffffffffffffffffffffffffffffffffff161480612e5d5750612e26612d08565b73ffffffffffffffffffffffffffffffffffffffff16612e4584610e0f565b73ffffffffffffffffffffffffffffffffffffffff16145b80612e795750612e788260000151612e73612d08565b612b07565b5b905080612ebb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb2906159bb565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2490615a4d565b60405180910390fd5b612f3a858585600161398e565b612f4a6000848460000151612d1d565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612fb89190615a89565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661305c9190615abd565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600060018461316291906153ba565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036132a7576131d781612d10565b156132a6576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461330f8686866001613994565b505050505050565b61331f613f9d565b61332882612d10565b613367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335e90615b75565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106133cb5760017f0000000000000000000000000000000000000000000000000000000000000000846133be9190615b95565b6133c891906153ba565b90505b60008390505b8181106134d9576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146134c557809350505050613515565b5080806134d190615bc9565b9150506133d1565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350c90615c64565b60405180910390fd5b919050565b600082613527858461399a565b1490509392505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006136188473ffffffffffffffffffffffffffffffffffffffff16613a0f565b15613771578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613641612d08565b8786866040518563ffffffff1660e01b81526004016136639493929190615cd9565b6020604051808303816000875af192505050801561369f57506040513d601f19601f8201168201806040525081019061369c9190615d3a565b60015b613721573d80600081146136cf576040519150601f19603f3d011682016040523d82523d6000602084013e6136d4565b606091505b506000815103613719576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613710906152c2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613776565b600190505b949350505050565b613798828260405180602001604052806000815250613a22565b5050565b6060600780546137ab90614a9d565b80601f01602080910402602001604051908101604052809291908181526020018280546137d790614a9d565b80156138245780601f106137f957610100808354040283529160200191613824565b820191906000526020600020905b81548152906001019060200180831161380757829003601f168201915b5050505050905090565b606060008203613875576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613989565b600082905060005b600082146138a757808061389090614d74565b915050600a826138a091906151c5565b915061387d565b60008167ffffffffffffffff8111156138c3576138c26140de565b5b6040519080825280601f01601f1916602001820160405280156138f55781602001600182028036833780820191505090505b5090505b600085146139825760018261390e9190615b95565b9150600a8561391d9190615d67565b603061392991906153ba565b60f81b81838151811061393f5761393e614c84565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561397b91906151c5565b94506138f9565b8093505050505b919050565b50505050565b50505050565b60008082905060005b8451811015613a045760008582815181106139c1576139c0614c84565b5b602002602001015190508083116139e3576139dc8382613f00565b92506139f0565b6139ed8184613f00565b92505b5080806139fc90614d74565b9150506139a3565b508091505092915050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a8e90615e0a565b60405180910390fd5b613aa081612d10565b15613ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ad790615e76565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000831115613b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b3a90615f08565b60405180910390fd5b613b50600085838661398e565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151613c4d9190615abd565b6fffffffffffffffffffffffffffffffff168152602001858360200151613c749190615abd565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015613ee357818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613e8360008884886135f7565b613ec2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613eb9906152c2565b60405180910390fd5b8180613ecd90614d74565b9250508080613edb90614d74565b915050613e12565b5080600081905550613ef86000878588613994565b505050505050565b600082600052816020526040600020905092915050565b828054613f2390614a9d565b90600052602060002090601f016020900481019282613f455760008555613f8c565b82601f10613f5e57805160ff1916838001178555613f8c565b82800160010185558215613f8c579182015b82811115613f8b578251825591602001919060010190613f70565b5b509050613f999190613fd7565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613ff0576000816000905550600101613fd8565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61403d81614008565b811461404857600080fd5b50565b60008135905061405a81614034565b92915050565b60006020828403121561407657614075613ffe565b5b60006140848482850161404b565b91505092915050565b60008115159050919050565b6140a28161408d565b82525050565b60006020820190506140bd6000830184614099565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614116826140cd565b810181811067ffffffffffffffff82111715614135576141346140de565b5b80604052505050565b6000614148613ff4565b9050614154828261410d565b919050565b600067ffffffffffffffff821115614174576141736140de565b5b61417d826140cd565b9050602081019050919050565b82818337600083830152505050565b60006141ac6141a784614159565b61413e565b9050828152602081018484840111156141c8576141c76140c8565b5b6141d384828561418a565b509392505050565b600082601f8301126141f0576141ef6140c3565b5b8135614200848260208601614199565b91505092915050565b60006020828403121561421f5761421e613ffe565b5b600082013567ffffffffffffffff81111561423d5761423c614003565b5b614249848285016141db565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561428c578082015181840152602081019050614271565b8381111561429b576000848401525b50505050565b60006142ac82614252565b6142b6818561425d565b93506142c681856020860161426e565b6142cf816140cd565b840191505092915050565b600060208201905081810360008301526142f481846142a1565b905092915050565b6000819050919050565b61430f816142fc565b811461431a57600080fd5b50565b60008135905061432c81614306565b92915050565b60006020828403121561434857614347613ffe565b5b60006143568482850161431d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061438a8261435f565b9050919050565b61439a8161437f565b82525050565b60006020820190506143b56000830184614391565b92915050565b6143c48161437f565b81146143cf57600080fd5b50565b6000813590506143e1816143bb565b92915050565b600080604083850312156143fe576143fd613ffe565b5b600061440c858286016143d2565b925050602061441d8582860161431d565b9150509250929050565b6000819050919050565b600061444c6144476144428461435f565b614427565b61435f565b9050919050565b600061445e82614431565b9050919050565b600061447082614453565b9050919050565b61448081614465565b82525050565b600060208201905061449b6000830184614477565b92915050565b6144aa816142fc565b82525050565b60006020820190506144c560008301846144a1565b92915050565b6000602082840312156144e1576144e0613ffe565b5b60006144ef848285016143d2565b91505092915050565b60006145038261435f565b9050919050565b614513816144f8565b811461451e57600080fd5b50565b6000813590506145308161450a565b92915050565b60008060006060848603121561454f5761454e613ffe565b5b600061455d8682870161431d565b935050602061456e8682870161431d565b925050604061457f86828701614521565b9150509250925092565b6000806000606084860312156145a2576145a1613ffe565b5b60006145b0868287016143d2565b93505060206145c1868287016143d2565b92505060406145d28682870161431d565b9150509250925092565b6000819050919050565b6145ef816145dc565b82525050565b600060208201905061460a60008301846145e6565b92915050565b600080fd5b600080fd5b60008083601f8401126146305761462f6140c3565b5b8235905067ffffffffffffffff81111561464d5761464c614610565b5b60208301915083602082028301111561466957614668614615565b5b9250929050565b60008060006040848603121561468957614688613ffe565b5b6000614697868287016143d2565b935050602084013567ffffffffffffffff8111156146b8576146b7614003565b5b6146c48682870161461a565b92509250509250925092565b60006040820190506146e560008301856144a1565b6146f26020830184614391565b9392505050565b6147028161408d565b811461470d57600080fd5b50565b60008135905061471f816146f9565b92915050565b6000806040838503121561473c5761473b613ffe565b5b600061474a858286016143d2565b925050602061475b85828601614710565b9150509250929050565b6000806040838503121561477c5761477b613ffe565b5b600061478a8582860161431d565b925050602061479b8582860161431d565b9150509250929050565b600067ffffffffffffffff8211156147c0576147bf6140de565b5b6147c9826140cd565b9050602081019050919050565b60006147e96147e4846147a5565b61413e565b905082815260208101848484011115614805576148046140c8565b5b61481084828561418a565b509392505050565b600082601f83011261482d5761482c6140c3565b5b813561483d8482602086016147d6565b91505092915050565b600080600080608085870312156148605761485f613ffe565b5b600061486e878288016143d2565b945050602061487f878288016143d2565b93505060406148908782880161431d565b925050606085013567ffffffffffffffff8111156148b1576148b0614003565b5b6148bd87828801614818565b91505092959194509250565b6000806000604084860312156148e2576148e1613ffe565b5b60006148f08682870161431d565b935050602084013567ffffffffffffffff81111561491157614910614003565b5b61491d8682870161461a565b92509250509250925092565b600080604083850312156149405761493f613ffe565b5b600061494e8582860161431d565b925050602061495f858286016143d2565b9150509250929050565b614972816145dc565b811461497d57600080fd5b50565b60008135905061498f81614969565b92915050565b6000602082840312156149ab576149aa613ffe565b5b60006149b984828501614980565b91505092915050565b600080604083850312156149d9576149d8613ffe565b5b60006149e7858286016143d2565b92505060206149f8858286016143d2565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614a3860208361425d565b9150614a4382614a02565b602082019050919050565b60006020820190508181036000830152614a6781614a2b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614ab557607f821691505b602082108103614ac857614ac7614a6e565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000614b2a602d8361425d565b9150614b3582614ace565b604082019050919050565b60006020820190508181036000830152614b5981614b1d565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000614bbc60228361425d565b9150614bc782614b60565b604082019050919050565b60006020820190508181036000830152614beb81614baf565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000614c4e60398361425d565b9150614c5982614bf2565b604082019050919050565b60006020820190508181036000830152614c7d81614c41565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000614d0f60228361425d565b9150614d1a82614cb3565b604082019050919050565b60006020820190508181036000830152614d3e81614d02565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614d7f826142fc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614db157614db0614d45565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000614e18602e8361425d565b9150614e2382614dbc565b604082019050919050565b60006020820190508181036000830152614e4781614e0b565b9050919050565b600081905092915050565b50565b6000614e69600083614e4e565b9150614e7482614e59565b600082019050919050565b6000614e8a82614e5c565b9150819050919050565b7f5472616e73666572206661696c00000000000000000000000000000000000000600082015250565b6000614eca600d8361425d565b9150614ed582614e94565b602082019050919050565b60006020820190508181036000830152614ef981614ebd565b9050919050565b6000606082019050614f156000830186614391565b614f226020830185614391565b614f2f60408301846144a1565b949350505050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000614f9360238361425d565b9150614f9e82614f37565b604082019050919050565b60006020820190508181036000830152614fc281614f86565b9050919050565b60008160601b9050919050565b6000614fe182614fc9565b9050919050565b6000614ff382614fd6565b9050919050565b61500b6150068261437f565b614fe8565b82525050565b600061501d8284614ffa565b60148201915081905092915050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000615088602b8361425d565b91506150938261502c565b604082019050919050565b600060208201905081810360008301526150b78161507b565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b60006150f4601a8361425d565b91506150ff826150be565b602082019050919050565b60006020820190508181036000830152615123816150e7565b9050919050565b7f56616c7565206d757374206265203e3d20313030000000000000000000000000600082015250565b600061516060148361425d565b915061516b8261512a565b602082019050919050565b6000602082019050818103600083015261518f81615153565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006151d0826142fc565b91506151db836142fc565b9250826151eb576151ea615196565b5b828204905092915050565b6000615201826142fc565b915061520c836142fc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561524557615244614d45565b5b828202905092915050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b60006152ac60338361425d565b91506152b782615250565b604082019050919050565b600060208201905081810360008301526152db8161529f565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000615318601f8361425d565b9150615323826152e2565b602082019050919050565b600060208201905081810360008301526153478161530b565b9050919050565b7f53616c6520697320636c6f736564000000000000000000000000000000000000600082015250565b6000615384600e8361425d565b915061538f8261534e565b602082019050919050565b600060208201905081810360008301526153b381615377565b9050919050565b60006153c5826142fc565b91506153d0836142fc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561540557615404614d45565b5b828201905092915050565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b600061544660128361425d565b915061545182615410565b602082019050919050565b6000602082019050818103600083015261547581615439565b9050919050565b7f45786365656473206d6178696d756d20706572207472616e73616374696f6e00600082015250565b60006154b2601f8361425d565b91506154bd8261547c565b602082019050919050565b600060208201905081810360008301526154e1816154a5565b9050919050565b6000815190506154f781614306565b92915050565b60006020828403121561551357615512613ffe565b5b6000615521848285016154e8565b91505092915050565b7f416d6f756e742065786365656473206d61782070657220616c6c6f77206c697360008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b600061558660218361425d565b91506155918261552a565b604082019050919050565b600060208201905081810360008301526155b581615579565b9050919050565b7f416c6c6f77206c697374206f6e6c790000000000000000000000000000000000600082015250565b60006155f2600f8361425d565b91506155fd826155bc565b602082019050919050565b60006020820190508181036000830152615621816155e5565b9050919050565b7f496e636f727265637420616d6f756e74206f66204554482073656e7400000000600082015250565b600061565e601c8361425d565b915061566982615628565b602082019050919050565b6000602082019050818103600083015261568d81615651565b9050919050565b60006080820190506156a96000830187614391565b6156b660208301866144a1565b6156c36040830185614391565b6156d060608301846144a1565b95945050505050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615735602f8361425d565b9150615740826156d9565b604082019050919050565b6000602082019050818103600083015261576481615728565b9050919050565b600081905092915050565b600061578182614252565b61578b818561576b565b935061579b81856020860161426e565b80840191505092915050565b60006157b38285615776565b91506157bf8284615776565b91508190509392505050565b7f4e6f7420656e6f756768206c65667420746f206d696e74000000000000000000600082015250565b600061580160178361425d565b915061580c826157cb565b602082019050919050565b60006020820190508181036000830152615830816157f4565b9050919050565b6000819050919050565b600061585c61585761585284615837565b614427565b6142fc565b9050919050565b61586c81615841565b82525050565b60006080820190506158876000830187614391565b6158946020830186615863565b6158a16040830185614391565b6158ae60608301846144a1565b95945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061591360268361425d565b915061591e826158b7565b604082019050919050565b6000602082019050818103600083015261594281615906565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006159a560328361425d565b91506159b082615949565b604082019050919050565b600060208201905081810360008301526159d481615998565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000615a3760268361425d565b9150615a42826159db565b604082019050919050565b60006020820190508181036000830152615a6681615a2a565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6000615a9482615a6d565b9150615a9f83615a6d565b925082821015615ab257615ab1614d45565b5b828203905092915050565b6000615ac882615a6d565b9150615ad383615a6d565b9250826fffffffffffffffffffffffffffffffff03821115615af857615af7614d45565b5b828201905092915050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000615b5f602a8361425d565b9150615b6a82615b03565b604082019050919050565b60006020820190508181036000830152615b8e81615b52565b9050919050565b6000615ba0826142fc565b9150615bab836142fc565b925082821015615bbe57615bbd614d45565b5b828203905092915050565b6000615bd4826142fc565b915060008203615be757615be6614d45565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000615c4e602f8361425d565b9150615c5982615bf2565b604082019050919050565b60006020820190508181036000830152615c7d81615c41565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615cab82615c84565b615cb58185615c8f565b9350615cc581856020860161426e565b615cce816140cd565b840191505092915050565b6000608082019050615cee6000830187614391565b615cfb6020830186614391565b615d0860408301856144a1565b8181036060830152615d1a8184615ca0565b905095945050505050565b600081519050615d3481614034565b92915050565b600060208284031215615d5057615d4f613ffe565b5b6000615d5e84828501615d25565b91505092915050565b6000615d72826142fc565b9150615d7d836142fc565b925082615d8d57615d8c615196565b5b828206905092915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615df460218361425d565b9150615dff82615d98565b604082019050919050565b60006020820190508181036000830152615e2381615de7565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b6000615e60601d8361425d565b9150615e6b82615e2a565b602082019050919050565b60006020820190508181036000830152615e8f81615e53565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b6000615ef260228361425d565b9150615efd82615e96565b604082019050919050565b60006020820190508181036000830152615f2181615ee5565b905091905056fea2646970667358221220bbaebefae9df907012b919163348d578c0b3b54473e7966fedc662e15376980164736f6c634300080d003333323636326d36773333336433343331327a356f346e307a3175343331673167313533713169303736343274303835723075323933643273306634663177306d0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000f8b0a10e47000000000000000000000000000000000000000000000000000000d529ae9e86000000000000000000000000000000000000000000000000000000000000000022b800000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000b9aecb63908c13b6167ad2eab9bacd7e0daba78a00000000000000000000000019dd9264c30c9271d301aa1b4df9a1ec52bdee67000000000000000000000000b43eebac012cb2f12e1ec258a6ece20a7aa4712f000000000000000000000000000000000000000000000000000000000000000e50686f746f73796e74686573697300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055053313433000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c68747470733a2f2f75732d63656e7472616c312d70686f746f73796e746865736973322e636c6f756466756e6374696f6e732e6e65742f6765742d70686f746f73796e7468657369732d6d657461646174613f746f6b656e5f69643d00000000
Deployed Bytecode
0x6080604052600436106102e45760003560e01c80636776216911610190578063b71051e2116100dc578063dab5f34011610095578063e985e9c51161006f578063e985e9c514610ae1578063f1408da914610b1e578063f2fde38b14610b49578063f968adbe14610b72576102e4565b8063dab5f34014610a64578063dd5698c514610a8d578063e5a4756c14610ab8576102e4565b8063b71051e214610951578063b88d4fde1461098e578063ba41b0c6146109b7578063c87b56dd146109d3578063d52c57e014610a10578063d7224ba014610a39576102e4565b8063950dafd511610149578063a035b1fe11610123578063a035b1fe146108bb578063a22cb465146108e6578063a7bd36101461090f578063af573db21461093a576102e4565b8063950dafd51461083c57806395d89b411461086557806399288dbb14610890576102e4565b8063677621691461071957806370a0823114610756578063715018a6146107935780637ad71f72146107aa5780638da5cb5b146107e857806391b7f5ed14610813576102e4565b80631d1e715b1161024f578063410c9612116102085780634674a23c116101e25780634674a23c1461064b5780634f6ccce7146106625780635660f8511461069f5780636352211e146106dc576102e4565b8063410c9612146105ce57806342842e0e146105f957806342966c6814610622576102e4565b80631d1e715b146104e657806323b872dd1461050f5780632eb4a7ab146105385780632f745c591461056357806334918dfd146105a05780633ccfd60b146105b7576102e4565b80630e03ebe9116102a15780630e03ebe9146104095780630fa115161461043257806318160ddd1461045d5780631b8926a9146104885780631b9265b8146104b35780631c3db0d9146104bd576102e4565b806301ffc9a7146102e957806302fe53051461032657806306fdde031461034f578063081812fc1461037a578063095ea7b3146103b75780630afc64fe146103e0575b600080fd5b3480156102f557600080fd5b50610310600480360381019061030b9190614060565b610b9d565b60405161031d91906140a8565b60405180910390f35b34801561033257600080fd5b5061034d60048036038101906103489190614209565b610ce7565b005b34801561035b57600080fd5b50610364610d7d565b60405161037191906142da565b60405180910390f35b34801561038657600080fd5b506103a1600480360381019061039c9190614332565b610e0f565b6040516103ae91906143a0565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d991906143e7565b610e94565b005b3480156103ec57600080fd5b5061040760048036038101906104029190614332565b610fac565b005b34801561041557600080fd5b50610430600480360381019061042b9190614332565b611032565b005b34801561043e57600080fd5b506104476110b8565b6040516104549190614486565b60405180910390f35b34801561046957600080fd5b506104726110de565b60405161047f91906144b0565b60405180910390f35b34801561049457600080fd5b5061049d6110e7565b6040516104aa91906144b0565b60405180910390f35b6104bb6110ed565b005b3480156104c957600080fd5b506104e460048036038101906104df91906144cb565b6110ef565b005b3480156104f257600080fd5b5061050d60048036038101906105089190614536565b6111af565b005b34801561051b57600080fd5b5061053660048036038101906105319190614589565b6112be565b005b34801561054457600080fd5b5061054d6112ce565b60405161055a91906145f5565b60405180910390f35b34801561056f57600080fd5b5061058a600480360381019061058591906143e7565b6112d4565b60405161059791906144b0565b60405180910390f35b3480156105ac57600080fd5b506105b56114d0565b005b3480156105c357600080fd5b506105cc611578565b005b3480156105da57600080fd5b506105e36116b0565b6040516105f091906142da565b60405180910390f35b34801561060557600080fd5b50610620600480360381019061061b9190614589565b61173e565b005b34801561062e57600080fd5b5061064960048036038101906106449190614332565b61175e565b005b34801561065757600080fd5b506106606117b7565b005b34801561066e57600080fd5b5061068960048036038101906106849190614332565b61185f565b60405161069691906144b0565b60405180910390f35b3480156106ab57600080fd5b506106c660048036038101906106c191906144cb565b6118b2565b6040516106d391906144b0565b60405180910390f35b3480156106e857600080fd5b5061070360048036038101906106fe9190614332565b6118ca565b60405161071091906143a0565b60405180910390f35b34801561072557600080fd5b50610740600480360381019061073b9190614670565b6118e0565b60405161074d91906140a8565b60405180910390f35b34801561076257600080fd5b5061077d600480360381019061077891906144cb565b61196a565b60405161078a91906144b0565b60405180910390f35b34801561079f57600080fd5b506107a8611a52565b005b3480156107b657600080fd5b506107d160048036038101906107cc9190614332565b611ada565b6040516107df9291906146d0565b60405180910390f35b3480156107f457600080fd5b506107fd611b2e565b60405161080a91906143a0565b60405180910390f35b34801561081f57600080fd5b5061083a60048036038101906108359190614332565b611b58565b005b34801561084857600080fd5b50610863600480360381019061085e9190614332565b611bde565b005b34801561087157600080fd5b5061087a611c64565b60405161088791906142da565b60405180910390f35b34801561089c57600080fd5b506108a5611cf6565b6040516108b291906140a8565b60405180910390f35b3480156108c757600080fd5b506108d0611d09565b6040516108dd91906144b0565b60405180910390f35b3480156108f257600080fd5b5061090d60048036038101906109089190614725565b611d0f565b005b34801561091b57600080fd5b50610924611e8f565b60405161093191906140a8565b60405180910390f35b34801561094657600080fd5b5061094f611ea2565b005b34801561095d57600080fd5b5061097860048036038101906109739190614765565b612176565b60405161098591906144b0565b60405180910390f35b34801561099a57600080fd5b506109b560048036038101906109b09190614846565b6121e2565b005b6109d160048036038101906109cc91906148c9565b61223e565b005b3480156109df57600080fd5b506109fa60048036038101906109f59190614332565b612822565b604051610a0791906142da565b60405180910390f35b348015610a1c57600080fd5b50610a376004803603810190610a329190614929565b6128c9565b005b348015610a4557600080fd5b50610a4e6129ef565b604051610a5b91906144b0565b60405180910390f35b348015610a7057600080fd5b50610a8b6004803603810190610a869190614995565b6129f5565b005b348015610a9957600080fd5b50610aa2612a7b565b604051610aaf91906144b0565b60405180910390f35b348015610ac457600080fd5b50610adf6004803603810190610ada9190614332565b612a81565b005b348015610aed57600080fd5b50610b086004803603810190610b0391906149c2565b612b07565b604051610b1591906140a8565b60405180910390f35b348015610b2a57600080fd5b50610b33612b9b565b604051610b4091906144b0565b60405180910390f35b348015610b5557600080fd5b50610b706004803603810190610b6b91906144cb565b612ba1565b005b348015610b7e57600080fd5b50610b87612c98565b604051610b9491906144b0565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c6857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cd057507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ce05750610cdf82612c9e565b5b9050919050565b610cef612d08565b73ffffffffffffffffffffffffffffffffffffffff16610d0d611b2e565b73ffffffffffffffffffffffffffffffffffffffff1614610d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5a90614a4e565b60405180910390fd5b8060079080519060200190610d79929190613f17565b5050565b606060018054610d8c90614a9d565b80601f0160208091040260200160405190810160405280929190818152602001828054610db890614a9d565b8015610e055780601f10610dda57610100808354040283529160200191610e05565b820191906000526020600020905b815481529060010190602001808311610de857829003601f168201915b5050505050905090565b6000610e1a82612d10565b610e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5090614b40565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e9f826118ca565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0690614bd2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610f2e612d08565b73ffffffffffffffffffffffffffffffffffffffff161480610f5d5750610f5c81610f57612d08565b612b07565b5b610f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9390614c64565b60405180910390fd5b610fa7838383612d1d565b505050565b610fb4612d08565b73ffffffffffffffffffffffffffffffffffffffff16610fd2611b2e565b73ffffffffffffffffffffffffffffffffffffffff1614611028576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101f90614a4e565b60405180910390fd5b8060148190555050565b61103a612d08565b73ffffffffffffffffffffffffffffffffffffffff16611058611b2e565b73ffffffffffffffffffffffffffffffffffffffff16146110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a590614a4e565b60405180910390fd5b80600f8190555050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054905090565b600f5481565b565b6110f7612d08565b73ffffffffffffffffffffffffffffffffffffffff16611115611b2e565b73ffffffffffffffffffffffffffffffffffffffff161461116b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116290614a4e565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6111b7612d08565b73ffffffffffffffffffffffffffffffffffffffff166111d5611b2e565b73ffffffffffffffffffffffffffffffffffffffff161461122b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122290614a4e565b60405180910390fd5b81601684815481106112405761123f614c84565b5b906000526020600020906002020160000181905550806016848154811061126a57611269614c84565b5b906000526020600020906002020160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b6112c9838383612dcf565b505050565b600b5481565b60006112df8361196a565b8210611320576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131790614d25565b60405180910390fd5b600061132a6110de565b905060008060005b8381101561148e576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461142457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361147a5786840361146b5781955050505050506114ca565b838061147690614d74565b9450505b50808061148690614d74565b915050611332565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c190614e2e565b60405180910390fd5b92915050565b6114d8612d08565b73ffffffffffffffffffffffffffffffffffffffff166114f6611b2e565b73ffffffffffffffffffffffffffffffffffffffff161461154c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154390614a4e565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b611580612d08565b73ffffffffffffffffffffffffffffffffffffffff1661159e611b2e565b73ffffffffffffffffffffffffffffffffffffffff16146115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb90614a4e565b60405180910390fd5b60004790506000611603612d08565b73ffffffffffffffffffffffffffffffffffffffff168260405161162690614e7f565b60006040518083038185875af1925050503d8060008114611663576040519150601f19603f3d011682016040523d82523d6000602084013e611668565b606091505b50509050806116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614ee0565b60405180910390fd5b5050565b600c80546116bd90614a9d565b80601f01602080910402602001604051908101604052809291908181526020018280546116e990614a9d565b80156117365780601f1061170b57610100808354040283529160200191611736565b820191906000526020600020905b81548152906001019060200180831161171957829003601f168201915b505050505081565b611759838383604051806020016040528060008152506121e2565b505050565b611771611769612d08565b6000836112be565b7f4911fc0126af9455d0aa4a23d3cf11a705afa45b85f7721bf29a93ccbbf76a8761179a612d08565b6000836040516117ac93929190614f00565b60405180910390a150565b6117bf612d08565b73ffffffffffffffffffffffffffffffffffffffff166117dd611b2e565b73ffffffffffffffffffffffffffffffffffffffff1614611833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182a90614a4e565b60405180910390fd5b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b60006118696110de565b82106118aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a190614fa9565b60405180910390fd5b819050919050565b60126020528060005260406000206000915090505481565b60006118d582613317565b600001519050919050565b600080846040516020016118f49190615011565b604051602081830303815290604052805190602001209050600061195c858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b548461351a565b905080925050509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d19061509e565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611a5a612d08565b73ffffffffffffffffffffffffffffffffffffffff16611a78611b2e565b73ffffffffffffffffffffffffffffffffffffffff1614611ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac590614a4e565b60405180910390fd5b611ad86000613531565b565b60168181548110611aea57600080fd5b90600052602060002090600202016000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b60612d08565b73ffffffffffffffffffffffffffffffffffffffff16611b7e611b2e565b73ffffffffffffffffffffffffffffffffffffffff1614611bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcb90614a4e565b60405180910390fd5b80600e8190555050565b611be6612d08565b73ffffffffffffffffffffffffffffffffffffffff16611c04611b2e565b73ffffffffffffffffffffffffffffffffffffffff1614611c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5190614a4e565b60405180910390fd5b8060138190555050565b606060028054611c7390614a9d565b80601f0160208091040260200160405190810160405280929190818152602001828054611c9f90614a9d565b8015611cec5780601f10611cc157610100808354040283529160200191611cec565b820191906000526020600020905b815481529060010190602001808311611ccf57829003601f168201915b5050505050905090565b601160009054906101000a900460ff1681565b600e5481565b611d17612d08565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7b9061510a565b60405180910390fd5b8060066000611d91612d08565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e3e612d08565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e8391906140a8565b60405180910390a35050565b601160019054906101000a900460ff1681565b611eaa612d08565b73ffffffffffffffffffffffffffffffffffffffff16611ec8611b2e565b73ffffffffffffffffffffffffffffffffffffffff1614611f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1590614a4e565b60405180910390fd5b60004790506000611f55826016600081548110611f3e57611f3d614c84565b5b906000526020600020906002020160000154612176565b905060006016600081548110611f6e57611f6d614c84565b5b906000526020600020906002020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051611fc390614e7f565b60006040518083038185875af1925050503d8060008114612000576040519150601f19603f3d011682016040523d82523d6000602084013e612005565b606091505b5050905080612049576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204090614ee0565b60405180910390fd5b600061207b84601660018154811061206457612063614c84565b5b906000526020600020906002020160000154612176565b90506000601660018154811061209457612093614c84565b5b906000526020600020906002020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516120e990614e7f565b60006040518083038185875af1925050503d8060008114612126576040519150601f19603f3d011682016040523d82523d6000602084013e61212b565b606091505b505090508061216f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216690614ee0565b60405180910390fd5b5050505050565b600060648310156121bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b390615176565b60405180910390fd5b60006064846121cb91906151c5565b905082816121d991906151f6565b91505092915050565b6121ed848484612dcf565b6121f9848484846135f7565b612238576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222f906152c2565b60405180910390fd5b50505050565b6002600a5403612283576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227a9061532e565b60405180910390fd5b6002600a81905550601160009054906101000a900460ff166122da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d19061539a565b60405180910390fd5b601054836122e66110de565b6122f091906153ba565b1115612331576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123289061545c565b60405180910390fd5b601554831115612376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236d906154c8565b60405180910390fd5b6000600e5490506000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082316123c5612d08565b6040518263ffffffff1660e01b81526004016123e191906143a0565b602060405180830381865afa1580156123fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242291906154fd565b11801561252f5750600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231612470612d08565b6040518263ffffffff1660e01b815260040161248c91906143a0565b602060405180830381865afa1580156124a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cd91906154fd565b6013546124da91906151f6565b84601260006124e7612d08565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461252c91906153ba565b11155b1561259b578360126000612541612d08565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461258a91906153ba565b92505081905550600f549050612760565b6125ad6125a6612d08565b84846118e0565b801561260c575060145484601260006125c4612d08565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461260991906153ba565b11155b1561270e576014548460126000612621612d08565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461266691906153ba565b11156126a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269e9061559c565b60405180910390fd5b83601260006126b4612d08565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126fd91906153ba565b92505081905550600f54905061275f565b601160019054906101000a900460ff161561275e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275590615608565b60405180910390fd5b5b5b838161276c91906151f6565b34146127ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a490615674565b60405180910390fd5b6127be6127b8612d08565b8561377e565b7f58303c2ecff4b8a524f2f8ca478d8683b492b3419026f7199667453c2f15412a6127e7612d08565b85836127f391906151f6565b6127fb612d08565b8760405161280c9493929190615694565b60405180910390a1506001600a81905550505050565b606061282d82612d10565b61286c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128639061574b565b60405180910390fd5b600061287661379c565b9050600081511161289657604051806020016040528060008152506128c1565b806128a08461382e565b6040516020016128b19291906157a7565b6040516020818303038152906040525b915050919050565b6128d1612d08565b73ffffffffffffffffffffffffffffffffffffffff166128ef611b2e565b73ffffffffffffffffffffffffffffffffffffffff1614612945576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293c90614a4e565b60405180910390fd5b601054826129516110de565b61295b91906153ba565b111561299c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299390615817565b60405180910390fd5b6129a6818361377e565b7f58303c2ecff4b8a524f2f8ca478d8683b492b3419026f7199667453c2f15412a6129cf612d08565b600083856040516129e39493929190615872565b60405180910390a15050565b60085481565b6129fd612d08565b73ffffffffffffffffffffffffffffffffffffffff16612a1b611b2e565b73ffffffffffffffffffffffffffffffffffffffff1614612a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6890614a4e565b60405180910390fd5b80600b8190555050565b60135481565b612a89612d08565b73ffffffffffffffffffffffffffffffffffffffff16612aa7611b2e565b73ffffffffffffffffffffffffffffffffffffffff1614612afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af490614a4e565b60405180910390fd5b8060158190555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60145481565b612ba9612d08565b73ffffffffffffffffffffffffffffffffffffffff16612bc7611b2e565b73ffffffffffffffffffffffffffffffffffffffff1614612c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1490614a4e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8390615929565b60405180910390fd5b612c9581613531565b50565b60155481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612dda82613317565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612e01612d08565b73ffffffffffffffffffffffffffffffffffffffff161480612e5d5750612e26612d08565b73ffffffffffffffffffffffffffffffffffffffff16612e4584610e0f565b73ffffffffffffffffffffffffffffffffffffffff16145b80612e795750612e788260000151612e73612d08565b612b07565b5b905080612ebb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb2906159bb565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2490615a4d565b60405180910390fd5b612f3a858585600161398e565b612f4a6000848460000151612d1d565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612fb89190615a89565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661305c9190615abd565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600060018461316291906153ba565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036132a7576131d781612d10565b156132a6576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461330f8686866001613994565b505050505050565b61331f613f9d565b61332882612d10565b613367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335e90615b75565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000006483106133cb5760017f0000000000000000000000000000000000000000000000000000000000000064846133be9190615b95565b6133c891906153ba565b90505b60008390505b8181106134d9576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146134c557809350505050613515565b5080806134d190615bc9565b9150506133d1565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350c90615c64565b60405180910390fd5b919050565b600082613527858461399a565b1490509392505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006136188473ffffffffffffffffffffffffffffffffffffffff16613a0f565b15613771578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613641612d08565b8786866040518563ffffffff1660e01b81526004016136639493929190615cd9565b6020604051808303816000875af192505050801561369f57506040513d601f19601f8201168201806040525081019061369c9190615d3a565b60015b613721573d80600081146136cf576040519150601f19603f3d011682016040523d82523d6000602084013e6136d4565b606091505b506000815103613719576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613710906152c2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613776565b600190505b949350505050565b613798828260405180602001604052806000815250613a22565b5050565b6060600780546137ab90614a9d565b80601f01602080910402602001604051908101604052809291908181526020018280546137d790614a9d565b80156138245780601f106137f957610100808354040283529160200191613824565b820191906000526020600020905b81548152906001019060200180831161380757829003601f168201915b5050505050905090565b606060008203613875576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613989565b600082905060005b600082146138a757808061389090614d74565b915050600a826138a091906151c5565b915061387d565b60008167ffffffffffffffff8111156138c3576138c26140de565b5b6040519080825280601f01601f1916602001820160405280156138f55781602001600182028036833780820191505090505b5090505b600085146139825760018261390e9190615b95565b9150600a8561391d9190615d67565b603061392991906153ba565b60f81b81838151811061393f5761393e614c84565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561397b91906151c5565b94506138f9565b8093505050505b919050565b50505050565b50505050565b60008082905060005b8451811015613a045760008582815181106139c1576139c0614c84565b5b602002602001015190508083116139e3576139dc8382613f00565b92506139f0565b6139ed8184613f00565b92505b5080806139fc90614d74565b9150506139a3565b508091505092915050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a8e90615e0a565b60405180910390fd5b613aa081612d10565b15613ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ad790615e76565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000064831115613b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b3a90615f08565b60405180910390fd5b613b50600085838661398e565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151613c4d9190615abd565b6fffffffffffffffffffffffffffffffff168152602001858360200151613c749190615abd565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015613ee357818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613e8360008884886135f7565b613ec2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613eb9906152c2565b60405180910390fd5b8180613ecd90614d74565b9250508080613edb90614d74565b915050613e12565b5080600081905550613ef86000878588613994565b505050505050565b600082600052816020526040600020905092915050565b828054613f2390614a9d565b90600052602060002090601f016020900481019282613f455760008555613f8c565b82601f10613f5e57805160ff1916838001178555613f8c565b82800160010185558215613f8c579182015b82811115613f8b578251825591602001919060010190613f70565b5b509050613f999190613fd7565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613ff0576000816000905550600101613fd8565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61403d81614008565b811461404857600080fd5b50565b60008135905061405a81614034565b92915050565b60006020828403121561407657614075613ffe565b5b60006140848482850161404b565b91505092915050565b60008115159050919050565b6140a28161408d565b82525050565b60006020820190506140bd6000830184614099565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614116826140cd565b810181811067ffffffffffffffff82111715614135576141346140de565b5b80604052505050565b6000614148613ff4565b9050614154828261410d565b919050565b600067ffffffffffffffff821115614174576141736140de565b5b61417d826140cd565b9050602081019050919050565b82818337600083830152505050565b60006141ac6141a784614159565b61413e565b9050828152602081018484840111156141c8576141c76140c8565b5b6141d384828561418a565b509392505050565b600082601f8301126141f0576141ef6140c3565b5b8135614200848260208601614199565b91505092915050565b60006020828403121561421f5761421e613ffe565b5b600082013567ffffffffffffffff81111561423d5761423c614003565b5b614249848285016141db565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561428c578082015181840152602081019050614271565b8381111561429b576000848401525b50505050565b60006142ac82614252565b6142b6818561425d565b93506142c681856020860161426e565b6142cf816140cd565b840191505092915050565b600060208201905081810360008301526142f481846142a1565b905092915050565b6000819050919050565b61430f816142fc565b811461431a57600080fd5b50565b60008135905061432c81614306565b92915050565b60006020828403121561434857614347613ffe565b5b60006143568482850161431d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061438a8261435f565b9050919050565b61439a8161437f565b82525050565b60006020820190506143b56000830184614391565b92915050565b6143c48161437f565b81146143cf57600080fd5b50565b6000813590506143e1816143bb565b92915050565b600080604083850312156143fe576143fd613ffe565b5b600061440c858286016143d2565b925050602061441d8582860161431d565b9150509250929050565b6000819050919050565b600061444c6144476144428461435f565b614427565b61435f565b9050919050565b600061445e82614431565b9050919050565b600061447082614453565b9050919050565b61448081614465565b82525050565b600060208201905061449b6000830184614477565b92915050565b6144aa816142fc565b82525050565b60006020820190506144c560008301846144a1565b92915050565b6000602082840312156144e1576144e0613ffe565b5b60006144ef848285016143d2565b91505092915050565b60006145038261435f565b9050919050565b614513816144f8565b811461451e57600080fd5b50565b6000813590506145308161450a565b92915050565b60008060006060848603121561454f5761454e613ffe565b5b600061455d8682870161431d565b935050602061456e8682870161431d565b925050604061457f86828701614521565b9150509250925092565b6000806000606084860312156145a2576145a1613ffe565b5b60006145b0868287016143d2565b93505060206145c1868287016143d2565b92505060406145d28682870161431d565b9150509250925092565b6000819050919050565b6145ef816145dc565b82525050565b600060208201905061460a60008301846145e6565b92915050565b600080fd5b600080fd5b60008083601f8401126146305761462f6140c3565b5b8235905067ffffffffffffffff81111561464d5761464c614610565b5b60208301915083602082028301111561466957614668614615565b5b9250929050565b60008060006040848603121561468957614688613ffe565b5b6000614697868287016143d2565b935050602084013567ffffffffffffffff8111156146b8576146b7614003565b5b6146c48682870161461a565b92509250509250925092565b60006040820190506146e560008301856144a1565b6146f26020830184614391565b9392505050565b6147028161408d565b811461470d57600080fd5b50565b60008135905061471f816146f9565b92915050565b6000806040838503121561473c5761473b613ffe565b5b600061474a858286016143d2565b925050602061475b85828601614710565b9150509250929050565b6000806040838503121561477c5761477b613ffe565b5b600061478a8582860161431d565b925050602061479b8582860161431d565b9150509250929050565b600067ffffffffffffffff8211156147c0576147bf6140de565b5b6147c9826140cd565b9050602081019050919050565b60006147e96147e4846147a5565b61413e565b905082815260208101848484011115614805576148046140c8565b5b61481084828561418a565b509392505050565b600082601f83011261482d5761482c6140c3565b5b813561483d8482602086016147d6565b91505092915050565b600080600080608085870312156148605761485f613ffe565b5b600061486e878288016143d2565b945050602061487f878288016143d2565b93505060406148908782880161431d565b925050606085013567ffffffffffffffff8111156148b1576148b0614003565b5b6148bd87828801614818565b91505092959194509250565b6000806000604084860312156148e2576148e1613ffe565b5b60006148f08682870161431d565b935050602084013567ffffffffffffffff81111561491157614910614003565b5b61491d8682870161461a565b92509250509250925092565b600080604083850312156149405761493f613ffe565b5b600061494e8582860161431d565b925050602061495f858286016143d2565b9150509250929050565b614972816145dc565b811461497d57600080fd5b50565b60008135905061498f81614969565b92915050565b6000602082840312156149ab576149aa613ffe565b5b60006149b984828501614980565b91505092915050565b600080604083850312156149d9576149d8613ffe565b5b60006149e7858286016143d2565b92505060206149f8858286016143d2565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614a3860208361425d565b9150614a4382614a02565b602082019050919050565b60006020820190508181036000830152614a6781614a2b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614ab557607f821691505b602082108103614ac857614ac7614a6e565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000614b2a602d8361425d565b9150614b3582614ace565b604082019050919050565b60006020820190508181036000830152614b5981614b1d565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000614bbc60228361425d565b9150614bc782614b60565b604082019050919050565b60006020820190508181036000830152614beb81614baf565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000614c4e60398361425d565b9150614c5982614bf2565b604082019050919050565b60006020820190508181036000830152614c7d81614c41565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000614d0f60228361425d565b9150614d1a82614cb3565b604082019050919050565b60006020820190508181036000830152614d3e81614d02565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614d7f826142fc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614db157614db0614d45565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000614e18602e8361425d565b9150614e2382614dbc565b604082019050919050565b60006020820190508181036000830152614e4781614e0b565b9050919050565b600081905092915050565b50565b6000614e69600083614e4e565b9150614e7482614e59565b600082019050919050565b6000614e8a82614e5c565b9150819050919050565b7f5472616e73666572206661696c00000000000000000000000000000000000000600082015250565b6000614eca600d8361425d565b9150614ed582614e94565b602082019050919050565b60006020820190508181036000830152614ef981614ebd565b9050919050565b6000606082019050614f156000830186614391565b614f226020830185614391565b614f2f60408301846144a1565b949350505050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000614f9360238361425d565b9150614f9e82614f37565b604082019050919050565b60006020820190508181036000830152614fc281614f86565b9050919050565b60008160601b9050919050565b6000614fe182614fc9565b9050919050565b6000614ff382614fd6565b9050919050565b61500b6150068261437f565b614fe8565b82525050565b600061501d8284614ffa565b60148201915081905092915050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000615088602b8361425d565b91506150938261502c565b604082019050919050565b600060208201905081810360008301526150b78161507b565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b60006150f4601a8361425d565b91506150ff826150be565b602082019050919050565b60006020820190508181036000830152615123816150e7565b9050919050565b7f56616c7565206d757374206265203e3d20313030000000000000000000000000600082015250565b600061516060148361425d565b915061516b8261512a565b602082019050919050565b6000602082019050818103600083015261518f81615153565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006151d0826142fc565b91506151db836142fc565b9250826151eb576151ea615196565b5b828204905092915050565b6000615201826142fc565b915061520c836142fc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561524557615244614d45565b5b828202905092915050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b60006152ac60338361425d565b91506152b782615250565b604082019050919050565b600060208201905081810360008301526152db8161529f565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000615318601f8361425d565b9150615323826152e2565b602082019050919050565b600060208201905081810360008301526153478161530b565b9050919050565b7f53616c6520697320636c6f736564000000000000000000000000000000000000600082015250565b6000615384600e8361425d565b915061538f8261534e565b602082019050919050565b600060208201905081810360008301526153b381615377565b9050919050565b60006153c5826142fc565b91506153d0836142fc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561540557615404614d45565b5b828201905092915050565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b600061544660128361425d565b915061545182615410565b602082019050919050565b6000602082019050818103600083015261547581615439565b9050919050565b7f45786365656473206d6178696d756d20706572207472616e73616374696f6e00600082015250565b60006154b2601f8361425d565b91506154bd8261547c565b602082019050919050565b600060208201905081810360008301526154e1816154a5565b9050919050565b6000815190506154f781614306565b92915050565b60006020828403121561551357615512613ffe565b5b6000615521848285016154e8565b91505092915050565b7f416d6f756e742065786365656473206d61782070657220616c6c6f77206c697360008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b600061558660218361425d565b91506155918261552a565b604082019050919050565b600060208201905081810360008301526155b581615579565b9050919050565b7f416c6c6f77206c697374206f6e6c790000000000000000000000000000000000600082015250565b60006155f2600f8361425d565b91506155fd826155bc565b602082019050919050565b60006020820190508181036000830152615621816155e5565b9050919050565b7f496e636f727265637420616d6f756e74206f66204554482073656e7400000000600082015250565b600061565e601c8361425d565b915061566982615628565b602082019050919050565b6000602082019050818103600083015261568d81615651565b9050919050565b60006080820190506156a96000830187614391565b6156b660208301866144a1565b6156c36040830185614391565b6156d060608301846144a1565b95945050505050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615735602f8361425d565b9150615740826156d9565b604082019050919050565b6000602082019050818103600083015261576481615728565b9050919050565b600081905092915050565b600061578182614252565b61578b818561576b565b935061579b81856020860161426e565b80840191505092915050565b60006157b38285615776565b91506157bf8284615776565b91508190509392505050565b7f4e6f7420656e6f756768206c65667420746f206d696e74000000000000000000600082015250565b600061580160178361425d565b915061580c826157cb565b602082019050919050565b60006020820190508181036000830152615830816157f4565b9050919050565b6000819050919050565b600061585c61585761585284615837565b614427565b6142fc565b9050919050565b61586c81615841565b82525050565b60006080820190506158876000830187614391565b6158946020830186615863565b6158a16040830185614391565b6158ae60608301846144a1565b95945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061591360268361425d565b915061591e826158b7565b604082019050919050565b6000602082019050818103600083015261594281615906565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006159a560328361425d565b91506159b082615949565b604082019050919050565b600060208201905081810360008301526159d481615998565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000615a3760268361425d565b9150615a42826159db565b604082019050919050565b60006020820190508181036000830152615a6681615a2a565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6000615a9482615a6d565b9150615a9f83615a6d565b925082821015615ab257615ab1614d45565b5b828203905092915050565b6000615ac882615a6d565b9150615ad383615a6d565b9250826fffffffffffffffffffffffffffffffff03821115615af857615af7614d45565b5b828201905092915050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000615b5f602a8361425d565b9150615b6a82615b03565b604082019050919050565b60006020820190508181036000830152615b8e81615b52565b9050919050565b6000615ba0826142fc565b9150615bab836142fc565b925082821015615bbe57615bbd614d45565b5b828203905092915050565b6000615bd4826142fc565b915060008203615be757615be6614d45565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000615c4e602f8361425d565b9150615c5982615bf2565b604082019050919050565b60006020820190508181036000830152615c7d81615c41565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615cab82615c84565b615cb58185615c8f565b9350615cc581856020860161426e565b615cce816140cd565b840191505092915050565b6000608082019050615cee6000830187614391565b615cfb6020830186614391565b615d0860408301856144a1565b8181036060830152615d1a8184615ca0565b905095945050505050565b600081519050615d3481614034565b92915050565b600060208284031215615d5057615d4f613ffe565b5b6000615d5e84828501615d25565b91505092915050565b6000615d72826142fc565b9150615d7d836142fc565b925082615d8d57615d8c615196565b5b828206905092915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615df460218361425d565b9150615dff82615d98565b604082019050919050565b60006020820190508181036000830152615e2381615de7565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b6000615e60601d8361425d565b9150615e6b82615e2a565b602082019050919050565b60006020820190508181036000830152615e8f81615e53565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b6000615ef260228361425d565b9150615efd82615e96565b604082019050919050565b60006020820190508181036000830152615f2181615ee5565b905091905056fea2646970667358221220bbaebefae9df907012b919163348d578c0b3b54473e7966fedc662e15376980164736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000f8b0a10e47000000000000000000000000000000000000000000000000000000d529ae9e86000000000000000000000000000000000000000000000000000000000000000022b800000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000b9aecb63908c13b6167ad2eab9bacd7e0daba78a00000000000000000000000019dd9264c30c9271d301aa1b4df9a1ec52bdee67000000000000000000000000b43eebac012cb2f12e1ec258a6ece20a7aa4712f000000000000000000000000000000000000000000000000000000000000000e50686f746f73796e74686573697300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055053313433000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c68747470733a2f2f75732d63656e7472616c312d70686f746f73796e746865736973322e636c6f756466756e6374696f6e732e6e65742f6765742d70686f746f73796e7468657369732d6d657461646174613f746f6b656e5f69643d00000000
-----Decoded View---------------
Arg [0] : name (string): Photosynthesis
Arg [1] : symbol (string): PS143
Arg [2] : _price (uint256): 70000000000000000
Arg [3] : _alPrice (uint256): 60000000000000000
Arg [4] : _maxSupply (uint256): 8888
Arg [5] : _uri (string): https://us-central1-photosynthesis2.cloudfunctions.net/get-photosynthesis-metadata?token_id=
Arg [6] : PN (address): 0xB9aEcB63908c13b6167aD2eab9bAcD7e0DaBa78A
Arg [7] : payout1 (address): 0x19Dd9264c30c9271D301aa1b4Df9a1Ec52BdEe67
Arg [8] : payout2 (address): 0xB43eebAC012cB2f12e1eC258a6eCE20A7aa4712f
-----Encoded View---------------
17 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [2] : 00000000000000000000000000000000000000000000000000f8b0a10e470000
Arg [3] : 00000000000000000000000000000000000000000000000000d529ae9e860000
Arg [4] : 00000000000000000000000000000000000000000000000000000000000022b8
Arg [5] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [6] : 000000000000000000000000b9aecb63908c13b6167ad2eab9bacd7e0daba78a
Arg [7] : 00000000000000000000000019dd9264c30c9271d301aa1b4df9a1ec52bdee67
Arg [8] : 000000000000000000000000b43eebac012cb2f12e1ec258a6ece20a7aa4712f
Arg [9] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [10] : 50686f746f73796e746865736973000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [12] : 5053313433000000000000000000000000000000000000000000000000000000
Arg [13] : 000000000000000000000000000000000000000000000000000000000000005c
Arg [14] : 68747470733a2f2f75732d63656e7472616c312d70686f746f73796e74686573
Arg [15] : 6973322e636c6f756466756e6374696f6e732e6e65742f6765742d70686f746f
Arg [16] : 73796e7468657369732d6d657461646174613f746f6b656e5f69643d00000000
Deployed Bytecode Sourcemap
177:5712:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3880:358:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4658:82:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5544:92:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7024:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6602:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5312:104:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5014:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;395:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2486:92:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;479:22:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5846:40;;;:::i;:::-;;4914:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5614:226;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7842:136:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;257:25:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3100:721:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4746:81:14;;;;;;;;;;;;;:::i;:::-;;3966:203;;;;;;;;;;;;;:::i;:::-;;289:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8036:151:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3538:160:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4833:75;;;;;;;;;;;;;:::i;:::-;;2642:174:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;646:40:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5374:116:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2119:266:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4289:208:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:12;;;;;;;;;;;;;:::i;:::-;;1070:24:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;1029:85:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5112:84:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5202:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5692:96:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;569:20:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;453;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7283:269:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;595:18:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4175:477;;;;;;;;;;;;;:::i;:::-;;90:219:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8245:300:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2395:1137:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5846:377:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3704:256:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12517:43:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5524:84:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;692:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5422:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7610:178:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;728:29:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1911:198:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;763:28:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3880:358:4;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;4658:82:14:-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4729:4:14::1;4723:3;:10;;;;;;;;;;;;:::i;:::-;;4658:82:::0;:::o;5544:92:4:-;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;5312:104:14:-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5398:11:14::1;5385:10;:24;;;;5312:104:::0;:::o;5014:92::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5091:8:14::1;5081:7;:18;;;;5014:92:::0;:::o;395:30::-;;;;;;;;;;;;;:::o;2486:92:4:-;2539:7;2561:12;;2554:19;;2486:92;:::o;479:22:14:-;;;;:::o;5846:40::-;:::o;4914:94::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4997:3:14::1;4971:15;;:30;;;;;;;;;;;;;;;;;;4914:94:::0;:::o;5614:226::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5773:11:14::1;5737:7;5745:13;5737:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:33;;:47;;;;5826:7;5794;5802:13;5794:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:29;;;:39;;;;;;;;;;;;;;;;;;5614:226:::0;;;:::o;7842:136:4:-;7945:28;7955:4;7961:2;7965:7;7945:9;:28::i;:::-;7842:136;;;:::o;257:25:14:-;;;;:::o;3100:721:4:-;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;4746:81:14:-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4812:8:14::1;;;;;;;;;;;4811:9;4800:8;;:20;;;;;;;;;;;;;;;;;;4746:81::o:0;3966:203::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4015:15:14::1;4033:21;4015:39;;4065:12;4082;:10;:12::i;:::-;:17;;4107:7;4082:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4064:55;;;4137:7;4129:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;4005:164;;3966:203::o:0;289:99::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;8036:151:4:-;8143:39;8160:4;8166:2;8170:7;8143:39;;;;;;;;;;;;:16;:39::i;:::-;8036:151;;;:::o;3538:160:14:-;3588:47;3601:12;:10;:12::i;:::-;3623:1;3627:7;3588:12;:47::i;:::-;3650:41;3657:12;:10;:12::i;:::-;3679:1;3683:7;3650:41;;;;;;;;:::i;:::-;;;;;;;;3538:160;:::o;4833:75::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4895:6:14::1;;;;;;;;;;;4894:7;4885:6;;:16;;;;;;;;;;;;;;;;;;4833:75::o:0;2642:174:4:-;2709:7;2740:13;:11;:13::i;:::-;2732:5;:21;2724:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;2806:5;2799:12;;2642:174;;;:::o;646:40:14:-;;;;;;;;;;;;;;;;;:::o;5374:116:4:-;5438:7;5460:20;5472:7;5460:11;:20::i;:::-;:25;;;5453:32;;5374:116;;;:::o;2119:266:14:-;2215:4;2231:12;2273:10;2256:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;2246:39;;;;;;2231:54;;2295:9;2307:50;2326:12;;2307:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2340:10;;2352:4;2307:18;:50::i;:::-;2295:62;;2374:4;2367:11;;;;2119:266;;;;;:::o;4289:208:4:-;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:12:-;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;1070:24:14:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1029:85:12:-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;5112:84:14:-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5183:6:14::1;5175:5;:14;;;;5112:84:::0;:::o;5202:104::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5288:11:14::1;5275:10;:24;;;;5202:104:::0;:::o;5692:96:4:-;5748:13;5776:7;5769:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5692:96;:::o;569:20:14:-;;;;;;;;;;;;;:::o;453:::-;;;;:::o;7283:269:4:-;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;595:18:14:-;;;;;;;;;;;;;:::o;4175:477::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4229:15:14::1;4247:21;4229:39;;4279:15;4297:44;4310:7;4319;4327:1;4319:10;;;;;;;;:::i;:::-;;;;;;;;;;;;:21;;;4297:12;:44::i;:::-;4279:62;;4352:13;4370:7;4378:1;4370:10;;;;;;;;:::i;:::-;;;;;;;;;;;;:17;;;;;;;;;;;;:22;;4400:7;4370:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4351:62;;;4431:8;4423:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;4467:15;4485:44;4498:7;4507;4515:1;4507:10;;;;;;;;:::i;:::-;;;;;;;;;;;;:21;;;4485:12;:44::i;:::-;4467:62;;4540:13;4558:7;4566:1;4558:10;;;;;;;;:::i;:::-;;;;;;;;;;;;:17;;;;;;;;;;;;:22;;4588:7;4558:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4539:62;;;4619:8;4611:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;4219:433;;;;;4175:477::o:0;90:219:13:-;167:7;202:3;193:5;:12;;185:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;240:13;264:3;256:5;:11;;;;:::i;:::-;240:27;;292:10;284:5;:18;;;;:::i;:::-;277:25;;;90:219;;;;:::o;8245:300:4:-;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;2395:1137:14:-;1680:1:15;2259:7;;:19;2251:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1680:1;2389:7;:18;;;;2506:8:14::1;;;;;;;;;;;2498:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;2577:9;;2567:6;2551:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;2543:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;2637:8;;2627:6;:18;;2619:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;2692:17;2712:5;;2692:25;;2773:1;2731:15;;;;;;;;;;;:25;;;2757:12;:10;:12::i;:::-;2731:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;:137;;;;;2827:15;;;;;;;;;;;:25;;;2853:12;:10;:12::i;:::-;2827:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2814:10;;:52;;;;:::i;:::-;2802:6;2780:5;:19;2786:12;:10;:12::i;:::-;2780:19;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;2779:88;;2731:137;2728:596;;;2907:6;2884:5;:19;2890:12;:10;:12::i;:::-;2884:19;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;2939:7;;2927:19;;2728:596;;;2966:41;2980:12;:10;:12::i;:::-;2994;;2966:13;:41::i;:::-;:89;;;;;3044:10;;3034:6;3012:5;:19;3018:12;:10;:12::i;:::-;3012:19;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;:42;;2966:89;2963:361;;;3115:10;;3105:6;3083:5;:19;3089:12;:10;:12::i;:::-;3083:19;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;:42;;3075:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;3204:6;3181:5;:19;3187:12;:10;:12::i;:::-;3181:19;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;3240:7;;3228:19;;2963:361;;;3287:6;;;;;;;;;;;3286:7;3278:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;2963:361;2728:596;3367:6;3355:9;:18;;;;:::i;:::-;3342:9;:31;3334:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;3417:31;3427:12;:10;:12::i;:::-;3441:6;3417:9;:31::i;:::-;3463:62;3470:12;:10;:12::i;:::-;3496:6;3484:9;:18;;;;:::i;:::-;3504:12;:10;:12::i;:::-;3518:6;3463:62;;;;;;;;;:::i;:::-;;;;;;;;2488:1044;1637:1:15::0;2562:7;:22;;;;2395:1137:14;;;:::o;5846:377:4:-;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;3704:256:14:-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3819:9:14::1;;3809:6;3793:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;3785:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;3866:29;3876:10;3888:6;3866:9;:29::i;:::-;3910:43;3917:12;:10;:12::i;:::-;3931:1;3934:10;3946:6;3910:43;;;;;;;;;:::i;:::-;;;;;;;;3704:256:::0;;:::o;12517:43:4:-;;;;:::o;5524:84:14:-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5597:4:14::1;5584:10;:17;;;;5524:84:::0;:::o;692:29::-;;;;:::o;5422:96::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5502:9:14::1;5491:8;:20;;;;5422:96:::0;:::o;7610:178:4:-;7727:4;7748:18;:25;7767:5;7748:25;;;;;;;;;;;;;;;:35;7774:8;7748:35;;;;;;;;;;;;;;;;;;;;;;;;;7741:42;;7610:178;;;;:::o;728:29:14:-;;;;:::o;1911:198:12:-;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;763:28:14:-;;;;:::o;:155:2:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;588:96:1:-;641:7;667:10;660:17;;588:96;:::o;8775:103:4:-;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:11:-;1275:4;1327;1298:25;1311:5;1318:4;1298:12;:25::i;:::-;:33;1291:40;;1154:184;;;;;:::o;2263:187:12:-;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:4:-;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:16:-;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:4:-;;;;;:::o;15641:135::-;;;;;:::o;1689:662:11:-;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:4:-;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:11:-;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:17:-;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:60::-;7587:3;7608:5;7601:12;;7559:60;;;:::o;7625:142::-;7675:9;7708:53;7726:34;7735:24;7753:5;7735:24;:::i;:::-;7726:34;:::i;:::-;7708:53;:::i;:::-;7695:66;;7625:142;;;:::o;7773:126::-;7823:9;7856:37;7887:5;7856:37;:::i;:::-;7843:50;;7773:126;;;:::o;7905:142::-;7971:9;8004:37;8035:5;8004:37;:::i;:::-;7991:50;;7905:142;;;:::o;8053:163::-;8156:53;8203:5;8156:53;:::i;:::-;8151:3;8144:66;8053:163;;:::o;8222:254::-;8331:4;8369:2;8358:9;8354:18;8346:26;;8382:87;8466:1;8455:9;8451:17;8442:6;8382:87;:::i;:::-;8222:254;;;;:::o;8482:118::-;8569:24;8587:5;8569:24;:::i;:::-;8564:3;8557:37;8482:118;;:::o;8606:222::-;8699:4;8737:2;8726:9;8722:18;8714:26;;8750:71;8818:1;8807:9;8803:17;8794:6;8750:71;:::i;:::-;8606:222;;;;:::o;8834:329::-;8893:6;8942:2;8930:9;8921:7;8917:23;8913:32;8910:119;;;8948:79;;:::i;:::-;8910:119;9068:1;9093:53;9138:7;9129:6;9118:9;9114:22;9093:53;:::i;:::-;9083:63;;9039:117;8834:329;;;;:::o;9169:104::-;9214:7;9243:24;9261:5;9243:24;:::i;:::-;9232:35;;9169:104;;;:::o;9279:138::-;9360:32;9386:5;9360:32;:::i;:::-;9353:5;9350:43;9340:71;;9407:1;9404;9397:12;9340:71;9279:138;:::o;9423:155::-;9477:5;9515:6;9502:20;9493:29;;9531:41;9566:5;9531:41;:::i;:::-;9423:155;;;;:::o;9584:635::-;9669:6;9677;9685;9734:2;9722:9;9713:7;9709:23;9705:32;9702:119;;;9740:79;;:::i;:::-;9702:119;9860:1;9885:53;9930:7;9921:6;9910:9;9906:22;9885:53;:::i;:::-;9875:63;;9831:117;9987:2;10013:53;10058:7;10049:6;10038:9;10034:22;10013:53;:::i;:::-;10003:63;;9958:118;10115:2;10141:61;10194:7;10185:6;10174:9;10170:22;10141:61;:::i;:::-;10131:71;;10086:126;9584:635;;;;;:::o;10225:619::-;10302:6;10310;10318;10367:2;10355:9;10346:7;10342:23;10338:32;10335:119;;;10373:79;;:::i;:::-;10335:119;10493:1;10518:53;10563:7;10554:6;10543:9;10539:22;10518:53;:::i;:::-;10508:63;;10464:117;10620:2;10646:53;10691:7;10682:6;10671:9;10667:22;10646:53;:::i;:::-;10636:63;;10591:118;10748:2;10774:53;10819:7;10810:6;10799:9;10795:22;10774:53;:::i;:::-;10764:63;;10719:118;10225:619;;;;;:::o;10850:77::-;10887:7;10916:5;10905:16;;10850:77;;;:::o;10933:118::-;11020:24;11038:5;11020:24;:::i;:::-;11015:3;11008:37;10933:118;;:::o;11057:222::-;11150:4;11188:2;11177:9;11173:18;11165:26;;11201:71;11269:1;11258:9;11254:17;11245:6;11201:71;:::i;:::-;11057:222;;;;:::o;11285:117::-;11394:1;11391;11384:12;11408:117;11517:1;11514;11507:12;11548:568;11621:8;11631:6;11681:3;11674:4;11666:6;11662:17;11658:27;11648:122;;11689:79;;:::i;:::-;11648:122;11802:6;11789:20;11779:30;;11832:18;11824:6;11821:30;11818:117;;;11854:79;;:::i;:::-;11818:117;11968:4;11960:6;11956:17;11944:29;;12022:3;12014:4;12006:6;12002:17;11992:8;11988:32;11985:41;11982:128;;;12029:79;;:::i;:::-;11982:128;11548:568;;;;;:::o;12122:704::-;12217:6;12225;12233;12282:2;12270:9;12261:7;12257:23;12253:32;12250:119;;;12288:79;;:::i;:::-;12250:119;12408:1;12433:53;12478:7;12469:6;12458:9;12454:22;12433:53;:::i;:::-;12423:63;;12379:117;12563:2;12552:9;12548:18;12535:32;12594:18;12586:6;12583:30;12580:117;;;12616:79;;:::i;:::-;12580:117;12729:80;12801:7;12792:6;12781:9;12777:22;12729:80;:::i;:::-;12711:98;;;;12506:313;12122:704;;;;;:::o;12832:332::-;12953:4;12991:2;12980:9;12976:18;12968:26;;13004:71;13072:1;13061:9;13057:17;13048:6;13004:71;:::i;:::-;13085:72;13153:2;13142:9;13138:18;13129:6;13085:72;:::i;:::-;12832:332;;;;;:::o;13170:116::-;13240:21;13255:5;13240:21;:::i;:::-;13233:5;13230:32;13220:60;;13276:1;13273;13266:12;13220:60;13170:116;:::o;13292:133::-;13335:5;13373:6;13360:20;13351:29;;13389:30;13413:5;13389:30;:::i;:::-;13292:133;;;;:::o;13431:468::-;13496:6;13504;13553:2;13541:9;13532:7;13528:23;13524:32;13521:119;;;13559:79;;:::i;:::-;13521:119;13679:1;13704:53;13749:7;13740:6;13729:9;13725:22;13704:53;:::i;:::-;13694:63;;13650:117;13806:2;13832:50;13874:7;13865:6;13854:9;13850:22;13832:50;:::i;:::-;13822:60;;13777:115;13431:468;;;;;:::o;13905:474::-;13973:6;13981;14030:2;14018:9;14009:7;14005:23;14001:32;13998:119;;;14036:79;;:::i;:::-;13998:119;14156:1;14181:53;14226:7;14217:6;14206:9;14202:22;14181:53;:::i;:::-;14171:63;;14127:117;14283:2;14309:53;14354:7;14345:6;14334:9;14330:22;14309:53;:::i;:::-;14299:63;;14254:118;13905:474;;;;;:::o;14385:307::-;14446:4;14536:18;14528:6;14525:30;14522:56;;;14558:18;;:::i;:::-;14522:56;14596:29;14618:6;14596:29;:::i;:::-;14588:37;;14680:4;14674;14670:15;14662:23;;14385:307;;;:::o;14698:410::-;14775:5;14800:65;14816:48;14857:6;14816:48;:::i;:::-;14800:65;:::i;:::-;14791:74;;14888:6;14881:5;14874:21;14926:4;14919:5;14915:16;14964:3;14955:6;14950:3;14946:16;14943:25;14940:112;;;14971:79;;:::i;:::-;14940:112;15061:41;15095:6;15090:3;15085;15061:41;:::i;:::-;14781:327;14698:410;;;;;:::o;15127:338::-;15182:5;15231:3;15224:4;15216:6;15212:17;15208:27;15198:122;;15239:79;;:::i;:::-;15198:122;15356:6;15343:20;15381:78;15455:3;15447:6;15440:4;15432:6;15428:17;15381:78;:::i;:::-;15372:87;;15188:277;15127:338;;;;:::o;15471:943::-;15566:6;15574;15582;15590;15639:3;15627:9;15618:7;15614:23;15610:33;15607:120;;;15646:79;;:::i;:::-;15607:120;15766:1;15791:53;15836:7;15827:6;15816:9;15812:22;15791:53;:::i;:::-;15781:63;;15737:117;15893:2;15919:53;15964:7;15955:6;15944:9;15940:22;15919:53;:::i;:::-;15909:63;;15864:118;16021:2;16047:53;16092:7;16083:6;16072:9;16068:22;16047:53;:::i;:::-;16037:63;;15992:118;16177:2;16166:9;16162:18;16149:32;16208:18;16200:6;16197:30;16194:117;;;16230:79;;:::i;:::-;16194:117;16335:62;16389:7;16380:6;16369:9;16365:22;16335:62;:::i;:::-;16325:72;;16120:287;15471:943;;;;;;;:::o;16420:704::-;16515:6;16523;16531;16580:2;16568:9;16559:7;16555:23;16551:32;16548:119;;;16586:79;;:::i;:::-;16548:119;16706:1;16731:53;16776:7;16767:6;16756:9;16752:22;16731:53;:::i;:::-;16721:63;;16677:117;16861:2;16850:9;16846:18;16833:32;16892:18;16884:6;16881:30;16878:117;;;16914:79;;:::i;:::-;16878:117;17027:80;17099:7;17090:6;17079:9;17075:22;17027:80;:::i;:::-;17009:98;;;;16804:313;16420:704;;;;;:::o;17130:474::-;17198:6;17206;17255:2;17243:9;17234:7;17230:23;17226:32;17223:119;;;17261:79;;:::i;:::-;17223:119;17381:1;17406:53;17451:7;17442:6;17431:9;17427:22;17406:53;:::i;:::-;17396:63;;17352:117;17508:2;17534:53;17579:7;17570:6;17559:9;17555:22;17534:53;:::i;:::-;17524:63;;17479:118;17130:474;;;;;:::o;17610:122::-;17683:24;17701:5;17683:24;:::i;:::-;17676:5;17673:35;17663:63;;17722:1;17719;17712:12;17663:63;17610:122;:::o;17738:139::-;17784:5;17822:6;17809:20;17800:29;;17838:33;17865:5;17838:33;:::i;:::-;17738:139;;;;:::o;17883:329::-;17942:6;17991:2;17979:9;17970:7;17966:23;17962:32;17959:119;;;17997:79;;:::i;:::-;17959:119;18117:1;18142:53;18187:7;18178:6;18167:9;18163:22;18142:53;:::i;:::-;18132:63;;18088:117;17883:329;;;;:::o;18218:474::-;18286:6;18294;18343:2;18331:9;18322:7;18318:23;18314:32;18311:119;;;18349:79;;:::i;:::-;18311:119;18469:1;18494:53;18539:7;18530:6;18519:9;18515:22;18494:53;:::i;:::-;18484:63;;18440:117;18596:2;18622:53;18667:7;18658:6;18647:9;18643:22;18622:53;:::i;:::-;18612:63;;18567:118;18218:474;;;;;:::o;18698:182::-;18838:34;18834:1;18826:6;18822:14;18815:58;18698:182;:::o;18886:366::-;19028:3;19049:67;19113:2;19108:3;19049:67;:::i;:::-;19042:74;;19125:93;19214:3;19125:93;:::i;:::-;19243:2;19238:3;19234:12;19227:19;;18886:366;;;:::o;19258:419::-;19424:4;19462:2;19451:9;19447:18;19439:26;;19511:9;19505:4;19501:20;19497:1;19486:9;19482:17;19475:47;19539:131;19665:4;19539:131;:::i;:::-;19531:139;;19258:419;;;:::o;19683:180::-;19731:77;19728:1;19721:88;19828:4;19825:1;19818:15;19852:4;19849:1;19842:15;19869:320;19913:6;19950:1;19944:4;19940:12;19930:22;;19997:1;19991:4;19987:12;20018:18;20008:81;;20074:4;20066:6;20062:17;20052:27;;20008:81;20136:2;20128:6;20125:14;20105:18;20102:38;20099:84;;20155:18;;:::i;:::-;20099:84;19920:269;19869:320;;;:::o;20195:232::-;20335:34;20331:1;20323:6;20319:14;20312:58;20404:15;20399:2;20391:6;20387:15;20380:40;20195:232;:::o;20433:366::-;20575:3;20596:67;20660:2;20655:3;20596:67;:::i;:::-;20589:74;;20672:93;20761:3;20672:93;:::i;:::-;20790:2;20785:3;20781:12;20774:19;;20433:366;;;:::o;20805:419::-;20971:4;21009:2;20998:9;20994:18;20986:26;;21058:9;21052:4;21048:20;21044:1;21033:9;21029:17;21022:47;21086:131;21212:4;21086:131;:::i;:::-;21078:139;;20805:419;;;:::o;21230:221::-;21370:34;21366:1;21358:6;21354:14;21347:58;21439:4;21434:2;21426:6;21422:15;21415:29;21230:221;:::o;21457:366::-;21599:3;21620:67;21684:2;21679:3;21620:67;:::i;:::-;21613:74;;21696:93;21785:3;21696:93;:::i;:::-;21814:2;21809:3;21805:12;21798:19;;21457:366;;;:::o;21829:419::-;21995:4;22033:2;22022:9;22018:18;22010:26;;22082:9;22076:4;22072:20;22068:1;22057:9;22053:17;22046:47;22110:131;22236:4;22110:131;:::i;:::-;22102:139;;21829:419;;;:::o;22254:244::-;22394:34;22390:1;22382:6;22378:14;22371:58;22463:27;22458:2;22450:6;22446:15;22439:52;22254:244;:::o;22504:366::-;22646:3;22667:67;22731:2;22726:3;22667:67;:::i;:::-;22660:74;;22743:93;22832:3;22743:93;:::i;:::-;22861:2;22856:3;22852:12;22845:19;;22504:366;;;:::o;22876:419::-;23042:4;23080:2;23069:9;23065:18;23057:26;;23129:9;23123:4;23119:20;23115:1;23104:9;23100:17;23093:47;23157:131;23283:4;23157:131;:::i;:::-;23149:139;;22876:419;;;:::o;23301:180::-;23349:77;23346:1;23339:88;23446:4;23443:1;23436:15;23470:4;23467:1;23460:15;23487:221;23627:34;23623:1;23615:6;23611:14;23604:58;23696:4;23691:2;23683:6;23679:15;23672:29;23487:221;:::o;23714:366::-;23856:3;23877:67;23941:2;23936:3;23877:67;:::i;:::-;23870:74;;23953:93;24042:3;23953:93;:::i;:::-;24071:2;24066:3;24062:12;24055:19;;23714:366;;;:::o;24086:419::-;24252:4;24290:2;24279:9;24275:18;24267:26;;24339:9;24333:4;24329:20;24325:1;24314:9;24310:17;24303:47;24367:131;24493:4;24367:131;:::i;:::-;24359:139;;24086:419;;;:::o;24511:180::-;24559:77;24556:1;24549:88;24656:4;24653:1;24646:15;24680:4;24677:1;24670:15;24697:233;24736:3;24759:24;24777:5;24759:24;:::i;:::-;24750:33;;24805:66;24798:5;24795:77;24792:103;;24875:18;;:::i;:::-;24792:103;24922:1;24915:5;24911:13;24904:20;;24697:233;;;:::o;24936:::-;25076:34;25072:1;25064:6;25060:14;25053:58;25145:16;25140:2;25132:6;25128:15;25121:41;24936:233;:::o;25175:366::-;25317:3;25338:67;25402:2;25397:3;25338:67;:::i;:::-;25331:74;;25414:93;25503:3;25414:93;:::i;:::-;25532:2;25527:3;25523:12;25516:19;;25175:366;;;:::o;25547:419::-;25713:4;25751:2;25740:9;25736:18;25728:26;;25800:9;25794:4;25790:20;25786:1;25775:9;25771:17;25764:47;25828:131;25954:4;25828:131;:::i;:::-;25820:139;;25547:419;;;:::o;25972:147::-;26073:11;26110:3;26095:18;;25972:147;;;;:::o;26125:114::-;;:::o;26245:398::-;26404:3;26425:83;26506:1;26501:3;26425:83;:::i;:::-;26418:90;;26517:93;26606:3;26517:93;:::i;:::-;26635:1;26630:3;26626:11;26619:18;;26245:398;;;:::o;26649:379::-;26833:3;26855:147;26998:3;26855:147;:::i;:::-;26848:154;;27019:3;27012:10;;26649:379;;;:::o;27034:163::-;27174:15;27170:1;27162:6;27158:14;27151:39;27034:163;:::o;27203:366::-;27345:3;27366:67;27430:2;27425:3;27366:67;:::i;:::-;27359:74;;27442:93;27531:3;27442:93;:::i;:::-;27560:2;27555:3;27551:12;27544:19;;27203:366;;;:::o;27575:419::-;27741:4;27779:2;27768:9;27764:18;27756:26;;27828:9;27822:4;27818:20;27814:1;27803:9;27799:17;27792:47;27856:131;27982:4;27856:131;:::i;:::-;27848:139;;27575:419;;;:::o;28000:442::-;28149:4;28187:2;28176:9;28172:18;28164:26;;28200:71;28268:1;28257:9;28253:17;28244:6;28200:71;:::i;:::-;28281:72;28349:2;28338:9;28334:18;28325:6;28281:72;:::i;:::-;28363;28431:2;28420:9;28416:18;28407:6;28363:72;:::i;:::-;28000:442;;;;;;:::o;28448:222::-;28588:34;28584:1;28576:6;28572:14;28565:58;28657:5;28652:2;28644:6;28640:15;28633:30;28448:222;:::o;28676:366::-;28818:3;28839:67;28903:2;28898:3;28839:67;:::i;:::-;28832:74;;28915:93;29004:3;28915:93;:::i;:::-;29033:2;29028:3;29024:12;29017:19;;28676:366;;;:::o;29048:419::-;29214:4;29252:2;29241:9;29237:18;29229:26;;29301:9;29295:4;29291:20;29287:1;29276:9;29272:17;29265:47;29329:131;29455:4;29329:131;:::i;:::-;29321:139;;29048:419;;;:::o;29473:94::-;29506:8;29554:5;29550:2;29546:14;29525:35;;29473:94;;;:::o;29573:::-;29612:7;29641:20;29655:5;29641:20;:::i;:::-;29630:31;;29573:94;;;:::o;29673:100::-;29712:7;29741:26;29761:5;29741:26;:::i;:::-;29730:37;;29673:100;;;:::o;29779:157::-;29884:45;29904:24;29922:5;29904:24;:::i;:::-;29884:45;:::i;:::-;29879:3;29872:58;29779:157;;:::o;29942:256::-;30054:3;30069:75;30140:3;30131:6;30069:75;:::i;:::-;30169:2;30164:3;30160:12;30153:19;;30189:3;30182:10;;29942:256;;;;:::o;30204:230::-;30344:34;30340:1;30332:6;30328:14;30321:58;30413:13;30408:2;30400:6;30396:15;30389:38;30204:230;:::o;30440:366::-;30582:3;30603:67;30667:2;30662:3;30603:67;:::i;:::-;30596:74;;30679:93;30768:3;30679:93;:::i;:::-;30797:2;30792:3;30788:12;30781:19;;30440:366;;;:::o;30812:419::-;30978:4;31016:2;31005:9;31001:18;30993:26;;31065:9;31059:4;31055:20;31051:1;31040:9;31036:17;31029:47;31093:131;31219:4;31093:131;:::i;:::-;31085:139;;30812:419;;;:::o;31237:176::-;31377:28;31373:1;31365:6;31361:14;31354:52;31237:176;:::o;31419:366::-;31561:3;31582:67;31646:2;31641:3;31582:67;:::i;:::-;31575:74;;31658:93;31747:3;31658:93;:::i;:::-;31776:2;31771:3;31767:12;31760:19;;31419:366;;;:::o;31791:419::-;31957:4;31995:2;31984:9;31980:18;31972:26;;32044:9;32038:4;32034:20;32030:1;32019:9;32015:17;32008:47;32072:131;32198:4;32072:131;:::i;:::-;32064:139;;31791:419;;;:::o;32216:170::-;32356:22;32352:1;32344:6;32340:14;32333:46;32216:170;:::o;32392:366::-;32534:3;32555:67;32619:2;32614:3;32555:67;:::i;:::-;32548:74;;32631:93;32720:3;32631:93;:::i;:::-;32749:2;32744:3;32740:12;32733:19;;32392:366;;;:::o;32764:419::-;32930:4;32968:2;32957:9;32953:18;32945:26;;33017:9;33011:4;33007:20;33003:1;32992:9;32988:17;32981:47;33045:131;33171:4;33045:131;:::i;:::-;33037:139;;32764:419;;;:::o;33189:180::-;33237:77;33234:1;33227:88;33334:4;33331:1;33324:15;33358:4;33355:1;33348:15;33375:185;33415:1;33432:20;33450:1;33432:20;:::i;:::-;33427:25;;33466:20;33484:1;33466:20;:::i;:::-;33461:25;;33505:1;33495:35;;33510:18;;:::i;:::-;33495:35;33552:1;33549;33545:9;33540:14;;33375:185;;;;:::o;33566:348::-;33606:7;33629:20;33647:1;33629:20;:::i;:::-;33624:25;;33663:20;33681:1;33663:20;:::i;:::-;33658:25;;33851:1;33783:66;33779:74;33776:1;33773:81;33768:1;33761:9;33754:17;33750:105;33747:131;;;33858:18;;:::i;:::-;33747:131;33906:1;33903;33899:9;33888:20;;33566:348;;;;:::o;33920:238::-;34060:34;34056:1;34048:6;34044:14;34037:58;34129:21;34124:2;34116:6;34112:15;34105:46;33920:238;:::o;34164:366::-;34306:3;34327:67;34391:2;34386:3;34327:67;:::i;:::-;34320:74;;34403:93;34492:3;34403:93;:::i;:::-;34521:2;34516:3;34512:12;34505:19;;34164:366;;;:::o;34536:419::-;34702:4;34740:2;34729:9;34725:18;34717:26;;34789:9;34783:4;34779:20;34775:1;34764:9;34760:17;34753:47;34817:131;34943:4;34817:131;:::i;:::-;34809:139;;34536:419;;;:::o;34961:181::-;35101:33;35097:1;35089:6;35085:14;35078:57;34961:181;:::o;35148:366::-;35290:3;35311:67;35375:2;35370:3;35311:67;:::i;:::-;35304:74;;35387:93;35476:3;35387:93;:::i;:::-;35505:2;35500:3;35496:12;35489:19;;35148:366;;;:::o;35520:419::-;35686:4;35724:2;35713:9;35709:18;35701:26;;35773:9;35767:4;35763:20;35759:1;35748:9;35744:17;35737:47;35801:131;35927:4;35801:131;:::i;:::-;35793:139;;35520:419;;;:::o;35945:164::-;36085:16;36081:1;36073:6;36069:14;36062:40;35945:164;:::o;36115:366::-;36257:3;36278:67;36342:2;36337:3;36278:67;:::i;:::-;36271:74;;36354:93;36443:3;36354:93;:::i;:::-;36472:2;36467:3;36463:12;36456:19;;36115:366;;;:::o;36487:419::-;36653:4;36691:2;36680:9;36676:18;36668:26;;36740:9;36734:4;36730:20;36726:1;36715:9;36711:17;36704:47;36768:131;36894:4;36768:131;:::i;:::-;36760:139;;36487:419;;;:::o;36912:305::-;36952:3;36971:20;36989:1;36971:20;:::i;:::-;36966:25;;37005:20;37023:1;37005:20;:::i;:::-;37000:25;;37159:1;37091:66;37087:74;37084:1;37081:81;37078:107;;;37165:18;;:::i;:::-;37078:107;37209:1;37206;37202:9;37195:16;;36912:305;;;;:::o;37223:168::-;37363:20;37359:1;37351:6;37347:14;37340:44;37223:168;:::o;37397:366::-;37539:3;37560:67;37624:2;37619:3;37560:67;:::i;:::-;37553:74;;37636:93;37725:3;37636:93;:::i;:::-;37754:2;37749:3;37745:12;37738:19;;37397:366;;;:::o;37769:419::-;37935:4;37973:2;37962:9;37958:18;37950:26;;38022:9;38016:4;38012:20;38008:1;37997:9;37993:17;37986:47;38050:131;38176:4;38050:131;:::i;:::-;38042:139;;37769:419;;;:::o;38194:181::-;38334:33;38330:1;38322:6;38318:14;38311:57;38194:181;:::o;38381:366::-;38523:3;38544:67;38608:2;38603:3;38544:67;:::i;:::-;38537:74;;38620:93;38709:3;38620:93;:::i;:::-;38738:2;38733:3;38729:12;38722:19;;38381:366;;;:::o;38753:419::-;38919:4;38957:2;38946:9;38942:18;38934:26;;39006:9;39000:4;38996:20;38992:1;38981:9;38977:17;38970:47;39034:131;39160:4;39034:131;:::i;:::-;39026:139;;38753:419;;;:::o;39178:143::-;39235:5;39266:6;39260:13;39251:22;;39282:33;39309:5;39282:33;:::i;:::-;39178:143;;;;:::o;39327:351::-;39397:6;39446:2;39434:9;39425:7;39421:23;39417:32;39414:119;;;39452:79;;:::i;:::-;39414:119;39572:1;39597:64;39653:7;39644:6;39633:9;39629:22;39597:64;:::i;:::-;39587:74;;39543:128;39327:351;;;;:::o;39684:220::-;39824:34;39820:1;39812:6;39808:14;39801:58;39893:3;39888:2;39880:6;39876:15;39869:28;39684:220;:::o;39910:366::-;40052:3;40073:67;40137:2;40132:3;40073:67;:::i;:::-;40066:74;;40149:93;40238:3;40149:93;:::i;:::-;40267:2;40262:3;40258:12;40251:19;;39910:366;;;:::o;40282:419::-;40448:4;40486:2;40475:9;40471:18;40463:26;;40535:9;40529:4;40525:20;40521:1;40510:9;40506:17;40499:47;40563:131;40689:4;40563:131;:::i;:::-;40555:139;;40282:419;;;:::o;40707:165::-;40847:17;40843:1;40835:6;40831:14;40824:41;40707:165;:::o;40878:366::-;41020:3;41041:67;41105:2;41100:3;41041:67;:::i;:::-;41034:74;;41117:93;41206:3;41117:93;:::i;:::-;41235:2;41230:3;41226:12;41219:19;;40878:366;;;:::o;41250:419::-;41416:4;41454:2;41443:9;41439:18;41431:26;;41503:9;41497:4;41493:20;41489:1;41478:9;41474:17;41467:47;41531:131;41657:4;41531:131;:::i;:::-;41523:139;;41250:419;;;:::o;41675:178::-;41815:30;41811:1;41803:6;41799:14;41792:54;41675:178;:::o;41859:366::-;42001:3;42022:67;42086:2;42081:3;42022:67;:::i;:::-;42015:74;;42098:93;42187:3;42098:93;:::i;:::-;42216:2;42211:3;42207:12;42200:19;;41859:366;;;:::o;42231:419::-;42397:4;42435:2;42424:9;42420:18;42412:26;;42484:9;42478:4;42474:20;42470:1;42459:9;42455:17;42448:47;42512:131;42638:4;42512:131;:::i;:::-;42504:139;;42231:419;;;:::o;42656:553::-;42833:4;42871:3;42860:9;42856:19;42848:27;;42885:71;42953:1;42942:9;42938:17;42929:6;42885:71;:::i;:::-;42966:72;43034:2;43023:9;43019:18;43010:6;42966:72;:::i;:::-;43048;43116:2;43105:9;43101:18;43092:6;43048:72;:::i;:::-;43130;43198:2;43187:9;43183:18;43174:6;43130:72;:::i;:::-;42656:553;;;;;;;:::o;43215:234::-;43355:34;43351:1;43343:6;43339:14;43332:58;43424:17;43419:2;43411:6;43407:15;43400:42;43215:234;:::o;43455:366::-;43597:3;43618:67;43682:2;43677:3;43618:67;:::i;:::-;43611:74;;43694:93;43783:3;43694:93;:::i;:::-;43812:2;43807:3;43803:12;43796:19;;43455:366;;;:::o;43827:419::-;43993:4;44031:2;44020:9;44016:18;44008:26;;44080:9;44074:4;44070:20;44066:1;44055:9;44051:17;44044:47;44108:131;44234:4;44108:131;:::i;:::-;44100:139;;43827:419;;;:::o;44252:148::-;44354:11;44391:3;44376:18;;44252:148;;;;:::o;44406:377::-;44512:3;44540:39;44573:5;44540:39;:::i;:::-;44595:89;44677:6;44672:3;44595:89;:::i;:::-;44588:96;;44693:52;44738:6;44733:3;44726:4;44719:5;44715:16;44693:52;:::i;:::-;44770:6;44765:3;44761:16;44754:23;;44516:267;44406:377;;;;:::o;44789:435::-;44969:3;44991:95;45082:3;45073:6;44991:95;:::i;:::-;44984:102;;45103:95;45194:3;45185:6;45103:95;:::i;:::-;45096:102;;45215:3;45208:10;;44789:435;;;;;:::o;45230:173::-;45370:25;45366:1;45358:6;45354:14;45347:49;45230:173;:::o;45409:366::-;45551:3;45572:67;45636:2;45631:3;45572:67;:::i;:::-;45565:74;;45648:93;45737:3;45648:93;:::i;:::-;45766:2;45761:3;45757:12;45750:19;;45409:366;;;:::o;45781:419::-;45947:4;45985:2;45974:9;45970:18;45962:26;;46034:9;46028:4;46024:20;46020:1;46009:9;46005:17;45998:47;46062:131;46188:4;46062:131;:::i;:::-;46054:139;;45781:419;;;:::o;46206:85::-;46251:7;46280:5;46269:16;;46206:85;;;:::o;46297:158::-;46355:9;46388:61;46406:42;46415:32;46441:5;46415:32;:::i;:::-;46406:42;:::i;:::-;46388:61;:::i;:::-;46375:74;;46297:158;;;:::o;46461:147::-;46556:45;46595:5;46556:45;:::i;:::-;46551:3;46544:58;46461:147;;:::o;46614:569::-;46799:4;46837:3;46826:9;46822:19;46814:27;;46851:71;46919:1;46908:9;46904:17;46895:6;46851:71;:::i;:::-;46932:80;47008:2;46997:9;46993:18;46984:6;46932:80;:::i;:::-;47022:72;47090:2;47079:9;47075:18;47066:6;47022:72;:::i;:::-;47104;47172:2;47161:9;47157:18;47148:6;47104:72;:::i;:::-;46614:569;;;;;;;:::o;47189:225::-;47329:34;47325:1;47317:6;47313:14;47306:58;47398:8;47393:2;47385:6;47381:15;47374:33;47189:225;:::o;47420:366::-;47562:3;47583:67;47647:2;47642:3;47583:67;:::i;:::-;47576:74;;47659:93;47748:3;47659:93;:::i;:::-;47777:2;47772:3;47768:12;47761:19;;47420:366;;;:::o;47792:419::-;47958:4;47996:2;47985:9;47981:18;47973:26;;48045:9;48039:4;48035:20;48031:1;48020:9;48016:17;48009:47;48073:131;48199:4;48073:131;:::i;:::-;48065:139;;47792:419;;;:::o;48217:237::-;48357:34;48353:1;48345:6;48341:14;48334:58;48426:20;48421:2;48413:6;48409:15;48402:45;48217:237;:::o;48460:366::-;48602:3;48623:67;48687:2;48682:3;48623:67;:::i;:::-;48616:74;;48699:93;48788:3;48699:93;:::i;:::-;48817:2;48812:3;48808:12;48801:19;;48460:366;;;:::o;48832:419::-;48998:4;49036:2;49025:9;49021:18;49013:26;;49085:9;49079:4;49075:20;49071:1;49060:9;49056:17;49049:47;49113:131;49239:4;49113:131;:::i;:::-;49105:139;;48832:419;;;:::o;49257:225::-;49397:34;49393:1;49385:6;49381:14;49374:58;49466:8;49461:2;49453:6;49449:15;49442:33;49257:225;:::o;49488:366::-;49630:3;49651:67;49715:2;49710:3;49651:67;:::i;:::-;49644:74;;49727:93;49816:3;49727:93;:::i;:::-;49845:2;49840:3;49836:12;49829:19;;49488:366;;;:::o;49860:419::-;50026:4;50064:2;50053:9;50049:18;50041:26;;50113:9;50107:4;50103:20;50099:1;50088:9;50084:17;50077:47;50141:131;50267:4;50141:131;:::i;:::-;50133:139;;49860:419;;;:::o;50285:118::-;50322:7;50362:34;50355:5;50351:46;50340:57;;50285:118;;;:::o;50409:191::-;50449:4;50469:20;50487:1;50469:20;:::i;:::-;50464:25;;50503:20;50521:1;50503:20;:::i;:::-;50498:25;;50542:1;50539;50536:8;50533:34;;;50547:18;;:::i;:::-;50533:34;50592:1;50589;50585:9;50577:17;;50409:191;;;;:::o;50606:273::-;50646:3;50665:20;50683:1;50665:20;:::i;:::-;50660:25;;50699:20;50717:1;50699:20;:::i;:::-;50694:25;;50821:1;50785:34;50781:42;50778:1;50775:49;50772:75;;;50827:18;;:::i;:::-;50772:75;50871:1;50868;50864:9;50857:16;;50606:273;;;;:::o;50885:229::-;51025:34;51021:1;51013:6;51009:14;51002:58;51094:12;51089:2;51081:6;51077:15;51070:37;50885:229;:::o;51120:366::-;51262:3;51283:67;51347:2;51342:3;51283:67;:::i;:::-;51276:74;;51359:93;51448:3;51359:93;:::i;:::-;51477:2;51472:3;51468:12;51461:19;;51120:366;;;:::o;51492:419::-;51658:4;51696:2;51685:9;51681:18;51673:26;;51745:9;51739:4;51735:20;51731:1;51720:9;51716:17;51709:47;51773:131;51899:4;51773:131;:::i;:::-;51765:139;;51492:419;;;:::o;51917:191::-;51957:4;51977:20;51995:1;51977:20;:::i;:::-;51972:25;;52011:20;52029:1;52011:20;:::i;:::-;52006:25;;52050:1;52047;52044:8;52041:34;;;52055:18;;:::i;:::-;52041:34;52100:1;52097;52093:9;52085:17;;51917:191;;;;:::o;52114:171::-;52153:3;52176:24;52194:5;52176:24;:::i;:::-;52167:33;;52222:4;52215:5;52212:15;52209:41;;52230:18;;:::i;:::-;52209:41;52277:1;52270:5;52266:13;52259:20;;52114:171;;;:::o;52291:234::-;52431:34;52427:1;52419:6;52415:14;52408:58;52500:17;52495:2;52487:6;52483:15;52476:42;52291:234;:::o;52531:366::-;52673:3;52694:67;52758:2;52753:3;52694:67;:::i;:::-;52687:74;;52770:93;52859:3;52770:93;:::i;:::-;52888:2;52883:3;52879:12;52872:19;;52531:366;;;:::o;52903:419::-;53069:4;53107:2;53096:9;53092:18;53084:26;;53156:9;53150:4;53146:20;53142:1;53131:9;53127:17;53120:47;53184:131;53310:4;53184:131;:::i;:::-;53176:139;;52903:419;;;:::o;53328:98::-;53379:6;53413:5;53407:12;53397:22;;53328:98;;;:::o;53432:168::-;53515:11;53549:6;53544:3;53537:19;53589:4;53584:3;53580:14;53565:29;;53432:168;;;;:::o;53606:360::-;53692:3;53720:38;53752:5;53720:38;:::i;:::-;53774:70;53837:6;53832:3;53774:70;:::i;:::-;53767:77;;53853:52;53898:6;53893:3;53886:4;53879:5;53875:16;53853:52;:::i;:::-;53930:29;53952:6;53930:29;:::i;:::-;53925:3;53921:39;53914:46;;53696:270;53606:360;;;;:::o;53972:640::-;54167:4;54205:3;54194:9;54190:19;54182:27;;54219:71;54287:1;54276:9;54272:17;54263:6;54219:71;:::i;:::-;54300:72;54368:2;54357:9;54353:18;54344:6;54300:72;:::i;:::-;54382;54450:2;54439:9;54435:18;54426:6;54382:72;:::i;:::-;54501:9;54495:4;54491:20;54486:2;54475:9;54471:18;54464:48;54529:76;54600:4;54591:6;54529:76;:::i;:::-;54521:84;;53972:640;;;;;;;:::o;54618:141::-;54674:5;54705:6;54699:13;54690:22;;54721:32;54747:5;54721:32;:::i;:::-;54618:141;;;;:::o;54765:349::-;54834:6;54883:2;54871:9;54862:7;54858:23;54854:32;54851:119;;;54889:79;;:::i;:::-;54851:119;55009:1;55034:63;55089:7;55080:6;55069:9;55065:22;55034:63;:::i;:::-;55024:73;;54980:127;54765:349;;;;:::o;55120:176::-;55152:1;55169:20;55187:1;55169:20;:::i;:::-;55164:25;;55203:20;55221:1;55203:20;:::i;:::-;55198:25;;55242:1;55232:35;;55247:18;;:::i;:::-;55232:35;55288:1;55285;55281:9;55276:14;;55120:176;;;;:::o;55302:220::-;55442:34;55438:1;55430:6;55426:14;55419:58;55511:3;55506:2;55498:6;55494:15;55487:28;55302:220;:::o;55528:366::-;55670:3;55691:67;55755:2;55750:3;55691:67;:::i;:::-;55684:74;;55767:93;55856:3;55767:93;:::i;:::-;55885:2;55880:3;55876:12;55869:19;;55528:366;;;:::o;55900:419::-;56066:4;56104:2;56093:9;56089:18;56081:26;;56153:9;56147:4;56143:20;56139:1;56128:9;56124:17;56117:47;56181:131;56307:4;56181:131;:::i;:::-;56173:139;;55900:419;;;:::o;56325:179::-;56465:31;56461:1;56453:6;56449:14;56442:55;56325:179;:::o;56510:366::-;56652:3;56673:67;56737:2;56732:3;56673:67;:::i;:::-;56666:74;;56749:93;56838:3;56749:93;:::i;:::-;56867:2;56862:3;56858:12;56851:19;;56510:366;;;:::o;56882:419::-;57048:4;57086:2;57075:9;57071:18;57063:26;;57135:9;57129:4;57125:20;57121:1;57110:9;57106:17;57099:47;57163:131;57289:4;57163:131;:::i;:::-;57155:139;;56882:419;;;:::o;57307:221::-;57447:34;57443:1;57435:6;57431:14;57424:58;57516:4;57511:2;57503:6;57499:15;57492:29;57307:221;:::o;57534:366::-;57676:3;57697:67;57761:2;57756:3;57697:67;:::i;:::-;57690:74;;57773:93;57862:3;57773:93;:::i;:::-;57891:2;57886:3;57882:12;57875:19;;57534:366;;;:::o;57906:419::-;58072:4;58110:2;58099:9;58095:18;58087:26;;58159:9;58153:4;58149:20;58145:1;58134:9;58130:17;58123:47;58187:131;58313:4;58187:131;:::i;:::-;58179:139;;57906:419;;;:::o
Swarm Source
ipfs://bbaebefae9df907012b919163348d578c0b3b54473e7966fedc662e153769801
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.