Contract Overview
Balance:
0.96 MATIC
My Name Tag:
Not Available
TokenTracker:
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
BusinessCard
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT // Because every self-respected businessman needs his business card pragma solidity ^0.8.0; import "./BusinessCardUtils.sol"; import "./Ownable.sol"; import "./IERC721.sol"; import "./IERC721Enumerable.sol"; import "./IERC721Metadata.sol"; import "./IERC721Receiver.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165Storage.sol"; import "./SafeMath.sol"; import "./EnumerableMap.sol"; import "./EnumerableSet.sol"; contract ISoulboundCard { function burnAllSoulboundCardsOfToken(uint256 tokenId) external { } } /** * @title NFT Business Card smart contract * @dev compliant with https://eips.ethereum.org/EIPS/eip-721 */ contract BusinessCard is ERC165Storage, IERC721, IERC721Metadata, IERC721Enumerable, Ownable { using SafeMath for uint256; using Address for address; using EnumerableSet for EnumerableSet.UintSet; using EnumerableMap for EnumerableMap.UintToAddressMap; using Strings for uint256; // Mapping from holder address to their (enumerable) set of owned tokens mapping (address => EnumerableSet.UintSet) private _holderTokens; // Enumerable mapping from token ids to their owners EnumerableMap.UintToAddressMap private _tokenOwners; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; // Token name string private _name; // Token symbol string private _symbol; // Mapping for token URIs mapping (uint256 => string) private _tokenURIs; // Base URI string private _baseURI; // Public variables uint256 public constant maxSupply = 1111; bool public saleStarted; // Random nonce for generating genes uint256 private randNonce; struct Card { uint256 genes; string name; } // Mapping from token ID to genes mapping (uint256 => Card) private _tokenStats; // Mapping for reserved names, reserved names are stored in lowercase mapping (string => bool) private _nameReserved; // Values sent in the event when minting / updating a card // All the metadata attributes that do NOT get stored on chain struct CardProperties { string position; string twitterAccount; string telegramAccount; string telegramGroup; uint256 discordAccount; string discordGroup; string githubUsername; string website; } // Default URI string private _defaultURI; // Address of the oracle address private serverOracle; // Requests made to the NFT oracle mapping(uint256 => bool) public requests; // Marketplace address address private bCardMarketplace; // sCard address - SoulboundCards ISoulboundCard private sCard; // Token mint price uint256 public mintPrice = 0.1 ether; // Token URI update / swap price uint256 public updatePrice = 0.05 ether; // Oracle update transaction gas price uint256 public oraclePrice = 0.015 ether; // Oracle related events event UpdateRequest(uint256 tokenId, uint256 genes, string name, CardProperties cardProperties); event SwapRequest(uint256 tokenId1, uint256 tokenId2, uint256 genes1, uint256 genes2); event TokenURIUpdated(uint256 tokenId, string tokenURI); /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection, and defining base and default URIs. */ constructor (string memory name_, string memory symbol_, string memory baseURI_, string memory defaultURI_) { _name = name_; _symbol = symbol_; _baseURI = baseURI_; _defaultURI = defaultURI_; // register the supported interfaces to conform to ERC721 via ERC165 /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ _registerInterface(0x80ac58cd); /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ _registerInterface(0x5b5e139f); /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ _registerInterface(0x780e9d63); } /** * @dev Sets up a new oracle that handles the dynamic aspect of the NFT */ function setOracle(address _serverOracle) external onlyOwner { serverOracle = _serverOracle; } /** * @dev Sets up a Marketplace allowing the native trading of Business Cards */ function setMarketplace(address _marketplace) external onlyOwner { bCardMarketplace = _marketplace; } /** * @dev Sets up the sCard address for interaction */ function setSoulboundCard(address _soulbound) external onlyOwner { sCard = ISoulboundCard(_soulbound); } /** * @dev Changes the update price for the usage of the oracle */ function modifyUpdatePrice(uint256 newUpdatePrice) external onlyOwner { require(newUpdatePrice >= oraclePrice); // dev: Update price must always cover the gas costs of running the oracle updatePrice = newUpdatePrice; } /** * @dev Calls the oracle to update a certain token URI with the newly defined Card struct */ function _updateTokenURI(uint256 _tokenId, uint256 _genes, string calldata _cardName, CardProperties calldata _cardProperties) internal { require(BusinessCardUtils.validateOtherProperties(_cardProperties)); // Other properties are not valid require(_exists(_tokenId)); // Calls for updating the token can only be made if it is not being processed already require(requests[_tokenId] == false, "Update being processed"); requests[_tokenId] = true; // Fund the server oracle with enough funds for the updateCallback transaction payable(serverOracle).transfer(oraclePrice); // Emit event to be catched by the server oracle running off-chain emit UpdateRequest(_tokenId, _genes, _cardName, _cardProperties); } /** * @dev Updates a certain token URI and clears the corresponding update request * Only the assigned server oracle is allowed to call this function */ function updateCallback(uint256 _tokenId, string memory _tokenURI) external { _callback(_tokenId, _tokenURI); } /** * @dev Updates a certain token URI and clears the corresponding update request * Only the assigned server oracle is allowed to call this function */ function swapCallback(uint256 _tokenId1, uint256 _tokenId2, string memory _tokenURI1, string memory _tokenURI2) external { _callback(_tokenId1, _tokenURI1); _callback(_tokenId2, _tokenURI2); } /** * @dev Updates a certain token URI and clears the corresponding update request * Only the assigned server oracle is allowed to call this function */ function _callback(uint256 _tokenId, string memory _tokenURI) internal { require(_msgSender() == serverOracle); // dev: Only the assigned oracle can call this function require(requests[_tokenId]); // dev: Request not in pending list _tokenURIs[_tokenId] = _tokenURI; delete requests[_tokenId]; emit TokenURIUpdated(_tokenId, _tokenURI); } /** * @dev Mints a new NFT Business Card */ function getCard(string calldata _cardName, CardProperties calldata _cardProperties) public payable { require(saleStarted == true); // dev: sale not started or paused, can be managed on frontend require(totalSupply() < maxSupply); // dev: sale has ended, can be managed on frontend require(msg.value >= mintPrice); // dev: value sent is below the price, can be managed on frontend // Minting a new NFT with the name and position provided _safeMint(_msgSender(), totalSupply() + 1, _cardName, _cardProperties); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: d* * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address _to, uint256 _tokenId, string calldata _cardName, CardProperties calldata _cardProperties) internal virtual { require( BusinessCardUtils.validateName(_cardName) && isNameReserved(_cardName) == false, "Name taken or not valid" ); require( BusinessCardUtils.validatePosition(_cardProperties.position), "Position not valid" ); // Generating the random genes, defined by a 26 digit number // The server oracle will convert the genes to a string and add leading zeros, as tokenURIs are generated with this constraint uint256 genes = uint(keccak256(abi.encodePacked(block.timestamp, msg.sender, _cardName, randNonce))) % 10**30; randNonce++; // Generating a new card toggleReserveName(_cardName, true); _tokenStats[_tokenId] = Card(genes, _cardName); _safeMint(_to, _tokenId, abi.encodePacked(_cardName, genes)); _updateTokenURI(_tokenId, genes, _cardName, _cardProperties); } /** * @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 Changes the name and/or position of a given NFT, must be owned by the caller. * Whenever such change is made, it is first immediately reflected in the Card struct, and in the metadata after oracle updates. * User can change both name and position, just the name, or just the position (by leaving those inputs empty) */ function updateCard(uint256 tokenId, string calldata newName, CardProperties calldata newCardProperties) public payable { require(saleStarted == true); // dev: updates paused, can be managed on frontend require(_isApprovedOrOwner(_msgSender(), tokenId), "Caller is not owner nor approved"); require( isNameReserved(newName) == false && ( bytes(newName).length == 0 || BusinessCardUtils.validateName(newName) == true ) , "Name taken or not valid" ); require( bytes(newCardProperties.position).length == 0 || BusinessCardUtils.validatePosition(newCardProperties.position) == true , "Position not valid" ); require( msg.value >= updatePrice || _msgSender() == bCardMarketplace ); // dev: value sent is below the price, can be managed on frontend // Only change the name if specified if (bytes(newName).length > 0) { // De-reserve the old name toggleReserveName(_tokenStats[tokenId].name, false); // Reserve the new name toggleReserveName(newName, true); // Changing the token name _tokenStats[tokenId].name = newName; } // Make new tokenURI update request _updateTokenURI(tokenId, _tokenStats[tokenId].genes, newName, newCardProperties); } /** * @dev Swaps the name and position between two NFTs, must be owned by the caller. * This is to give customers the ability to directly shuffle name and positions of their * cards, and prevent possible "name snipers" */ function swapCards(uint256 tokenId1, uint256 tokenId2) public payable { require(saleStarted == true); // dev: updates paused, can be managed on frontend require( _isApprovedOrOwner(_msgSender(), tokenId1) && _isApprovedOrOwner(_msgSender(), tokenId2), "Caller is not owner nor approved" ); require(msg.value >= updatePrice); // dev: value sent is below the price, can be managed on frontend // Calls for updating the token can only be made if it is not being processed already require(requests[tokenId1] == false && requests[tokenId2] == false, "Update being processed"); // Swapping names between tokens string memory name1 = _tokenStats[tokenId1].name; _tokenStats[tokenId1].name = _tokenStats[tokenId2].name; _tokenStats[tokenId2].name = name1; // Requests now pending requests[tokenId1] = true; requests[tokenId2] = true; // Emitting a single swap request to the oracle -- processed differently emit SwapRequest(tokenId1, tokenId2, _tokenStats[tokenId1].genes, _tokenStats[tokenId2].genes); // Fund the server oracle with enough funds for the swapCallback transaction payable(serverOracle).transfer(oraclePrice); } /** * @dev Updates the tokenURI, intented to be used only when oracle fails to update a tokenURI */ function updateTokenURI(uint256 tokenId, string calldata cardName, CardProperties calldata _cardProperties) external onlyOwner { _updateTokenURI(tokenId, _tokenStats[tokenId].genes, cardName, _cardProperties); } /** * @dev Starts the sale, cannot do so until the oracle is defined */ function startSale() external onlyOwner { require(serverOracle != address(0)); // dev: Oracle not defined saleStarted = true; } /** * @dev Pauses the sale */ function pauseSale() external onlyOwner { saleStarted = false; } /** * @dev Returns the stats of a token */ function tokenStats(uint256 tokenId) public view returns (Card memory) { return _tokenStats[tokenId]; } /** * @dev Overrides the default tokenURI behaviour to include the default URI */ function tokenURI(uint256 tokenId) external view override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory token = _tokenURIs[tokenId]; // If there is no tokenURI, returns the defaultURI, which must be defined after deployment if (bytes(token).length == 0) { return string(abi.encodePacked( baseURI(), defaultURI() )); } else { return string(abi.encodePacked( baseURI(), token )); } } /** * @dev For setting the baseURI for all tokenId's. */ function setBaseURI(string memory newBaseURI) external onlyOwner { require(bytes(newBaseURI).length > 0); _baseURI = newBaseURI; } /** * @dev Returns the default URI set via {_setBaseURI}. This will be * automatically added as a prefix in {tokenURI} to each token's URI, or * to the token ID if no specific URI is set for that token ID. */ function defaultURI() public view virtual returns (string memory) { return _defaultURI; } /** * @dev For setting the default URI for all tokenId's. */ function setDefaultURI(string calldata newDefaultURI) external onlyOwner { require(bytes(newDefaultURI).length > 0); // dev: cannot be set to empty string _defaultURI = newDefaultURI; } /** * @dev Returns if the name has been reserved. * Name reservation checks are made in lowercase */ function isNameReserved(string calldata nameString) public view returns (bool) { return _nameReserved[BusinessCardUtils.toLower(nameString)]; } /** * @dev Reserves the name if isReserve is set to true, de-reserves if set to false * Names are reserved in lowercase, but stored in whatever case the user gave */ function toggleReserveName(string memory str, bool isReserve) internal { _nameReserved[BusinessCardUtils.toLower(str)] = isReserve; } /** * @dev Withdraw balance from this contract (Callable by owner) */ function withdraw() onlyOwner external { uint balance = address(this).balance; payable(msg.sender).transfer(balance); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _holderTokens[owner].length(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token"); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the base URI set via {_setBaseURI}. This will be * automatically added as a prefix in {tokenURI} to each token's URI, or * to the token ID if no specific URI is set for that token ID. */ function baseURI() public view virtual returns (string memory) { return _baseURI; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < balanceOf(owner)); // @dev: index out of bounds return _holderTokens[owner].at(index); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds return _tokenOwners.length(); } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < totalSupply()); // @dev: index out of bounds (uint256 tokenId, ) = _tokenOwners.at(index); return tokenId; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = 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 { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. * * If the sCard smart contract was specified, it burns all Soulbound Cards associated * with the Business Card `tokenId` in the process */ 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, true); } /** * @dev Works as `transferFrom`, but will not burn the associated Soulbound Cards */ function transferFromWithoutBurn(address from, address to, uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId, false); } /** * @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, true); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _tokenOwners.contains(tokenId); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @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"); _holderTokens[_to].add(_tokenId); _tokenOwners.set(_tokenId, _to); emit Transfer(address(0), _to, _tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId, bool burn) internal virtual { require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); // internal owner require(to != address(0), "ERC721: transfer to the zero address"); // Burn the associated Soulbound Cards if (address(sCard) != address(0) && burn) { sCard.burnAllSoulboundCardsOfToken(tokenId); } // Clear approvals from the previous owner _approve(address(0), tokenId); _holderTokens[from].remove(tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) private { _tokenApprovals[tokenId] = to; emit Approval(ownerOf(tokenId), to, tokenId); // internal owner } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (!to.isContract()) { return true; } bytes memory returndata = to.functionCall(abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data ), "ERC721: transfer to non ERC721Receiver implementer"); bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == 0x150b7a02); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-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; import "./BusinessCard.sol"; /** * @dev Useful functions for validating the name and position of Business Cards */ library BusinessCardUtils { /** * @dev Check if the name string is valid: * Alphanumeric and spaces without leading or trailing space, with maximum characters * Must contain at most one space, ensuring a Name SURNAME input. */ function validateName(string calldata str) internal pure returns (bool) { bytes memory b = bytes(str); // String length requirements if( b.length == 0 || b.length > 22 || b[0] == 0x20 || b[b.length - 1] == 0x20 ) return false; // Characters check require(validateString(str), "Non valid characters"); // Name is validated return true; } /** * @dev Check if the position string is valid: * Alphanumeric and spaces without leading or trailing space, with maximum characters */ function validatePosition(string calldata str) internal pure returns (bool) { bytes memory b = bytes(str); // String length requirements if( b.length == 0 || b.length > 32 || b[0] == 0x20 || b[b.length - 1] == 0x20 ) return false; // Characters check require(validateString(str), "Non valid characters"); // Position is validated return true; } /** * @dev Validates that string contains valid characters, alphanumerical and some special symbols */ function validateString(string calldata str) internal pure returns (bool) { bytes memory b = bytes(str); bytes1 lastChar = b[0]; for(uint i; i<b.length; ++i){ bytes1 char = b[i]; if (char == 0x20 && lastChar == 0x20) return false; // Cannot contain continuous spaces if( !(char >= 0x20 && char <= 0x3F) && // Special characters and numbers !(char >= 0x41 && char <= 0x5A) && // A-Z !(char >= 0x61 && char <= 0x7A) // a-z ) return false; lastChar = char; } return true; } function validateOtherProperties(BusinessCard.CardProperties calldata cardProperties) internal pure returns (bool) { if( bytes(cardProperties.twitterAccount).length < 15 && bytes(cardProperties.telegramAccount).length < 32 && bytes(cardProperties.telegramGroup).length < 32 && ((cardProperties.discordAccount >= 10**17 && cardProperties.discordAccount < 10**18) || cardProperties.discordAccount == 0) && bytes(cardProperties.discordGroup).length < 32 && bytes(cardProperties.githubUsername).length < 39 && bytes(cardProperties.website).length < 50 ) return true; return false; } /** * @dev Converts the string to lowercase */ function toLower(string memory str) internal pure returns (string memory){ bytes memory bStr = bytes(str); bytes memory bLower = new bytes(bStr.length); for (uint i = 0; i < bStr.length; ++i) { // Uppercase character if ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) { bLower[i] = bytes1(uint8(bStr[i]) + 32); } else { bLower[i] = bStr[i]; } } return string(bLower); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableMap.sol) pragma solidity ^0.8.0; import "./EnumerableSet.sol"; /** * @dev Library for managing an enumerable variant of Solidity's * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] * type. * * Maps have the following properties: * * - Entries are added, removed, and checked for existence in constant time * (O(1)). * - Entries are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableMap for EnumerableMap.UintToAddressMap; * * // Declare a set state variable * EnumerableMap.UintToAddressMap private myMap; * } * ``` * * The following map types are supported: * * - `uint256 -> address` (`UintToAddressMap`) since v3.0.0 * - `address -> uint256` (`AddressToUintMap`) since v4.6.0 * - `bytes32 -> bytes32` (`Bytes32ToBytes32`) since v4.6.0 * - `uint256 -> uint256` (`UintToUintMap`) since v4.7.0 * - `bytes32 -> uint256` (`Bytes32ToUintMap`) since v4.7.0 * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableMap, you can either remove all elements one by one or create a fresh instance using an array of EnumerableMap. * ==== */ library EnumerableMap { using EnumerableSet for EnumerableSet.Bytes32Set; // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Map type with // bytes32 keys and values. // The Map implementation uses private functions, and user-facing // implementations (such as Uint256ToAddressMap) are just wrappers around // the underlying Map. // This means that we can only create new EnumerableMaps for types that fit // in bytes32. struct Bytes32ToBytes32Map { // Storage of keys EnumerableSet.Bytes32Set _keys; mapping(bytes32 => bytes32) _values; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set( Bytes32ToBytes32Map storage map, bytes32 key, bytes32 value ) internal returns (bool) { map._values[key] = value; return map._keys.add(key); } /** * @dev Removes a key-value pair from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(Bytes32ToBytes32Map storage map, bytes32 key) internal returns (bool) { delete map._values[key]; return map._keys.remove(key); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bool) { return map._keys.contains(key); } /** * @dev Returns the number of key-value pairs in the map. O(1). */ function length(Bytes32ToBytes32Map storage map) internal view returns (uint256) { return map._keys.length(); } /** * @dev Returns the key-value pair stored at position `index` in the map. O(1). * * Note that there are no guarantees on the ordering of entries inside the * array, and it may change when more entries are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32ToBytes32Map storage map, uint256 index) internal view returns (bytes32, bytes32) { bytes32 key = map._keys.at(index); return (key, map._values[key]); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. */ function tryGet(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bool, bytes32) { bytes32 value = map._values[key]; if (value == bytes32(0)) { return (contains(map, key), bytes32(0)); } else { return (true, value); } } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bytes32) { bytes32 value = map._values[key]; require(value != 0 || contains(map, key), "EnumerableMap: nonexistent key"); return value; } /** * @dev Same as {_get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {_tryGet}. */ function get( Bytes32ToBytes32Map storage map, bytes32 key, string memory errorMessage ) internal view returns (bytes32) { bytes32 value = map._values[key]; require(value != 0 || contains(map, key), errorMessage); return value; } // UintToUintMap struct UintToUintMap { Bytes32ToBytes32Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set( UintToUintMap storage map, uint256 key, uint256 value ) internal returns (bool) { return set(map._inner, bytes32(key), bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(UintToUintMap storage map, uint256 key) internal returns (bool) { return remove(map._inner, bytes32(key)); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(UintToUintMap storage map, uint256 key) internal view returns (bool) { return contains(map._inner, bytes32(key)); } /** * @dev Returns the number of elements in the map. O(1). */ function length(UintToUintMap storage map) internal view returns (uint256) { return length(map._inner); } /** * @dev Returns the element stored at position `index` in the set. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintToUintMap storage map, uint256 index) internal view returns (uint256, uint256) { (bytes32 key, bytes32 value) = at(map._inner, index); return (uint256(key), uint256(value)); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. */ function tryGet(UintToUintMap storage map, uint256 key) internal view returns (bool, uint256) { (bool success, bytes32 value) = tryGet(map._inner, bytes32(key)); return (success, uint256(value)); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(UintToUintMap storage map, uint256 key) internal view returns (uint256) { return uint256(get(map._inner, bytes32(key))); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryGet}. */ function get( UintToUintMap storage map, uint256 key, string memory errorMessage ) internal view returns (uint256) { return uint256(get(map._inner, bytes32(key), errorMessage)); } // UintToAddressMap struct UintToAddressMap { Bytes32ToBytes32Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set( UintToAddressMap storage map, uint256 key, address value ) internal returns (bool) { return set(map._inner, bytes32(key), bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) { return remove(map._inner, bytes32(key)); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) { return contains(map._inner, bytes32(key)); } /** * @dev Returns the number of elements in the map. O(1). */ function length(UintToAddressMap storage map) internal view returns (uint256) { return length(map._inner); } /** * @dev Returns the element stored at position `index` in the set. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) { (bytes32 key, bytes32 value) = at(map._inner, index); return (uint256(key), address(uint160(uint256(value)))); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. * * _Available since v3.4._ */ function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) { (bool success, bytes32 value) = tryGet(map._inner, bytes32(key)); return (success, address(uint160(uint256(value)))); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(UintToAddressMap storage map, uint256 key) internal view returns (address) { return address(uint160(uint256(get(map._inner, bytes32(key))))); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryGet}. */ function get( UintToAddressMap storage map, uint256 key, string memory errorMessage ) internal view returns (address) { return address(uint160(uint256(get(map._inner, bytes32(key), errorMessage)))); } // AddressToUintMap struct AddressToUintMap { Bytes32ToBytes32Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set( AddressToUintMap storage map, address key, uint256 value ) internal returns (bool) { return set(map._inner, bytes32(uint256(uint160(key))), bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(AddressToUintMap storage map, address key) internal returns (bool) { return remove(map._inner, bytes32(uint256(uint160(key)))); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(AddressToUintMap storage map, address key) internal view returns (bool) { return contains(map._inner, bytes32(uint256(uint160(key)))); } /** * @dev Returns the number of elements in the map. O(1). */ function length(AddressToUintMap storage map) internal view returns (uint256) { return length(map._inner); } /** * @dev Returns the element stored at position `index` in the set. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressToUintMap storage map, uint256 index) internal view returns (address, uint256) { (bytes32 key, bytes32 value) = at(map._inner, index); return (address(uint160(uint256(key))), uint256(value)); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. */ function tryGet(AddressToUintMap storage map, address key) internal view returns (bool, uint256) { (bool success, bytes32 value) = tryGet(map._inner, bytes32(uint256(uint160(key)))); return (success, uint256(value)); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(AddressToUintMap storage map, address key) internal view returns (uint256) { return uint256(get(map._inner, bytes32(uint256(uint160(key))))); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryGet}. */ function get( AddressToUintMap storage map, address key, string memory errorMessage ) internal view returns (uint256) { return uint256(get(map._inner, bytes32(uint256(uint160(key))), errorMessage)); } // Bytes32ToUintMap struct Bytes32ToUintMap { Bytes32ToBytes32Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set( Bytes32ToUintMap storage map, bytes32 key, uint256 value ) internal returns (bool) { return set(map._inner, key, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(Bytes32ToUintMap storage map, bytes32 key) internal returns (bool) { return remove(map._inner, key); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(Bytes32ToUintMap storage map, bytes32 key) internal view returns (bool) { return contains(map._inner, key); } /** * @dev Returns the number of elements in the map. O(1). */ function length(Bytes32ToUintMap storage map) internal view returns (uint256) { return length(map._inner); } /** * @dev Returns the element stored at position `index` in the set. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32ToUintMap storage map, uint256 index) internal view returns (bytes32, uint256) { (bytes32 key, bytes32 value) = at(map._inner, index); return (key, uint256(value)); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. */ function tryGet(Bytes32ToUintMap storage map, bytes32 key) internal view returns (bool, uint256) { (bool success, bytes32 value) = tryGet(map._inner, key); return (success, uint256(value)); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(Bytes32ToUintMap storage map, bytes32 key) internal view returns (uint256) { return uint256(get(map._inner, key)); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryGet}. */ function get( Bytes32ToUintMap storage map, bytes32 key, string memory errorMessage ) internal view returns (uint256) { return uint256(get(map._inner, key, errorMessage)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165Storage.sol) pragma solidity ^0.8.0; import "./ERC165.sol"; /** * @dev Storage based implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ abstract contract ERC165Storage is ERC165 { /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return super.supportsInterface(interfaceId) || _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) 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`. * * 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; /** * @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 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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); }
// 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 // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.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.7.0) (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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"string","name":"defaultURI_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"genes1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"genes2","type":"uint256"}],"name":"SwapRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"tokenURI","type":"string"}],"name":"TokenURIUpdated","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":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"genes","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"components":[{"internalType":"string","name":"position","type":"string"},{"internalType":"string","name":"twitterAccount","type":"string"},{"internalType":"string","name":"telegramAccount","type":"string"},{"internalType":"string","name":"telegramGroup","type":"string"},{"internalType":"uint256","name":"discordAccount","type":"uint256"},{"internalType":"string","name":"discordGroup","type":"string"},{"internalType":"string","name":"githubUsername","type":"string"},{"internalType":"string","name":"website","type":"string"}],"indexed":false,"internalType":"struct BusinessCard.CardProperties","name":"cardProperties","type":"tuple"}],"name":"UpdateRequest","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_cardName","type":"string"},{"components":[{"internalType":"string","name":"position","type":"string"},{"internalType":"string","name":"twitterAccount","type":"string"},{"internalType":"string","name":"telegramAccount","type":"string"},{"internalType":"string","name":"telegramGroup","type":"string"},{"internalType":"uint256","name":"discordAccount","type":"uint256"},{"internalType":"string","name":"discordGroup","type":"string"},{"internalType":"string","name":"githubUsername","type":"string"},{"internalType":"string","name":"website","type":"string"}],"internalType":"struct BusinessCard.CardProperties","name":"_cardProperties","type":"tuple"}],"name":"getCard","outputs":[],"stateMutability":"payable","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":[{"internalType":"string","name":"nameString","type":"string"}],"name":"isNameReserved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newUpdatePrice","type":"uint256"}],"name":"modifyUpdatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oraclePrice","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":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"requests","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newDefaultURI","type":"string"}],"name":"setDefaultURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketplace","type":"address"}],"name":"setMarketplace","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_serverOracle","type":"address"}],"name":"setOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_soulbound","type":"address"}],"name":"setSoulboundCard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSale","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":[{"internalType":"uint256","name":"_tokenId1","type":"uint256"},{"internalType":"uint256","name":"_tokenId2","type":"uint256"},{"internalType":"string","name":"_tokenURI1","type":"string"},{"internalType":"string","name":"_tokenURI2","type":"string"}],"name":"swapCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId1","type":"uint256"},{"internalType":"uint256","name":"tokenId2","type":"uint256"}],"name":"swapCards","outputs":[],"stateMutability":"payable","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":"tokenStats","outputs":[{"components":[{"internalType":"uint256","name":"genes","type":"uint256"},{"internalType":"string","name":"name","type":"string"}],"internalType":"struct BusinessCard.Card","name":"","type":"tuple"}],"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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFromWithoutBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"updateCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"newName","type":"string"},{"components":[{"internalType":"string","name":"position","type":"string"},{"internalType":"string","name":"twitterAccount","type":"string"},{"internalType":"string","name":"telegramAccount","type":"string"},{"internalType":"string","name":"telegramGroup","type":"string"},{"internalType":"uint256","name":"discordAccount","type":"uint256"},{"internalType":"string","name":"discordGroup","type":"string"},{"internalType":"string","name":"githubUsername","type":"string"},{"internalType":"string","name":"website","type":"string"}],"internalType":"struct BusinessCard.CardProperties","name":"newCardProperties","type":"tuple"}],"name":"updateCard","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"updatePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"cardName","type":"string"},{"components":[{"internalType":"string","name":"position","type":"string"},{"internalType":"string","name":"twitterAccount","type":"string"},{"internalType":"string","name":"telegramAccount","type":"string"},{"internalType":"string","name":"telegramGroup","type":"string"},{"internalType":"uint256","name":"discordAccount","type":"uint256"},{"internalType":"string","name":"discordGroup","type":"string"},{"internalType":"string","name":"githubUsername","type":"string"},{"internalType":"string","name":"website","type":"string"}],"internalType":"struct BusinessCard.CardProperties","name":"_cardProperties","type":"tuple"}],"name":"updateTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405267016345785d8a000060155566b1a2bc2ec5000060165566354a6ba7a180006017553480156200003357600080fd5b506040516200666b3803806200666b8339818101604052810190620000599190620003f7565b620000796200006d6200012f60201b60201c565b6200013760201b60201c565b836008908051906020019062000091929190620002d5565b508260099080519060200190620000aa929190620002d5565b5081600b9080519060200190620000c3929190620002d5565b508060109080519060200190620000dc929190620002d5565b50620000f56380ac58cd60e01b620001fd60201b60201c565b6200010d635b5e139f60e01b620001fd60201b60201c565b6200012563780e9d6360e01b620001fd60201b60201c565b50505050620006ba565b600033905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000269576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200026090620004ee565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b828054620002e390620005b6565b90600052602060002090601f01602090048101928262000307576000855562000353565b82601f106200032257805160ff191683800117855562000353565b8280016001018555821562000353579182015b828111156200035257825182559160200191906001019062000335565b5b50905062000362919062000366565b5090565b5b808211156200038157600081600090555060010162000367565b5090565b60006200039c620003968462000539565b62000510565b905082815260208101848484011115620003b557600080fd5b620003c284828562000580565b509392505050565b600082601f830112620003dc57600080fd5b8151620003ee84826020860162000385565b91505092915050565b600080600080608085870312156200040e57600080fd5b600085015167ffffffffffffffff8111156200042957600080fd5b6200043787828801620003ca565b945050602085015167ffffffffffffffff8111156200045557600080fd5b6200046387828801620003ca565b935050604085015167ffffffffffffffff8111156200048157600080fd5b6200048f87828801620003ca565b925050606085015167ffffffffffffffff811115620004ad57600080fd5b620004bb87828801620003ca565b91505092959194509250565b6000620004d6601c836200056f565b9150620004e38262000691565b602082019050919050565b600060208201905081810360008301526200050981620004c7565b9050919050565b60006200051c6200052f565b90506200052a8282620005ec565b919050565b6000604051905090565b600067ffffffffffffffff82111562000557576200055662000651565b5b620005628262000680565b9050602081019050919050565b600082825260208201905092915050565b60005b83811015620005a057808201518184015260208101905062000583565b83811115620005b0576000848401525b50505050565b60006002820490506001821680620005cf57607f821691505b60208210811415620005e657620005e562000622565b5b50919050565b620005f78262000680565b810181811067ffffffffffffffff8211171562000619576200061862000651565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433136353a20696e76616c696420696e7465726661636520696400000000600082015250565b615fa180620006ca6000396000f3fe6080604052600436106102725760003560e01c80636817c76c1161014f578063b25691a9116100c1578063d58be3ce1161007a578063d58be3ce1461090f578063d5abeb0114610938578063da1b9e0814610963578063e926ca951461098c578063e985e9c5146109c9578063f2fde38b14610a0657610272565b8063b25691a914610824578063b66a0e5d14610840578063b88d4fde14610857578063bedc922814610880578063c6716137146108a9578063c87b56dd146108d257610272565b80637adbf973116101135780637adbf9731461071657806381d12c581461073f5780638da5cb5b1461077c57806395d89b41146107a7578063a22cb465146107d2578063a5f24d06146107fb57610272565b80636817c76c146106435780636c0360eb1461066e57806370a0823114610699578063715018a6146106d657806373ad6c2d146106ed57610272565b80633a367a67116101e857806355f804b3116101ac57806355f804b314610533578063566c2e951461055c5780635c474f9e146105855780636352211e146105b0578063668aa824146105ed578063673a7e281461061857610272565b80633a367a67146104745780633ccfd60b1461049f57806342842e0e146104b65780634f6ccce7146104df57806355367ba91461051c57610272565b806314a86a011161023a57806314a86a011461036e57806315b56d101461038a57806317ae7a03146103c757806318160ddd146103e357806323b872dd1461040e5780632f745c591461043757610272565b806301ffc9a71461027757806302b53ad0146102b457806306fdde03146102dd578063081812fc14610308578063095ea7b314610345575b600080fd5b34801561028357600080fd5b5061029e600480360381019061029991906145aa565b610a2f565b6040516102ab919061504e565b60405180910390f35b3480156102c057600080fd5b506102db60048036038101906102d6919061479f565b610aa6565b005b3480156102e957600080fd5b506102f2610ab4565b6040516102ff9190615069565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a91906146f2565b610b46565b60405161033c9190614fe7565b60405180910390f35b34801561035157600080fd5b5061036c6004803603810190610367919061456e565b610bcb565b005b6103886004803603810190610383919061471b565b610ce3565b005b34801561039657600080fd5b506103b160048036038101906103ac91906145fc565b611006565b6040516103be919061504e565b60405180910390f35b6103e160048036038101906103dc91906147f3565b611088565b005b3480156103ef57600080fd5b506103f86113fa565b604051610405919061536d565b60405180910390f35b34801561041a57600080fd5b5061043560048036038101906104309190614468565b61140b565b005b34801561044357600080fd5b5061045e6004803603810190610459919061456e565b61146d565b60405161046b919061536d565b60405180910390f35b34801561048057600080fd5b506104896114dc565b6040516104969190615069565b60405180910390f35b3480156104ab57600080fd5b506104b461156e565b005b3480156104c257600080fd5b506104dd60048036038101906104d89190614468565b6115c5565b005b3480156104eb57600080fd5b50610506600480360381019061050191906146f2565b6115e5565b604051610513919061536d565b60405180910390f35b34801561052857600080fd5b5061053161161c565b005b34801561053f57600080fd5b5061055a600480360381019061055591906146b1565b611641565b005b34801561056857600080fd5b50610583600480360381019061057e919061471b565b611671565b005b34801561059157600080fd5b5061059a6116a2565b6040516105a7919061504e565b60405180910390f35b3480156105bc57600080fd5b506105d760048036038101906105d291906146f2565b6116b5565b6040516105e49190614fe7565b60405180910390f35b3480156105f957600080fd5b506106026116ec565b60405161060f919061536d565b60405180910390f35b34801561062457600080fd5b5061062d6116f2565b60405161063a919061536d565b60405180910390f35b34801561064f57600080fd5b506106586116f8565b604051610665919061536d565b60405180910390f35b34801561067a57600080fd5b506106836116fe565b6040516106909190615069565b60405180910390f35b3480156106a557600080fd5b506106c060048036038101906106bb9190614403565b611790565b6040516106cd919061536d565b60405180910390f35b3480156106e257600080fd5b506106eb61184f565b005b3480156106f957600080fd5b50610714600480360381019061070f9190614403565b611863565b005b34801561072257600080fd5b5061073d60048036038101906107389190614403565b6118af565b005b34801561074b57600080fd5b50610766600480360381019061076191906146f2565b6118fb565b604051610773919061504e565b60405180910390f35b34801561078857600080fd5b5061079161191b565b60405161079e9190614fe7565b60405180910390f35b3480156107b357600080fd5b506107bc611945565b6040516107c99190615069565b60405180910390f35b3480156107de57600080fd5b506107f960048036038101906107f49190614532565b6119d7565b005b34801561080757600080fd5b50610822600480360381019061081d9190614468565b611b58565b005b61083e60048036038101906108399190614641565b611bba565b005b34801561084c57600080fd5b50610855611c2a565b005b34801561086357600080fd5b5061087e600480360381019061087991906144b7565b611cab565b005b34801561088c57600080fd5b506108a760048036038101906108a2919061482f565b611d0d565b005b3480156108b557600080fd5b506108d060048036038101906108cb91906146f2565b611d27565b005b3480156108de57600080fd5b506108f960048036038101906108f491906146f2565b611d48565b6040516109069190615069565b60405180910390f35b34801561091b57600080fd5b5061093660048036038101906109319190614403565b611ea6565b005b34801561094457600080fd5b5061094d611ef2565b60405161095a919061536d565b60405180910390f35b34801561096f57600080fd5b5061098a600480360381019061098591906145fc565b611ef8565b005b34801561099857600080fd5b506109b360048036038101906109ae91906146f2565b611f26565b6040516109c0919061534b565b60405180910390f35b3480156109d557600080fd5b506109f060048036038101906109eb919061442c565b611fef565b6040516109fd919061504e565b60405180910390f35b348015610a1257600080fd5b50610a2d6004803603810190610a289190614403565b612083565b005b6000610a3a82612107565b80610a9f5750600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff165b9050919050565b610ab08282612171565b5050565b606060088054610ac390615781565b80601f0160208091040260200160405190810160405280929190818152602001828054610aef90615781565b8015610b3c5780601f10610b1157610100808354040283529160200191610b3c565b820191906000526020600020905b815481529060010190602001808311610b1f57829003601f168201915b5050505050905090565b6000610b5182612284565b610b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b87906151eb565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bd6826116b5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e906152ab565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c666122a1565b73ffffffffffffffffffffffffffffffffffffffff161480610c955750610c9481610c8f6122a1565b611fef565b5b610cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccb9061518b565b60405180910390fd5b610cde83836122a9565b505050565b60011515600c60009054906101000a900460ff16151514610d0357600080fd5b610d14610d0e6122a1565b85612362565b610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a906152cb565b60405180910390fd5b60001515610d618484611006565b1515148015610d8b57506000838390501480610d8a575060011515610d868484612440565b1515145b5b610dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc19061516b565b60405180910390fd5b6000818060000190610ddc9190615452565b90501480610e05575060011515610e01828060000190610dfc9190615452565b6125f3565b1515145b610e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3b9061524b565b60405180910390fd5b60165434101580610ea95750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610e916122a1565b73ffffffffffffffffffffffffffffffffffffffff16145b610eb257600080fd5b6000838390501115610fdd57610f67600e60008681526020019081526020016000206001018054610ee290615781565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0e90615781565b8015610f5b5780601f10610f3057610100808354040283529160200191610f5b565b820191906000526020600020905b815481529060010190602001808311610f3e57829003601f168201915b505050505060006127a6565b610fb683838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505060016127a6565b8282600e60008781526020019081526020016000206001019190610fdb929190614094565b505b61100084600e6000878152602001908152602001600020600001548585856127e8565b50505050565b6000600f61105784848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612950565b6040516110649190614f60565b908152602001604051809103902060009054906101000a900460ff16905092915050565b60011515600c60009054906101000a900460ff161515146110a857600080fd5b6110b96110b36122a1565b83612362565b80156110d257506110d16110cb6122a1565b82612362565b5b611111576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611108906152cb565b60405180910390fd5b60165434101561112057600080fd5b600015156012600084815260200190815260200160002060009054906101000a900460ff1615151480156111785750600015156012600083815260200190815260200160002060009054906101000a900460ff161515145b6111b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ae9061532b565b60405180910390fd5b6000600e600084815260200190815260200160002060010180546111da90615781565b80601f016020809104026020016040519081016040528092919081815260200182805461120690615781565b80156112535780601f1061122857610100808354040283529160200191611253565b820191906000526020600020905b81548152906001019060200180831161123657829003601f168201915b50505050509050600e6000838152602001908152602001600020600101600e600085815260200190815260200160002060010190805461129290615781565b61129d92919061411a565b5080600e600084815260200190815260200160002060010190805190602001906112c89291906141a7565b5060016012600085815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600084815260200190815260200160002060006101000a81548160ff0219169083151502179055507fbab79a74f80f351e29e4b66520154c19064e8a12e5052364180b47ba641c50128383600e600087815260200190815260200160002060000154600e600087815260200190815260200160002060000154604051611382949392919061540d565b60405180910390a1601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6017549081150290604051600060405180830381858888f193505050501580156113f4573d6000803e3d6000fd5b50505050565b60006114066003612c10565b905090565b61141c6114166122a1565b82612362565b61145b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611452906152eb565b60405180910390fd5b6114688383836001612c25565b505050565b600061147883611790565b821061148357600080fd5b6114d482600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612f2190919063ffffffff16565b905092915050565b6060601080546114eb90615781565b80601f016020809104026020016040519081016040528092919081815260200182805461151790615781565b80156115645780601f1061153957610100808354040283529160200191611564565b820191906000526020600020905b81548152906001019060200180831161154757829003601f168201915b5050505050905090565b611576612f3b565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156115c1573d6000803e3d6000fd5b5050565b6115e083838360405180602001604052806000815250611cab565b505050565b60006115ef6113fa565b82106115fa57600080fd5b6000611610836003612fb990919063ffffffff16565b50905080915050919050565b611624612f3b565b6000600c60006101000a81548160ff021916908315150217905550565b611649612f3b565b600081511161165757600080fd5b80600b908051906020019061166d9291906141a7565b5050565b611679612f3b565b61169c84600e6000878152602001908152602001600020600001548585856127e8565b50505050565b600c60009054906101000a900460ff1681565b60006116e582604051806060016040528060298152602001615f43602991396003612fe59092919063ffffffff16565b9050919050565b60175481565b60165481565b60155481565b6060600b805461170d90615781565b80601f016020809104026020016040519081016040528092919081815260200182805461173990615781565b80156117865780601f1061175b57610100808354040283529160200191611786565b820191906000526020600020905b81548152906001019060200180831161176957829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611801576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f8906151ab565b60405180910390fd5b611848600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613004565b9050919050565b611857612f3b565b6118616000613019565b565b61186b612f3b565b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6118b7612f3b565b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60126020528060005260406000206000915054906101000a900460ff1681565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606009805461195490615781565b80601f016020809104026020016040519081016040528092919081815260200182805461198090615781565b80156119cd5780601f106119a2576101008083540402835291602001916119cd565b820191906000526020600020905b8154815290600101906020018083116119b057829003601f168201915b5050505050905090565b6119df6122a1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a449061510b565b60405180910390fd5b8060076000611a5a6122a1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b076122a1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b4c919061504e565b60405180910390a35050565b611b69611b636122a1565b82612362565b611ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9f906152eb565b60405180910390fd5b611bb58383836000612c25565b505050565b60011515600c60009054906101000a900460ff16151514611bda57600080fd5b610457611be56113fa565b10611bef57600080fd5b601554341015611bfe57600080fd5b611c25611c096122a1565b6001611c136113fa565b611c1d91906155fd565b8585856130df565b505050565b611c32612f3b565b600073ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611c8e57600080fd5b6001600c60006101000a81548160ff021916908315150217905550565b611cbc611cb66122a1565b83612362565b611cfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf2906152eb565b60405180910390fd5b611d0784848484613328565b50505050565b611d178483612171565b611d218382612171565b50505050565b611d2f612f3b565b601754811015611d3e57600080fd5b8060168190555050565b6060611d5382612284565b611d92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d899061526b565b60405180910390fd5b6000600a60008481526020019081526020016000208054611db290615781565b80601f0160208091040260200160405190810160405280929190818152602001828054611dde90615781565b8015611e2b5780601f10611e0057610100808354040283529160200191611e2b565b820191906000526020600020905b815481529060010190602001808311611e0e57829003601f168201915b50505050509050600081511415611e7457611e446116fe565b611e4c6114dc565b604051602001611e5d929190614f77565b604051602081830303815290604052915050611ea1565b611e7c6116fe565b81604051602001611e8e929190614f77565b6040516020818303038152906040529150505b919050565b611eae612f3b565b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61045781565b611f00612f3b565b60008282905011611f1057600080fd5b818160109190611f21929190614094565b505050565b611f2e61422d565b600e600083815260200190815260200160002060405180604001604052908160008201548152602001600182018054611f6690615781565b80601f0160208091040260200160405190810160405280929190818152602001828054611f9290615781565b8015611fdf5780601f10611fb457610100808354040283529160200191611fdf565b820191906000526020600020905b815481529060010190602001808311611fc257829003601f168201915b5050505050815250509050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61208b612f3b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f2906150ab565b60405180910390fd5b61210481613019565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166121b26122a1565b73ffffffffffffffffffffffffffffffffffffffff16146121d257600080fd5b6012600083815260200190815260200160002060009054906101000a900460ff166121fc57600080fd5b80600a600084815260200190815260200160002090805190602001906122239291906141a7565b506012600083815260200190815260200160002060006101000a81549060ff02191690557f931f495b9a8e5d8e61946ea5d61e021f636cfe213a801f97589c18c152e408bd8282604051612278929190615388565b60405180910390a15050565b600061229a82600361338690919063ffffffff16565b9050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661231c836116b5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061236d82612284565b6123ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a39061514b565b60405180910390fd5b60006123b7836116b5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061242657508373ffffffffffffffffffffffffffffffffffffffff1661240e84610b46565b73ffffffffffffffffffffffffffffffffffffffff16145b8061243757506124368185611fef565b5b91505092915050565b60008083838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905060008151148061249b575060168151115b8061250f5750602060f81b816000815181106124e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061258f5750602060f81b8160018351612529919061568a565b81518110612560577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b1561259e5760009150506125ed565b6125a884846133a0565b6125e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125de9061528b565b60405180910390fd5b60019150505b92915050565b60008083838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905060008151148061264e575060208151115b806126c25750602060f81b81600081518110612693577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806127425750602060f81b81600183516126dc919061568a565b81518110612713577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b156127515760009150506127a0565b61275b84846133a0565b61279a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127919061528b565b60405180910390fd5b60019150505b92915050565b80600f6127b284612950565b6040516127bf9190614f60565b908152602001604051809103902060006101000a81548160ff0219169083151502179055505050565b6127f18161364f565b6127fa57600080fd5b61280385612284565b61280c57600080fd5b600015156012600087815260200190815260200160002060009054906101000a900460ff16151514612873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286a9061532b565b60405180910390fd5b60016012600087815260200190815260200160002060006101000a81548160ff021916908315150217905550601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6017549081150290604051600060405180830381858888f19350505050158015612909573d6000803e3d6000fd5b507f04d6aedc38d372f18e01cc1d43d491d6bd883fdc6af386e8ceab5d441a84235885858585856040516129419594939291906153b8565b60405180910390a15050505050565b606060008290506000815167ffffffffffffffff81111561299a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156129cc5781602001600182028036833780820191505090505b50905060005b8251811015612c05576041838281518110612a16577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c60ff1610158015612a7f5750605a838281518110612a6b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c60ff1611155b15612b47576020838281518110612abf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c612ad79190615653565b60f81b828281518110612b13577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612bf4565b828181518110612b80577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b828281518110612bc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b80612bfe906157e4565b90506129d2565b508092505050919050565b6000612c1e8260000161374d565b9050919050565b8373ffffffffffffffffffffffffffffffffffffffff16612c45836116b5565b73ffffffffffffffffffffffffffffffffffffffff1614612c9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c929061522b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d02906150eb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015612d675750805b15612dfa57601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ca3c5c07836040518263ffffffff1660e01b8152600401612dc7919061536d565b600060405180830381600087803b158015612de157600080fd5b505af1158015612df5573d6000803e3d6000fd5b505050505b612e056000836122a9565b612e5682600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061376290919063ffffffff16565b50612ea882600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061377c90919063ffffffff16565b50612ebf828460036137969092919063ffffffff16565b50818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b6000612f3083600001836137cb565b60001c905092915050565b612f436122a1565b73ffffffffffffffffffffffffffffffffffffffff16612f6161191b565b73ffffffffffffffffffffffffffffffffffffffff1614612fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fae9061520b565b60405180910390fd5b565b600080600080612fcc866000018661381c565b915091508160001c8160001c9350935050509250929050565b6000612ff8846000018460001b8461385c565b60001c90509392505050565b6000613012826000016138dd565b9050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6130e98383612440565b80156131025750600015156130fe8484611006565b1515145b613141576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131389061516b565b60405180910390fd5b6131598180600001906131549190615452565b6125f3565b613198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318f9061524b565b60405180910390fd5b60006c0c9f2c9cd04674edea4000000042338686600d546040516020016131c3959493929190614f9b565b6040516020818303038152906040528051906020012060001c6131e6919061585b565b9050600d60008154809291906131fb906157e4565b919050555061324f84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505060016127a6565b604051806040016040528082815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815250600e60008781526020019081526020016000206000820151816000015560208201518160010190805190602001906132e19291906141a7565b5090505061331386868686856040516020016132ff93929190614f36565b6040516020818303038152906040526138ee565b61332085828686866127e8565b505050505050565b6133358484846001612c25565b61334184848484613949565b613380576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133779061508b565b60405180910390fd5b50505050565b6000613398836000018360001b613a8e565b905092915050565b60008083838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600081600081518110613426577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b905060005b825181101561364157600083828151811061347a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b9050602060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480156134e15750602060f81b837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b156134f3576000945050505050613649565b602060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161015801561354f5750603f60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b1580156135b55750604160f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916101580156135b35750605a60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b155b801561361a5750606160f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916101580156136185750607a60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b155b1561362c576000945050505050613649565b809250508061363a906157e4565b9050613436565b506001925050505b92915050565b6000600f8280602001906136639190615452565b90501080156136835750602082806040019061367f9190615452565b9050105b80156136a05750602082806060019061369c9190615452565b9050105b80156136de575067016345785d8a00008260800135101580156136ce5750670de0b6b3a76400008260800135105b806136dd575060008260800135145b5b80156136fb57506020828060a001906136f79190615452565b9050105b801561371857506027828060c001906137149190615452565b9050105b801561373557506032828060e001906137319190615452565b9050105b156137435760019050613748565b600090505b919050565b600061375b82600001613aae565b9050919050565b6000613774836000018360001b613ac3565b905092915050565b600061378e836000018360001b613c49565b905092915050565b60006137c2846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613cb9565b90509392505050565b6000826000018281548110613809577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b60008060006138378486600001613cf490919063ffffffff16565b9050808560020160008381526020019081526020016000205492509250509250929050565b6000808460020160008581526020019081526020016000205490506000801b8114158061388f575061388e8585613a8e565b5b83906138d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138c89190615069565b60405180910390fd5b50809150509392505050565b600081600001805490509050919050565b6138f88383613d0b565b6139056000848484613949565b613944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161393b9061508b565b60405180910390fd5b505050565b600061396a8473ffffffffffffffffffffffffffffffffffffffff16613e8d565b6139775760019050613a86565b6000613a3e63150b7a0260e01b61398c6122a1565b8887876040516024016139a29493929190615002565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615f11603291398773ffffffffffffffffffffffffffffffffffffffff16613eb09092919063ffffffff16565b9050600081806020019051810190613a5691906145d3565b905063150b7a0260e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b6000613aa68284600001613ec890919063ffffffff16565b905092915050565b6000613abc826000016138dd565b9050919050565b60008083600101600084815260200190815260200160002054905060008114613c3d576000600182613af5919061568a565b9050600060018660000180549050613b0d919061568a565b9050818114613bc8576000866000018281548110613b54577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110613b9e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480613c02577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050613c43565b60009150505b92915050565b6000613c558383613edf565b613cae578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613cb3565b600090505b92915050565b60008184600201600085815260200190815260200160002081905550613ceb8385600001613f0290919063ffffffff16565b90509392505050565b6000613d0383600001836137cb565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d72906151cb565b60405180910390fd5b613d8481612284565b15613dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dbb906150cb565b60405180910390fd5b613e1581600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061377c90919063ffffffff16565b50613e2c818360036137969092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060613ebf8484600085613f19565b90509392505050565b6000613ed78360000183613edf565b905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b6000613f118360000183613c49565b905092915050565b606082471015613f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f559061512b565b60405180910390fd5b613f6785613e8d565b613fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f9d9061530b565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613fcf9190614f1f565b60006040518083038185875af1925050503d806000811461400c576040519150601f19603f3d011682016040523d82523d6000602084013e614011565b606091505b509150915061402182828661402d565b92505050949350505050565b6060831561403d5782905061408d565b6000835111156140505782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140849190615069565b60405180910390fd5b9392505050565b8280546140a090615781565b90600052602060002090601f0160209004810192826140c25760008555614109565b82601f106140db57803560ff1916838001178555614109565b82800160010185558215614109579182015b828111156141085782358255916020019190600101906140ed565b5b5090506141169190614247565b5090565b82805461412690615781565b90600052602060002090601f0160209004810192826141485760008555614196565b82601f106141595780548555614196565b8280016001018555821561419657600052602060002091601f016020900482015b8281111561419557825482559160010191906001019061417a565b5b5090506141a39190614247565b5090565b8280546141b390615781565b90600052602060002090601f0160209004810192826141d5576000855561421c565b82601f106141ee57805160ff191683800117855561421c565b8280016001018555821561421c579182015b8281111561421b578251825591602001919060010190614200565b5b5090506142299190614247565b5090565b604051806040016040528060008152602001606081525090565b5b80821115614260576000816000905550600101614248565b5090565b6000614277614272846154ce565b6154a9565b90508281526020810184848401111561428f57600080fd5b61429a84828561573f565b509392505050565b60006142b56142b0846154ff565b6154a9565b9050828152602081018484840111156142cd57600080fd5b6142d884828561573f565b509392505050565b6000813590506142ef81615eb4565b92915050565b60008135905061430481615ecb565b92915050565b60008135905061431981615ee2565b92915050565b60008151905061432e81615ee2565b92915050565b600082601f83011261434557600080fd5b8135614355848260208601614264565b91505092915050565b60008083601f84011261437057600080fd5b8235905067ffffffffffffffff81111561438957600080fd5b6020830191508360018202830111156143a157600080fd5b9250929050565b600082601f8301126143b957600080fd5b81356143c98482602086016142a2565b91505092915050565b600061010082840312156143e557600080fd5b81905092915050565b6000813590506143fd81615ef9565b92915050565b60006020828403121561441557600080fd5b6000614423848285016142e0565b91505092915050565b6000806040838503121561443f57600080fd5b600061444d858286016142e0565b925050602061445e858286016142e0565b9150509250929050565b60008060006060848603121561447d57600080fd5b600061448b868287016142e0565b935050602061449c868287016142e0565b92505060406144ad868287016143ee565b9150509250925092565b600080600080608085870312156144cd57600080fd5b60006144db878288016142e0565b94505060206144ec878288016142e0565b93505060406144fd878288016143ee565b925050606085013567ffffffffffffffff81111561451a57600080fd5b61452687828801614334565b91505092959194509250565b6000806040838503121561454557600080fd5b6000614553858286016142e0565b9250506020614564858286016142f5565b9150509250929050565b6000806040838503121561458157600080fd5b600061458f858286016142e0565b92505060206145a0858286016143ee565b9150509250929050565b6000602082840312156145bc57600080fd5b60006145ca8482850161430a565b91505092915050565b6000602082840312156145e557600080fd5b60006145f38482850161431f565b91505092915050565b6000806020838503121561460f57600080fd5b600083013567ffffffffffffffff81111561462957600080fd5b6146358582860161435e565b92509250509250929050565b60008060006040848603121561465657600080fd5b600084013567ffffffffffffffff81111561467057600080fd5b61467c8682870161435e565b9350935050602084013567ffffffffffffffff81111561469b57600080fd5b6146a7868287016143d2565b9150509250925092565b6000602082840312156146c357600080fd5b600082013567ffffffffffffffff8111156146dd57600080fd5b6146e9848285016143a8565b91505092915050565b60006020828403121561470457600080fd5b6000614712848285016143ee565b91505092915050565b6000806000806060858703121561473157600080fd5b600061473f878288016143ee565b945050602085013567ffffffffffffffff81111561475c57600080fd5b6147688782880161435e565b9350935050604085013567ffffffffffffffff81111561478757600080fd5b614793878288016143d2565b91505092959194509250565b600080604083850312156147b257600080fd5b60006147c0858286016143ee565b925050602083013567ffffffffffffffff8111156147dd57600080fd5b6147e9858286016143a8565b9150509250929050565b6000806040838503121561480657600080fd5b6000614814858286016143ee565b9250506020614825858286016143ee565b9150509250929050565b6000806000806080858703121561484557600080fd5b6000614853878288016143ee565b9450506020614864878288016143ee565b935050604085013567ffffffffffffffff81111561488157600080fd5b61488d878288016143a8565b925050606085013567ffffffffffffffff8111156148aa57600080fd5b6148b6878288016143a8565b91505092959194509250565b6148cb816156be565b82525050565b6148e26148dd826156be565b61582d565b82525050565b6148f1816156d0565b82525050565b600061490282615530565b61490c8185615546565b935061491c81856020860161574e565b61492581615948565b840191505092915050565b600061493b82615530565b6149458185615557565b935061495581856020860161574e565b80840191505092915050565b600061496d8385615562565b935061497a83858461573f565b61498383615948565b840190509392505050565b600061499a8385615573565b93506149a783858461573f565b6149b083615948565b840190509392505050565b60006149c78385615584565b93506149d483858461573f565b82840190509392505050565b60006149eb8261553b565b6149f58185615562565b9350614a0581856020860161574e565b614a0e81615948565b840191505092915050565b6000614a248261553b565b614a2e8185615573565b9350614a3e81856020860161574e565b614a4781615948565b840191505092915050565b6000614a5d8261553b565b614a678185615584565b9350614a7781856020860161574e565b80840191505092915050565b6000614a90603283615573565b9150614a9b82615966565b604082019050919050565b6000614ab3602683615573565b9150614abe826159b5565b604082019050919050565b6000614ad6601c83615573565b9150614ae182615a04565b602082019050919050565b6000614af9602483615573565b9150614b0482615a2d565b604082019050919050565b6000614b1c601983615573565b9150614b2782615a7c565b602082019050919050565b6000614b3f602683615573565b9150614b4a82615aa5565b604082019050919050565b6000614b62602c83615573565b9150614b6d82615af4565b604082019050919050565b6000614b85601783615573565b9150614b9082615b43565b602082019050919050565b6000614ba8603883615573565b9150614bb382615b6c565b604082019050919050565b6000614bcb602a83615573565b9150614bd682615bbb565b604082019050919050565b6000614bee602083615573565b9150614bf982615c0a565b602082019050919050565b6000614c11602c83615573565b9150614c1c82615c33565b604082019050919050565b6000614c34602083615573565b9150614c3f82615c82565b602082019050919050565b6000614c57602983615573565b9150614c6282615cab565b604082019050919050565b6000614c7a601283615573565b9150614c8582615cfa565b602082019050919050565b6000614c9d602f83615573565b9150614ca882615d23565b604082019050919050565b6000614cc0601483615573565b9150614ccb82615d72565b602082019050919050565b6000614ce3602183615573565b9150614cee82615d9b565b604082019050919050565b6000614d06602083615573565b9150614d1182615dea565b602082019050919050565b6000614d29603183615573565b9150614d3482615e13565b604082019050919050565b6000614d4c601d83615573565b9150614d5782615e62565b602082019050919050565b6000614d6f601683615573565b9150614d7a82615e8b565b602082019050919050565b60006101008301614d99600084018461558f565b8583036000870152614dac838284614961565b92505050614dbd602084018461558f565b8583036020870152614dd0838284614961565b92505050614de1604084018461558f565b8583036040870152614df4838284614961565b92505050614e05606084018461558f565b8583036060870152614e18838284614961565b92505050614e2960808401846155e6565b614e366080860182614eea565b50614e4460a084018461558f565b85830360a0870152614e57838284614961565b92505050614e6860c084018461558f565b85830360c0870152614e7b838284614961565b92505050614e8c60e084018461558f565b85830360e0870152614e9f838284614961565b925050508091505092915050565b6000604083016000830151614ec56000860182614eea565b5060208301518482036020860152614edd82826149e0565b9150508091505092915050565b614ef381615728565b82525050565b614f0281615728565b82525050565b614f19614f1482615728565b615851565b82525050565b6000614f2b8284614930565b915081905092915050565b6000614f438285876149bb565b9150614f4f8284614f08565b602082019150819050949350505050565b6000614f6c8284614a52565b915081905092915050565b6000614f838285614a52565b9150614f8f8284614a52565b91508190509392505050565b6000614fa78288614f08565b602082019150614fb782876148d1565b601482019150614fc88285876149bb565b9150614fd48284614f08565b6020820191508190509695505050505050565b6000602082019050614ffc60008301846148c2565b92915050565b600060808201905061501760008301876148c2565b61502460208301866148c2565b6150316040830185614ef9565b818103606083015261504381846148f7565b905095945050505050565b600060208201905061506360008301846148e8565b92915050565b600060208201905081810360008301526150838184614a19565b905092915050565b600060208201905081810360008301526150a481614a83565b9050919050565b600060208201905081810360008301526150c481614aa6565b9050919050565b600060208201905081810360008301526150e481614ac9565b9050919050565b6000602082019050818103600083015261510481614aec565b9050919050565b6000602082019050818103600083015261512481614b0f565b9050919050565b6000602082019050818103600083015261514481614b32565b9050919050565b6000602082019050818103600083015261516481614b55565b9050919050565b6000602082019050818103600083015261518481614b78565b9050919050565b600060208201905081810360008301526151a481614b9b565b9050919050565b600060208201905081810360008301526151c481614bbe565b9050919050565b600060208201905081810360008301526151e481614be1565b9050919050565b6000602082019050818103600083015261520481614c04565b9050919050565b6000602082019050818103600083015261522481614c27565b9050919050565b6000602082019050818103600083015261524481614c4a565b9050919050565b6000602082019050818103600083015261526481614c6d565b9050919050565b6000602082019050818103600083015261528481614c90565b9050919050565b600060208201905081810360008301526152a481614cb3565b9050919050565b600060208201905081810360008301526152c481614cd6565b9050919050565b600060208201905081810360008301526152e481614cf9565b9050919050565b6000602082019050818103600083015261530481614d1c565b9050919050565b6000602082019050818103600083015261532481614d3f565b9050919050565b6000602082019050818103600083015261534481614d62565b9050919050565b600060208201905081810360008301526153658184614ead565b905092915050565b60006020820190506153826000830184614ef9565b92915050565b600060408201905061539d6000830185614ef9565b81810360208301526153af8184614a19565b90509392505050565b60006080820190506153cd6000830188614ef9565b6153da6020830187614ef9565b81810360408301526153ed81858761498e565b905081810360608301526154018184614d85565b90509695505050505050565b60006080820190506154226000830187614ef9565b61542f6020830186614ef9565b61543c6040830185614ef9565b6154496060830184614ef9565b95945050505050565b6000808335600160200384360303811261546b57600080fd5b80840192508235915067ffffffffffffffff82111561548957600080fd5b6020830192506001820236038313156154a157600080fd5b509250929050565b60006154b36154c4565b90506154bf82826157b3565b919050565b6000604051905090565b600067ffffffffffffffff8211156154e9576154e8615919565b5b6154f282615948565b9050602081019050919050565b600067ffffffffffffffff82111561551a57615519615919565b5b61552382615948565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600080833560016020038436030381126155a857600080fd5b83810192508235915060208301925067ffffffffffffffff8211156155cc57600080fd5b6001820236038413156155de57600080fd5b509250929050565b60006155f560208401846143ee565b905092915050565b600061560882615728565b915061561383615728565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156156485761564761588c565b5b828201905092915050565b600061565e82615732565b915061566983615732565b92508260ff0382111561567f5761567e61588c565b5b828201905092915050565b600061569582615728565b91506156a083615728565b9250828210156156b3576156b261588c565b5b828203905092915050565b60006156c982615708565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561576c578082015181840152602081019050615751565b8381111561577b576000848401525b50505050565b6000600282049050600182168061579957607f821691505b602082108114156157ad576157ac6158ea565b5b50919050565b6157bc82615948565b810181811067ffffffffffffffff821117156157db576157da615919565b5b80604052505050565b60006157ef82615728565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156158225761582161588c565b5b600182019050919050565b60006158388261583f565b9050919050565b600061584a82615959565b9050919050565b6000819050919050565b600061586682615728565b915061587183615728565b925082615881576158806158bb565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e616d652074616b656e206f72206e6f742076616c6964000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f506f736974696f6e206e6f742076616c69640000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4e6f6e2076616c69642063686172616374657273000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f557064617465206265696e672070726f63657373656400000000000000000000600082015250565b615ebd816156be565b8114615ec857600080fd5b50565b615ed4816156d0565b8114615edf57600080fd5b50565b615eeb816156dc565b8114615ef657600080fd5b50565b615f0281615728565b8114615f0d57600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220c2300c8b96a1f9e42a18469dcb276cdfcbae67ac4c02bacbe8b63d675c26333964736f6c63430008040033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000d427573696e65737320436172640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054243415244000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f646f72736961636c75622e6d7970696e6174612e636c6f75642f697066732f516d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c6246703372796275765a376a396534784236574c6564753867764c636a6256715572475545756751577a39750000000000000000000000000000000000000000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000d427573696e65737320436172640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054243415244000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f646f72736961636c75622e6d7970696e6174612e636c6f75642f697066732f516d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c6246703372796275765a376a396534784236574c6564753867764c636a6256715572475545756751577a39750000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): Business Card
Arg [1] : symbol_ (string): BCARD
Arg [2] : baseURI_ (string): https://dorsiaclub.mypinata.cloud/ipfs/Qm
Arg [3] : defaultURI_ (string): bFp3rybuvZ7j9e4xB6WLedu8gvLcjbVqUrGUEugQWz9u
-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [5] : 427573696e657373204361726400000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 4243415244000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000029
Arg [9] : 68747470733a2f2f646f72736961636c75622e6d7970696e6174612e636c6f75
Arg [10] : 642f697066732f516d0000000000000000000000000000000000000000000000
Arg [11] : 000000000000000000000000000000000000000000000000000000000000002c
Arg [12] : 6246703372796275765a376a396534784236574c6564753867764c636a625671
Arg [13] : 5572475545756751577a39750000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
742:27808:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;596:188:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7772:125:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18815:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20869:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20413:390;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11790:1539;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17487:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13588:1326;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19820:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21915:309;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19508:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16956:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18082:142;;;;;;;;;;;;;:::i;:::-;;22721:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20108:243;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15567:78;;;;;;;;;;;;;:::i;:::-;;16561:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15039:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1872:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18571:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3235:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3145:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3064:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19327:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18288:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1824:101:13;;;;;;;;;;;;;:::i;:::-;;6028:115:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5813:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2847:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1194:85:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18984:104:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21162:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22338:312;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8941:564;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15361:151;;;;;;;;;;;;;:::i;:::-;;22943:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8082:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6434:241;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15937:542;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6224:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1825:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17146:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15713:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21528:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2074:198:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;596:188:5;681:4;704:36;728:11;704:23;:36::i;:::-;:73;;;;744:20;:33;765:11;744:33;;;;;;;;;;;;;;;;;;;;;;;;;;;704:73;697:80;;596:188;;;:::o;7772:125:1:-;7859:30;7869:8;7879:9;7859;:30::i;:::-;7772:125;;:::o;18815:100::-;18869:13;18902:5;18895:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18815:100;:::o;20869:221::-;20945:7;20973:16;20981:7;20973;:16::i;:::-;20965:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21058:15;:24;21074:7;21058:24;;;;;;;;;;;;;;;;;;;;;21051:31;;20869:221;;;:::o;20413:390::-;20494:13;20510:16;20518:7;20510;:16::i;:::-;20494:32;;20551:5;20545:11;;:2;:11;;;;20537:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;20631:5;20615:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;20640:37;20657:5;20664:12;:10;:12::i;:::-;20640:16;:37::i;:::-;20615:62;20607:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;20774:21;20783:2;20787:7;20774:8;:21::i;:::-;20413:390;;;:::o;11790:1539::-;11944:4;11929:19;;:11;;;;;;;;;;;:19;;;11921:28;;;;;;12020:41;12039:12;:10;:12::i;:::-;12053:7;12020:18;:41::i;:::-;12012:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;12158:5;12131:32;;:23;12146:7;;12131:14;:23::i;:::-;:32;;;:195;;;;;12224:1;12205:7;;12199:21;;:26;:112;;;;12307:4;12264:47;;:39;12295:7;;12264:30;:39::i;:::-;:47;;;12199:112;12131:195;12109:283;;;;;;;;;;;;:::i;:::-;;;;;;;;;12469:1;12431:17;:26;;;;;;;;:::i;:::-;12425:40;;:45;:145;;;;12566:4;12500:70;;:62;12535:17;:26;;;;;;;;:::i;:::-;12500:34;:62::i;:::-;:70;;;12425:145;12403:228;;;;;;;;;;;;:::i;:::-;;;;;;;;;12677:11;;12664:9;:24;;:60;;;;12708:16;;;;;;;;;;;12692:32;;:12;:10;:12::i;:::-;:32;;;12664:60;12642:93;;;;;;12889:1;12871:7;;12865:21;;:25;12861:323;;;12947:51;12965:11;:20;12977:7;12965:20;;;;;;;;;;;:25;;12947:51;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12992:5;12947:17;:51::i;:::-;13050:32;13068:7;;13050:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13077:4;13050:17;:32::i;:::-;13165:7;;13137:11;:20;13149:7;13137:20;;;;;;;;;;;:25;;:35;;;;;;;:::i;:::-;;12861:323;13241:80;13257:7;13266:11;:20;13278:7;13266:20;;;;;;;;;;;:26;;;13294:7;;13303:17;13241:15;:80::i;:::-;11790:1539;;;;:::o;17487:157::-;17560:4;17584:13;17598:37;17624:10;;17598:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;:37::i;:::-;17584:52;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17577:59;;17487:157;;;;:::o;13588:1326::-;13692:4;13677:19;;:11;;;;;;;;;;;:19;;;13669:28;;;;;;13782:42;13801:12;:10;:12::i;:::-;13815:8;13782:18;:42::i;:::-;:101;;;;;13841:42;13860:12;:10;:12::i;:::-;13874:8;13841:18;:42::i;:::-;13782:101;13760:184;;;;;;;;;;;;:::i;:::-;;;;;;;;;13976:11;;13963:9;:24;;13955:33;;;;;;14191:5;14169:27;;:8;:18;14178:8;14169:18;;;;;;;;;;;;;;;;;;;;;:27;;;:58;;;;;14222:5;14200:27;;:8;:18;14209:8;14200:18;;;;;;;;;;;;;;;;;;;;;:27;;;14169:58;14161:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;14309:19;14331:11;:21;14343:8;14331:21;;;;;;;;;;;:26;;14309:48;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14397:11;:21;14409:8;14397:21;;;;;;;;;;;:26;;14368:11;:21;14380:8;14368:21;;;;;;;;;;;:26;;:55;;;;;;:::i;:::-;;;;;;:::i;:::-;;14463:5;14434:11;:21;14446:8;14434:21;;;;;;;;;;;:26;;:34;;;;;;;;;;;;:::i;:::-;;14535:4;14514:8;:18;14523:8;14514:18;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;14571:4;14550:8;:18;14559:8;14550:18;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;14675:89;14687:8;14697;14707:11;:21;14719:8;14707:21;;;;;;;;;;;:27;;;14736:11;:21;14748:8;14736:21;;;;;;;;;;;:27;;;14675:89;;;;;;;;;:::i;:::-;;;;;;;;14871:12;;;;;;;;;;;14863:30;;:43;14894:11;;14863:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13588:1326;;;:::o;19820:211::-;19881:7;20002:21;:12;:19;:21::i;:::-;19995:28;;19820:211;:::o;21915:309::-;22076:41;22095:12;:10;:12::i;:::-;22109:7;22076:18;:41::i;:::-;22068:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;22182:34;22192:4;22198:2;22202:7;22211:4;22182:9;:34::i;:::-;21915:309;;;:::o;19508:236::-;19605:7;19641:16;19651:5;19641:9;:16::i;:::-;19633:5;:24;19625:33;;;;;;19706:30;19730:5;19706:13;:20;19720:5;19706:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;19699:37;;19508:236;;;;:::o;16956:103::-;17007:13;17040:11;17033:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16956:103;:::o;18082:142::-;1087:13:13;:11;:13::i;:::-;18132:12:1::1;18147:21;18132:36;;18187:10;18179:28;;:37;18208:7;18179:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1110:1:13;18082:142:1:o:0;22721:151::-;22825:39;22842:4;22848:2;22852:7;22825:39;;;;;;;;;;;;:16;:39::i;:::-;22721:151;;;:::o;20108:243::-;20183:7;20219:13;:11;:13::i;:::-;20211:5;:21;20203:30;;;;;;20275:15;20296:22;20312:5;20296:12;:15;;:22;;;;:::i;:::-;20274:44;;;20336:7;20329:14;;;20108:243;;;:::o;15567:78::-;1087:13:13;:11;:13::i;:::-;15632:5:1::1;15618:11;;:19;;;;;;;;;;;;;;;;;;15567:78::o:0;16561:153::-;1087:13:13;:11;:13::i;:::-;16672:1:1::1;16651:10;16645:24;:28;16637:37;;;::::0;::::1;;16696:10;16685:8;:21;;;;;;;;;;;;:::i;:::-;;16561:153:::0;:::o;15039:225::-;1087:13:13;:11;:13::i;:::-;15177:79:1::1;15193:7;15202:11;:20;15214:7;15202:20;;;;;;;;;;;:26;;;15230:8;;15240:15;15177;:79::i;:::-;15039:225:::0;;;;:::o;1872:23::-;;;;;;;;;;;;;:::o;18571:177::-;18643:7;18670:70;18687:7;18670:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;18663:77;;18571:177;;;:::o;3235:40::-;;;;:::o;3145:39::-;;;;:::o;3064:36::-;;;;:::o;19327:97::-;19375:13;19408:8;19401:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19327:97;:::o;18288:221::-;18360:7;18405:1;18388:19;;:5;:19;;;;18380:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;18472:29;:13;:20;18486:5;18472:20;;;;;;;;;;;;;;;:27;:29::i;:::-;18465:36;;18288:221;;;:::o;1824:101:13:-;1087:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;6028:115:1:-;1087:13:13;:11;:13::i;:::-;6123:12:1::1;6104:16;;:31;;;;;;;;;;;;;;;;;;6028:115:::0;:::o;5813:108::-;1087:13:13;:11;:13::i;:::-;5900::1::1;5885:12;;:28;;;;;;;;;;;;;;;;;;5813:108:::0;:::o;2847:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;1194:85:13:-;1240:7;1266:6;;;;;;;;;;;1259:13;;1194:85;:::o;18984:104:1:-;19040:13;19073:7;19066:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18984:104;:::o;21162:295::-;21277:12;:10;:12::i;:::-;21265:24;;:8;:24;;;;21257:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;21377:8;21332:18;:32;21351:12;:10;:12::i;:::-;21332:32;;;;;;;;;;;;;;;:42;21365:8;21332:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;21430:8;21401:48;;21416:12;:10;:12::i;:::-;21401:48;;;21440:8;21401:48;;;;;;:::i;:::-;;;;;;;;21162:295;;:::o;22338:312::-;22501:41;22520:12;:10;:12::i;:::-;22534:7;22501:18;:41::i;:::-;22493:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;22607:35;22617:4;22623:2;22627:7;22636:5;22607:9;:35::i;:::-;22338:312;;;:::o;8941:564::-;9075:4;9060:19;;:11;;;;;;;;;;;:19;;;9052:28;;;;;;1861:4;9163:13;:11;:13::i;:::-;:25;9155:34;;;;;;9273:9;;9260;:22;;9252:31;;;;;;9427:70;9437:12;:10;:12::i;:::-;9467:1;9451:13;:11;:13::i;:::-;:17;;;;:::i;:::-;9470:9;;9481:15;9427:9;:70::i;:::-;8941:564;;;:::o;15361:151::-;1087:13:13;:11;:13::i;:::-;15444:1:1::1;15420:26;;:12;;;;;;;;;;;:26;;;;15412:35;;;::::0;::::1;;15500:4;15486:11;;:18;;;;;;;;;;;;;;;;;;15361:151::o:0;22943:285::-;23075:41;23094:12;:10;:12::i;:::-;23108:7;23075:18;:41::i;:::-;23067:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23181:39;23195:4;23201:2;23205:7;23214:5;23181:13;:39::i;:::-;22943:285;;;;:::o;8082:215::-;8214:32;8224:9;8235:10;8214:9;:32::i;:::-;8257;8267:9;8278:10;8257:9;:32::i;:::-;8082:215;;;;:::o;6434:241::-;1087:13:13;:11;:13::i;:::-;6541:11:1::1;;6523:14;:29;;6515:38;;;::::0;::::1;;6653:14;6639:11;:28;;;;6434:241:::0;:::o;15937:542::-;16004:13;16038:16;16046:7;16038;:16::i;:::-;16030:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;16119:19;16141:10;:19;16152:7;16141:19;;;;;;;;;;;16119:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16300:1;16283:5;16277:19;:24;16273:199;;;16350:9;:7;:9::i;:::-;16361:12;:10;:12::i;:::-;16332:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;16318:58;;;;;16273:199;16441:9;:7;:9::i;:::-;16452:5;16423:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;16409:51;;;15937:542;;;;:::o;6224:118::-;1087:13:13;:11;:13::i;:::-;6323:10:1::1;6300:5;;:34;;;;;;;;;;;;;;;;;;6224:118:::0;:::o;1825:40::-;1861:4;1825:40;:::o;17146:209::-;1087:13:13;:11;:13::i;:::-;17268:1:1::1;17244:13;;17238:27;;:31;17230:40;;;::::0;::::1;;17334:13;;17320:11;:27;;;;;;;:::i;:::-;;17146:209:::0;;:::o;15713:117::-;15771:11;;:::i;:::-;15802;:20;15814:7;15802:20;;;;;;;;;;;15795:27;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15713:117;;;:::o;21528:164::-;21625:4;21649:18;:25;21668:5;21649:25;;;;;;;;;;;;;;;:35;21675:8;21649:35;;;;;;;;;;;;;;;;;;;;;;;;;21642:42;;21528:164;;;;:::o;2074:198:13:-;1087:13;:11;:13::i;:::-;2182:1:::1;2162:22;;:8;:22;;;;2154:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;829:155:4:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;8482:389:1:-;8588:12;;;;;;;;;;;8572:28;;:12;:10;:12::i;:::-;:28;;;8564:37;;;;;;8676:8;:18;8685:8;8676:18;;;;;;;;;;;;;;;;;;;;;8668:27;;;;;;8765:9;8742:10;:20;8753:8;8742:20;;;;;;;;;;;:32;;;;;;;;;;;;:::i;:::-;;8792:8;:18;8801:8;8792:18;;;;;;;;;;;;8785:25;;;;;;;;;;;8826:36;8842:8;8852:9;8826:36;;;;;;;:::i;:::-;;;;;;;;8482:389;;:::o;24701:127::-;24766:4;24790:30;24812:7;24790:12;:21;;:30;;;;:::i;:::-;24783:37;;24701:127;;;:::o;640:96:3:-;693:7;719:10;712:17;;640:96;:::o;27206:176:1:-;27299:2;27272:15;:24;27288:7;27272:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;27348:7;27344:2;27317:39;;27326:16;27334:7;27326;:16::i;:::-;27317:39;;;;;;;;;;;;27206:176;;:::o;24995:341::-;25088:4;25113:16;25121:7;25113;:16::i;:::-;25105:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25189:13;25205:16;25213:7;25205;:16::i;:::-;25189:32;;25251:5;25240:16;;:7;:16;;;:51;;;;25284:7;25260:31;;:20;25272:7;25260:11;:20::i;:::-;:31;;;25240:51;:87;;;;25295:32;25312:5;25319:7;25295:16;:32::i;:::-;25240:87;25232:96;;;24995:341;;;;:::o;446:429:2:-;512:4;529:14;552:3;;529:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;635:1;623;:8;:13;:30;;;;651:2;640:1;:8;:13;623:30;:46;;;;665:4;657:12;;:1;659;657:4;;;;;;;;;;;;;;;;;;;;;;;;:12;;;;623:46;:73;;;;692:4;673:23;;:1;686;675;:8;:12;;;;:::i;:::-;673:15;;;;;;;;;;;;;;;;;;;;;;;;:23;;;;623:73;606:114;;;715:5;708:12;;;;;606:114;768:19;783:3;;768:14;:19::i;:::-;760:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;863:4;856:11;;;446:429;;;;;:::o;1044:436::-;1114:4;1131:14;1154:3;;1131:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1237:1;1225;:8;:13;:30;;;;1253:2;1242:1;:8;:13;1225:30;:46;;;;1267:4;1259:12;;:1;1261;1259:4;;;;;;;;;;;;;;;;;;;;;;;;:12;;;;1225:46;:73;;;;1294:4;1275:23;;:1;1288;1277;:8;:12;;;;:::i;:::-;1275:15;;;;;;;;;;;;;;;;;;;;;;;;:23;;;;1225:73;1208:114;;;1317:5;1310:12;;;;;1208:114;1370:19;1385:3;;1370:14;:19::i;:::-;1362:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;1468:4;1461:11;;;1044:436;;;;;:::o;17841:147:1:-;17971:9;17923:13;17937:30;17963:3;17937:25;:30::i;:::-;17923:45;;;;;;:::i;:::-;;;;;;;;;;;;;;:57;;;;;;;;;;;;;;;;;;17841:147;;:::o;6796:791::-;6951:58;6993:15;6951:41;:58::i;:::-;6943:67;;;;;;7064:17;7072:8;7064:7;:17::i;:::-;7056:26;;;;;;7218:5;7196:27;;:8;:18;7205:8;7196:18;;;;;;;;;;;;;;;;;;;;;:27;;;7188:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;7282:4;7261:8;:18;7270:8;7261:18;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;7393:12;;;;;;;;;;;7385:30;;:43;7416:11;;7385:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7520:59;7534:8;7544:6;7552:9;;7563:15;7520:59;;;;;;;;;;:::i;:::-;;;;;;;;6796:791;;;;;:::o;3076:510:2:-;3135:13;3160:17;3186:3;3160:30;;3201:19;3233:4;:11;3223:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3201:44;;3263:6;3258:289;3279:4;:11;3275:1;:15;3258:289;;;3371:2;3359:4;3364:1;3359:7;;;;;;;;;;;;;;;;;;;;;;;;3353:14;;:20;;;;3352:48;;;;;3397:2;3385:4;3390:1;3385:7;;;;;;;;;;;;;;;;;;;;;;;;3379:14;;:20;;;;3352:48;3348:188;;;3457:2;3446:4;3451:1;3446:7;;;;;;;;;;;;;;;;;;;;;;;;3440:14;;:19;;;;:::i;:::-;3433:27;;3421:6;3428:1;3421:9;;;;;;;;;;;;;;;;;;;:39;;;;;;;;;;;3348:188;;;3513:4;3518:1;3513:7;;;;;;;;;;;;;;;;;;;;;;;;3501:6;3508:1;3501:9;;;;;;;;;;;;;;;;;;;:19;;;;;;;;;;;3348:188;3292:3;;;;:::i;:::-;;;3258:289;;;;3571:6;3557:21;;;;3076:510;;;:::o;9436:120:6:-;9505:7;9531:18;9538:3;:10;;9531:6;:18::i;:::-;9524:25;;9436:120;;;:::o;26365:723:1:-;26494:4;26474:24;;:16;26482:7;26474;:16::i;:::-;:24;;;26466:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;26595:1;26581:16;;:2;:16;;;;26573:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;26729:1;26703:28;;26711:5;;;;;;;;;;;26703:28;;;;:36;;;;;26735:4;26703:36;26699:112;;;26756:5;;;;;;;;;;;:34;;;26791:7;26756:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26699:112;26875:29;26892:1;26896:7;26875:8;:29::i;:::-;26917:35;26944:7;26917:13;:19;26931:4;26917:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;26963:30;26985:7;26963:13;:17;26977:2;26963:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;27006:29;27023:7;27032:2;27006:12;:16;;:29;;;;;:::i;:::-;;27072:7;27068:2;27053:27;;27062:4;27053:27;;;;;;;;;;;;26365:723;;;;:::o;11708:135:7:-;11779:7;11813:22;11817:3;:10;;11829:5;11813:3;:22::i;:::-;11805:31;;11798:38;;11708:135;;;;:::o;1352:130:13:-;1426:12;:10;:12::i;:::-;1415:23;;:7;:5;:7::i;:::-;:23;;;1407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1352:130::o;9893:232:6:-;9973:7;9982;10002:11;10015:13;10032:21;10035:3;:10;;10047:5;10032:2;:21::i;:::-;10001:52;;;;10079:3;10071:12;;10109:5;10101:14;;10063:55;;;;;;9893:232;;;;;:::o;11143:240::-;11280:7;11330:43;11334:3;:10;;11354:3;11346:12;;11360;11330:3;:43::i;:::-;11322:52;;11299:77;;11143:240;;;;;:::o;11254:112:7:-;11314:7;11340:19;11348:3;:10;;11340:7;:19::i;:::-;11333:26;;11254:112;;;:::o;2426:187:13:-;2499:16;2518:6;;;;;;;;;;;2499:25;;2543:8;2534:6;;:17;;;;;;;;;;;;;;;;;;2597:8;2566:40;;2587:8;2566:40;;;;;;;;;;;;2426:187;;:::o;9848:1098:1:-;10016:41;10047:9;;10016:30;:41::i;:::-;:92;;;;;10103:5;10074:34;;:25;10089:9;;10074:14;:25::i;:::-;:34;;;10016:92;9994:166;;;;;;;;;;;;:::i;:::-;;;;;;;;;10193:60;10228:15;:24;;;;;;;;:::i;:::-;10193:34;:60::i;:::-;10171:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;10519:13;10622:6;10567:15;10584:10;10596:9;;10607;;10550:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10540:78;;;;;;10535:84;;:93;;;;:::i;:::-;10519:109;;10639:9;;:11;;;;;;;;;:::i;:::-;;;;;;10705:34;10723:9;;10705:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10734:4;10705:17;:34::i;:::-;10774:22;;;;;;;;10779:5;10774:22;;;;10786:9;;10774:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10750:11;:21;10762:8;10750:21;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;10807:60;10817:3;10822:8;10849:9;;10860:5;10832:34;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10807:9;:60::i;:::-;10878;10894:8;10904:5;10911:9;;10922:15;10878;:60::i;:::-;9848:1098;;;;;;:::o;24110:278::-;24224:34;24234:4;24240:2;24244:7;24253:4;24224:9;:34::i;:::-;24277:48;24300:4;24306:2;24310:7;24319:5;24277:22;:48::i;:::-;24269:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;24110:278;;;;:::o;9205:148:6:-;9289:4;9312:34;9321:3;:10;;9341:3;9333:12;;9312:8;:34::i;:::-;9305:41;;9205:148;;;;:::o;1608:664:2:-;1676:4;1693:14;1716:3;;1693:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1731:15;1749:1;1751;1749:4;;;;;;;;;;;;;;;;;;;;;;;;1731:22;;1770:6;1766:477;1780:1;:8;1778:1;:10;1766:477;;;1809:11;1823:1;1825;1823:4;;;;;;;;;;;;;;;;;;;;;;;;1809:18;;1856:4;1848:12;;:4;:12;;;;:32;;;;;1876:4;1864:16;;:8;:16;;;;1848:32;1844:50;;;1889:5;1882:12;;;;;;;;1844:50;1978:4;1970:12;;:4;:12;;;;;:28;;;;;1994:4;1986:12;;:4;:12;;;;;1970:28;1968:31;:118;;;;;2065:4;2057:12;;:4;:12;;;;;:28;;;;;2081:4;2073:12;;:4;:12;;;;;2057:28;2055:31;1968:118;:178;;;;;2125:4;2117:12;;:4;:12;;;;;:28;;;;;2141:4;2133:12;;:4;:12;;;;;2117:28;2115:31;1968:178;1947:252;;;2194:5;2187:12;;;;;;;;1947:252;2227:4;2216:15;;1766:477;1790:3;;;;:::i;:::-;;;1766:477;;;;2260:4;2253:11;;;;1608:664;;;;;:::o;2280:724::-;2389:4;2469:2;2429:14;:29;;;;;;;;:::i;:::-;2423:43;;:48;:114;;;;;2535:2;2494:14;:30;;;;;;;;:::i;:::-;2488:44;;:49;2423:114;:178;;;;;2599:2;2560:14;:28;;;;;;;;:::i;:::-;2554:42;;:47;2423:178;:318;;;;;2653:6;2620:14;:29;;;:39;;:81;;;;;2695:6;2663:14;:29;;;:38;2620:81;2619:121;;;;2739:1;2706:14;:29;;;:34;2619:121;2423:318;:381;;;;;2802:2;2764:14;:27;;;;;;;;:::i;:::-;2758:41;;:46;2423:381;:446;;;;;2867:2;2827:14;:29;;;;;;;;:::i;:::-;2821:43;;:48;2423:446;:504;;;;;2925:2;2892:14;:22;;;;;;;;:::i;:::-;2886:36;;:41;2423:504;2406:557;;;2959:4;2952:11;;;;2406:557;2991:5;2984:12;;2280:724;;;;:::o;3284:123:6:-;3356:7;3382:18;:3;:9;;:16;:18::i;:::-;3375:25;;3284:123;;;:::o;10813:135:7:-;10883:4;10906:35;10914:3;:10;;10934:5;10926:14;;10906:7;:35::i;:::-;10899:42;;10813:135;;;;:::o;10516:129::-;10583:4;10606:32;10611:3;:10;;10631:5;10623:14;;10606:4;:32::i;:::-;10599:39;;10516:129;;;;:::o;8616:212:6:-;8735:4;8758:63;8762:3;:10;;8782:3;8774:12;;8812:5;8796:23;;8788:32;;8758:3;:63::i;:::-;8751:70;;8616:212;;;;;:::o;4811:118:7:-;4878:7;4904:3;:11;;4916:5;4904:18;;;;;;;;;;;;;;;;;;;;;;;;4897:25;;4811:118;;;;:::o;3760:191:6:-;3843:7;3852;3871:11;3885:19;3898:5;3885:3;:9;;:12;;:19;;;;:::i;:::-;3871:33;;3922:3;3927;:11;;:16;3939:3;3927:16;;;;;;;;;;;;3914:30;;;;;3760:191;;;;;:::o;5072:285::-;5212:7;5231:13;5247:3;:11;;:16;5259:3;5247:16;;;;;;;;;;;;5231:32;;5290:1;5281:10;;:5;:10;;:32;;;;5295:18;5304:3;5309;5295:8;:18::i;:::-;5281:32;5315:12;5273:55;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;5345:5;5338:12;;;5072:285;;;;;:::o;4362:107:7:-;4418:7;4444:3;:11;;:18;;;;4437:25;;4362:107;;;:::o;11173:250:1:-;11269:18;11275:2;11279:7;11269:5;:18::i;:::-;11306:54;11337:1;11341:2;11345:7;11354:5;11306:22;:54::i;:::-;11298:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;11173:250;;;:::o;27947:598::-;28068:4;28095:15;:2;:13;;;:15::i;:::-;28090:60;;28134:4;28127:11;;;;28090:60;28160:23;28186:252;28239:45;;;28299:12;:10;:12::i;:::-;28326:4;28345:7;28367:5;28202:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28186:252;;;;;;;;;;;;;;;;;:2;:15;;;;:252;;;;;:::i;:::-;28160:278;;28449:13;28476:10;28465:32;;;;;;;;;;;;:::i;:::-;28449:48;;28526:10;28516:20;;:6;:20;;;;28508:29;;;;27947:598;;;;;;;:::o;3054:140:6:-;3141:4;3164:23;3183:3;3164;:9;;:18;;:23;;;;:::i;:::-;3157:30;;3054:140;;;;:::o;6538:115:7:-;6601:7;6627:19;6635:3;:10;;6627:7;:19::i;:::-;6620:26;;6538:115;;;:::o;2685:1388::-;2751:4;2867:18;2888:3;:12;;:19;2901:5;2888:19;;;;;;;;;;;;2867:40;;2936:1;2922:10;:15;2918:1149;;3291:21;3328:1;3315:10;:14;;;;:::i;:::-;3291:38;;3343:17;3384:1;3363:3;:11;;:18;;;;:22;;;;:::i;:::-;3343:42;;3417:13;3404:9;:26;3400:398;;3450:17;3470:3;:11;;3482:9;3470:22;;;;;;;;;;;;;;;;;;;;;;;;3450:42;;3621:9;3592:3;:11;;3604:13;3592:26;;;;;;;;;;;;;;;;;;;;;;;:38;;;;3730:10;3704:3;:12;;:23;3717:9;3704:23;;;;;;;;;;;:36;;;;3400:398;;3876:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3968:3;:12;;:19;3981:5;3968:19;;;;;;;;;;;3961:26;;;4009:4;4002:11;;;;;;;2918:1149;4051:5;4044:12;;;2685:1388;;;;;:::o;2113:404::-;2176:4;2197:21;2207:3;2212:5;2197:9;:21::i;:::-;2192:319;;2234:3;:11;;2251:5;2234:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2414:3;:11;;:18;;;;2392:3;:12;;:19;2405:5;2392:19;;;;;;;;;;;:40;;;;2453:4;2446:11;;;;2192:319;2495:5;2488:12;;2113:404;;;;;:::o;2439:204:6:-;2561:4;2596:5;2577:3;:11;;:16;2589:3;2577:16;;;;;;;;;;;:24;;;;2618:18;2632:3;2618;:9;;:13;;:18;;;;:::i;:::-;2611:25;;2439:204;;;;;:::o;6995:129:7:-;7069:7;7095:22;7099:3;:10;;7111:5;7095:3;:22::i;:::-;7088:29;;6995:129;;;;:::o;25672:356:1:-;25769:1;25754:17;;:3;:17;;;;25746:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25828:17;25836:8;25828:7;:17::i;:::-;25827:18;25819:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;25891:32;25914:8;25891:13;:18;25905:3;25891:18;;;;;;;;;;;;;;;:22;;:32;;;;:::i;:::-;;25936:31;25953:8;25963:3;25936:12;:16;;:31;;;;;:::i;:::-;;26011:8;26006:3;25985:35;;26002:1;25985:35;;;;;;;;;;;;25672:356;;:::o;1175:320:0:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;3861:223::-;3994:12;4025:52;4047:6;4055:4;4061:1;4064:12;4025:21;:52::i;:::-;4018:59;;3861:223;;;;;:::o;6319:138:7:-;6399:4;6422:28;6432:3;:10;;6444:5;6422:9;:28::i;:::-;6415:35;;6319:138;;;;:::o;4154:127::-;4227:4;4273:1;4250:3;:12;;:19;4263:5;4250:19;;;;;;;;;;;;:24;;4243:31;;4154:127;;;;:::o;5818:123::-;5888:4;5911:23;5916:3;:10;;5928:5;5911:4;:23::i;:::-;5904:30;;5818:123;;;;:::o;4948:499:0:-;5113:12;5170:5;5145:21;:30;;5137:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;5236:18;5247:6;5236:10;:18::i;:::-;5228:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;5300:12;5314:23;5341:6;:11;;5360:5;5367:4;5341:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5299:73;;;;5389:51;5406:7;5415:10;5427:12;5389:16;:51::i;:::-;5382:58;;;;4948:499;;;;;;:::o;7561:742::-;7707:12;7735:7;7731:566;;;7765:10;7758:17;;;;7731:566;7896:1;7876:10;:17;:21;7872:415;;;8120:10;8114:17;8180:15;8167:10;8163:2;8159:19;8152:44;8069:145;8259:12;8252:20;;;;;;;;;;;:::i;:::-;;;;;;;;7561:742;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:16:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:352::-;1643:8;1653:6;1703:3;1696:4;1688:6;1684:17;1680:27;1670:2;;1721:1;1718;1711:12;1670:2;1757:6;1744:20;1734:30;;1787:18;1779:6;1776:30;1773:2;;;1819:1;1816;1809:12;1773:2;1856:4;1848:6;1844:17;1832:29;;1910:3;1902:4;1894:6;1890:17;1880:8;1876:32;1873:41;1870:2;;;1927:1;1924;1917:12;1870:2;1660:277;;;;;:::o;1957:273::-;2013:5;2062:3;2055:4;2047:6;2043:17;2039:27;2029:2;;2080:1;2077;2070:12;2029:2;2120:6;2107:20;2145:79;2220:3;2212:6;2205:4;2197:6;2193:17;2145:79;:::i;:::-;2136:88;;2019:211;;;;;:::o;2278:171::-;2357:5;2398:3;2389:6;2384:3;2380:16;2376:26;2373:2;;;2415:1;2412;2405:12;2373:2;2437:6;2428:15;;2363:86;;;;:::o;2455:139::-;2501:5;2539:6;2526:20;2517:29;;2555:33;2582:5;2555:33;:::i;:::-;2507:87;;;;:::o;2600:262::-;2659:6;2708:2;2696:9;2687:7;2683:23;2679:32;2676:2;;;2724:1;2721;2714:12;2676:2;2767:1;2792:53;2837:7;2828:6;2817:9;2813:22;2792:53;:::i;:::-;2782:63;;2738:117;2666:196;;;;:::o;2868:407::-;2936:6;2944;2993:2;2981:9;2972:7;2968:23;2964:32;2961:2;;;3009:1;3006;2999:12;2961:2;3052:1;3077:53;3122:7;3113:6;3102:9;3098:22;3077:53;:::i;:::-;3067:63;;3023:117;3179:2;3205:53;3250:7;3241:6;3230:9;3226:22;3205:53;:::i;:::-;3195:63;;3150:118;2951:324;;;;;:::o;3281:552::-;3358:6;3366;3374;3423:2;3411:9;3402:7;3398:23;3394:32;3391:2;;;3439:1;3436;3429:12;3391:2;3482:1;3507:53;3552:7;3543:6;3532:9;3528:22;3507:53;:::i;:::-;3497:63;;3453:117;3609:2;3635:53;3680:7;3671:6;3660:9;3656:22;3635:53;:::i;:::-;3625:63;;3580:118;3737:2;3763:53;3808:7;3799:6;3788:9;3784:22;3763:53;:::i;:::-;3753:63;;3708:118;3381:452;;;;;:::o;3839:809::-;3934:6;3942;3950;3958;4007:3;3995:9;3986:7;3982:23;3978:33;3975:2;;;4024:1;4021;4014:12;3975:2;4067:1;4092:53;4137:7;4128:6;4117:9;4113:22;4092:53;:::i;:::-;4082:63;;4038:117;4194:2;4220:53;4265:7;4256:6;4245:9;4241:22;4220:53;:::i;:::-;4210:63;;4165:118;4322:2;4348:53;4393:7;4384:6;4373:9;4369:22;4348:53;:::i;:::-;4338:63;;4293:118;4478:2;4467:9;4463:18;4450:32;4509:18;4501:6;4498:30;4495:2;;;4541:1;4538;4531:12;4495:2;4569:62;4623:7;4614:6;4603:9;4599:22;4569:62;:::i;:::-;4559:72;;4421:220;3965:683;;;;;;;:::o;4654:401::-;4719:6;4727;4776:2;4764:9;4755:7;4751:23;4747:32;4744:2;;;4792:1;4789;4782:12;4744:2;4835:1;4860:53;4905:7;4896:6;4885:9;4881:22;4860:53;:::i;:::-;4850:63;;4806:117;4962:2;4988:50;5030:7;5021:6;5010:9;5006:22;4988:50;:::i;:::-;4978:60;;4933:115;4734:321;;;;;:::o;5061:407::-;5129:6;5137;5186:2;5174:9;5165:7;5161:23;5157:32;5154:2;;;5202:1;5199;5192:12;5154:2;5245:1;5270:53;5315:7;5306:6;5295:9;5291:22;5270:53;:::i;:::-;5260:63;;5216:117;5372:2;5398:53;5443:7;5434:6;5423:9;5419:22;5398:53;:::i;:::-;5388:63;;5343:118;5144:324;;;;;:::o;5474:260::-;5532:6;5581:2;5569:9;5560:7;5556:23;5552:32;5549:2;;;5597:1;5594;5587:12;5549:2;5640:1;5665:52;5709:7;5700:6;5689:9;5685:22;5665:52;:::i;:::-;5655:62;;5611:116;5539:195;;;;:::o;5740:282::-;5809:6;5858:2;5846:9;5837:7;5833:23;5829:32;5826:2;;;5874:1;5871;5864:12;5826:2;5917:1;5942:63;5997:7;5988:6;5977:9;5973:22;5942:63;:::i;:::-;5932:73;;5888:127;5816:206;;;;:::o;6028:395::-;6099:6;6107;6156:2;6144:9;6135:7;6131:23;6127:32;6124:2;;;6172:1;6169;6162:12;6124:2;6243:1;6232:9;6228:17;6215:31;6273:18;6265:6;6262:30;6259:2;;;6305:1;6302;6295:12;6259:2;6341:65;6398:7;6389:6;6378:9;6374:22;6341:65;:::i;:::-;6323:83;;;;6186:230;6114:309;;;;;:::o;6429:699::-;6542:6;6550;6558;6607:2;6595:9;6586:7;6582:23;6578:32;6575:2;;;6623:1;6620;6613:12;6575:2;6694:1;6683:9;6679:17;6666:31;6724:18;6716:6;6713:30;6710:2;;;6756:1;6753;6746:12;6710:2;6792:65;6849:7;6840:6;6829:9;6825:22;6792:65;:::i;:::-;6774:83;;;;6637:230;6934:2;6923:9;6919:18;6906:32;6965:18;6957:6;6954:30;6951:2;;;6997:1;6994;6987:12;6951:2;7025:86;7103:7;7094:6;7083:9;7079:22;7025:86;:::i;:::-;7015:96;;6877:244;6565:563;;;;;:::o;7134:375::-;7203:6;7252:2;7240:9;7231:7;7227:23;7223:32;7220:2;;;7268:1;7265;7258:12;7220:2;7339:1;7328:9;7324:17;7311:31;7369:18;7361:6;7358:30;7355:2;;;7401:1;7398;7391:12;7355:2;7429:63;7484:7;7475:6;7464:9;7460:22;7429:63;:::i;:::-;7419:73;;7282:220;7210:299;;;;:::o;7515:262::-;7574:6;7623:2;7611:9;7602:7;7598:23;7594:32;7591:2;;;7639:1;7636;7629:12;7591:2;7682:1;7707:53;7752:7;7743:6;7732:9;7728:22;7707:53;:::i;:::-;7697:63;;7653:117;7581:196;;;;:::o;7783:844::-;7905:6;7913;7921;7929;7978:2;7966:9;7957:7;7953:23;7949:32;7946:2;;;7994:1;7991;7984:12;7946:2;8037:1;8062:53;8107:7;8098:6;8087:9;8083:22;8062:53;:::i;:::-;8052:63;;8008:117;8192:2;8181:9;8177:18;8164:32;8223:18;8215:6;8212:30;8209:2;;;8255:1;8252;8245:12;8209:2;8291:65;8348:7;8339:6;8328:9;8324:22;8291:65;:::i;:::-;8273:83;;;;8135:231;8433:2;8422:9;8418:18;8405:32;8464:18;8456:6;8453:30;8450:2;;;8496:1;8493;8486:12;8450:2;8524:86;8602:7;8593:6;8582:9;8578:22;8524:86;:::i;:::-;8514:96;;8376:244;7936:691;;;;;;;:::o;8633:520::-;8711:6;8719;8768:2;8756:9;8747:7;8743:23;8739:32;8736:2;;;8784:1;8781;8774:12;8736:2;8827:1;8852:53;8897:7;8888:6;8877:9;8873:22;8852:53;:::i;:::-;8842:63;;8798:117;8982:2;8971:9;8967:18;8954:32;9013:18;9005:6;9002:30;8999:2;;;9045:1;9042;9035:12;8999:2;9073:63;9128:7;9119:6;9108:9;9104:22;9073:63;:::i;:::-;9063:73;;8925:221;8726:427;;;;;:::o;9159:407::-;9227:6;9235;9284:2;9272:9;9263:7;9259:23;9255:32;9252:2;;;9300:1;9297;9290:12;9252:2;9343:1;9368:53;9413:7;9404:6;9393:9;9389:22;9368:53;:::i;:::-;9358:63;;9314:117;9470:2;9496:53;9541:7;9532:6;9521:9;9517:22;9496:53;:::i;:::-;9486:63;;9441:118;9242:324;;;;;:::o;9572:924::-;9678:6;9686;9694;9702;9751:3;9739:9;9730:7;9726:23;9722:33;9719:2;;;9768:1;9765;9758:12;9719:2;9811:1;9836:53;9881:7;9872:6;9861:9;9857:22;9836:53;:::i;:::-;9826:63;;9782:117;9938:2;9964:53;10009:7;10000:6;9989:9;9985:22;9964:53;:::i;:::-;9954:63;;9909:118;10094:2;10083:9;10079:18;10066:32;10125:18;10117:6;10114:30;10111:2;;;10157:1;10154;10147:12;10111:2;10185:63;10240:7;10231:6;10220:9;10216:22;10185:63;:::i;:::-;10175:73;;10037:221;10325:2;10314:9;10310:18;10297:32;10356:18;10348:6;10345:30;10342:2;;;10388:1;10385;10378:12;10342:2;10416:63;10471:7;10462:6;10451:9;10447:22;10416:63;:::i;:::-;10406:73;;10268:221;9709:787;;;;;;;:::o;10502:118::-;10589:24;10607:5;10589:24;:::i;:::-;10584:3;10577:37;10567:53;;:::o;10626:157::-;10731:45;10751:24;10769:5;10751:24;:::i;:::-;10731:45;:::i;:::-;10726:3;10719:58;10709:74;;:::o;10789:109::-;10870:21;10885:5;10870:21;:::i;:::-;10865:3;10858:34;10848:50;;:::o;10904:360::-;10990:3;11018:38;11050:5;11018:38;:::i;:::-;11072:70;11135:6;11130:3;11072:70;:::i;:::-;11065:77;;11151:52;11196:6;11191:3;11184:4;11177:5;11173:16;11151:52;:::i;:::-;11228:29;11250:6;11228:29;:::i;:::-;11223:3;11219:39;11212:46;;10994:270;;;;;:::o;11270:373::-;11374:3;11402:38;11434:5;11402:38;:::i;:::-;11456:88;11537:6;11532:3;11456:88;:::i;:::-;11449:95;;11553:52;11598:6;11593:3;11586:4;11579:5;11575:16;11553:52;:::i;:::-;11630:6;11625:3;11621:16;11614:23;;11378:265;;;;;:::o;11673:284::-;11761:3;11782:61;11836:6;11831:3;11782:61;:::i;:::-;11775:68;;11853:43;11889:6;11884:3;11877:5;11853:43;:::i;:::-;11921:29;11943:6;11921:29;:::i;:::-;11916:3;11912:39;11905:46;;11765:192;;;;;:::o;11987:304::-;12085:3;12106:71;12170:6;12165:3;12106:71;:::i;:::-;12099:78;;12187:43;12223:6;12218:3;12211:5;12187:43;:::i;:::-;12255:29;12277:6;12255:29;:::i;:::-;12250:3;12246:39;12239:46;;12089:202;;;;;:::o;12321:317::-;12437:3;12458:89;12540:6;12535:3;12458:89;:::i;:::-;12451:96;;12557:43;12593:6;12588:3;12581:5;12557:43;:::i;:::-;12625:6;12620:3;12616:16;12609:23;;12441:197;;;;;:::o;12644:344::-;12722:3;12750:39;12783:5;12750:39;:::i;:::-;12805:61;12859:6;12854:3;12805:61;:::i;:::-;12798:68;;12875:52;12920:6;12915:3;12908:4;12901:5;12897:16;12875:52;:::i;:::-;12952:29;12974:6;12952:29;:::i;:::-;12947:3;12943:39;12936:46;;12726:262;;;;;:::o;12994:364::-;13082:3;13110:39;13143:5;13110:39;:::i;:::-;13165:71;13229:6;13224:3;13165:71;:::i;:::-;13158:78;;13245:52;13290:6;13285:3;13278:4;13271:5;13267:16;13245:52;:::i;:::-;13322:29;13344:6;13322:29;:::i;:::-;13317:3;13313:39;13306:46;;13086:272;;;;;:::o;13364:377::-;13470:3;13498:39;13531:5;13498:39;:::i;:::-;13553:89;13635:6;13630:3;13553:89;:::i;:::-;13546:96;;13651:52;13696:6;13691:3;13684:4;13677:5;13673:16;13651:52;:::i;:::-;13728:6;13723:3;13719:16;13712:23;;13474:267;;;;;:::o;13747:366::-;13889:3;13910:67;13974:2;13969:3;13910:67;:::i;:::-;13903:74;;13986:93;14075:3;13986:93;:::i;:::-;14104:2;14099:3;14095:12;14088:19;;13893:220;;;:::o;14119:366::-;14261:3;14282:67;14346:2;14341:3;14282:67;:::i;:::-;14275:74;;14358:93;14447:3;14358:93;:::i;:::-;14476:2;14471:3;14467:12;14460:19;;14265:220;;;:::o;14491:366::-;14633:3;14654:67;14718:2;14713:3;14654:67;:::i;:::-;14647:74;;14730:93;14819:3;14730:93;:::i;:::-;14848:2;14843:3;14839:12;14832:19;;14637:220;;;:::o;14863:366::-;15005:3;15026:67;15090:2;15085:3;15026:67;:::i;:::-;15019:74;;15102:93;15191:3;15102:93;:::i;:::-;15220:2;15215:3;15211:12;15204:19;;15009:220;;;:::o;15235:366::-;15377:3;15398:67;15462:2;15457:3;15398:67;:::i;:::-;15391:74;;15474:93;15563:3;15474:93;:::i;:::-;15592:2;15587:3;15583:12;15576:19;;15381:220;;;:::o;15607:366::-;15749:3;15770:67;15834:2;15829:3;15770:67;:::i;:::-;15763:74;;15846:93;15935:3;15846:93;:::i;:::-;15964:2;15959:3;15955:12;15948:19;;15753:220;;;:::o;15979:366::-;16121:3;16142:67;16206:2;16201:3;16142:67;:::i;:::-;16135:74;;16218:93;16307:3;16218:93;:::i;:::-;16336:2;16331:3;16327:12;16320:19;;16125:220;;;:::o;16351:366::-;16493:3;16514:67;16578:2;16573:3;16514:67;:::i;:::-;16507:74;;16590:93;16679:3;16590:93;:::i;:::-;16708:2;16703:3;16699:12;16692:19;;16497:220;;;:::o;16723:366::-;16865:3;16886:67;16950:2;16945:3;16886:67;:::i;:::-;16879:74;;16962:93;17051:3;16962:93;:::i;:::-;17080:2;17075:3;17071:12;17064:19;;16869:220;;;:::o;17095:366::-;17237:3;17258:67;17322:2;17317:3;17258:67;:::i;:::-;17251:74;;17334:93;17423:3;17334:93;:::i;:::-;17452:2;17447:3;17443:12;17436:19;;17241:220;;;:::o;17467:366::-;17609:3;17630:67;17694:2;17689:3;17630:67;:::i;:::-;17623:74;;17706:93;17795:3;17706:93;:::i;:::-;17824:2;17819:3;17815:12;17808:19;;17613:220;;;:::o;17839:366::-;17981:3;18002:67;18066:2;18061:3;18002:67;:::i;:::-;17995:74;;18078:93;18167:3;18078:93;:::i;:::-;18196:2;18191:3;18187:12;18180:19;;17985:220;;;:::o;18211:366::-;18353:3;18374:67;18438:2;18433:3;18374:67;:::i;:::-;18367:74;;18450:93;18539:3;18450:93;:::i;:::-;18568:2;18563:3;18559:12;18552:19;;18357:220;;;:::o;18583:366::-;18725:3;18746:67;18810:2;18805:3;18746:67;:::i;:::-;18739:74;;18822:93;18911:3;18822:93;:::i;:::-;18940:2;18935:3;18931:12;18924:19;;18729:220;;;:::o;18955:366::-;19097:3;19118:67;19182:2;19177:3;19118:67;:::i;:::-;19111:74;;19194:93;19283:3;19194:93;:::i;:::-;19312:2;19307:3;19303:12;19296:19;;19101:220;;;:::o;19327:366::-;19469:3;19490:67;19554:2;19549:3;19490:67;:::i;:::-;19483:74;;19566:93;19655:3;19566:93;:::i;:::-;19684:2;19679:3;19675:12;19668:19;;19473:220;;;:::o;19699:366::-;19841:3;19862:67;19926:2;19921:3;19862:67;:::i;:::-;19855:74;;19938:93;20027:3;19938:93;:::i;:::-;20056:2;20051:3;20047:12;20040:19;;19845:220;;;:::o;20071:366::-;20213:3;20234:67;20298:2;20293:3;20234:67;:::i;:::-;20227:74;;20310:93;20399:3;20310:93;:::i;:::-;20428:2;20423:3;20419:12;20412:19;;20217:220;;;:::o;20443:366::-;20585:3;20606:67;20670:2;20665:3;20606:67;:::i;:::-;20599:74;;20682:93;20771:3;20682:93;:::i;:::-;20800:2;20795:3;20791:12;20784:19;;20589:220;;;:::o;20815:366::-;20957:3;20978:67;21042:2;21037:3;20978:67;:::i;:::-;20971:74;;21054:93;21143:3;21054:93;:::i;:::-;21172:2;21167:3;21163:12;21156:19;;20961:220;;;:::o;21187:366::-;21329:3;21350:67;21414:2;21409:3;21350:67;:::i;:::-;21343:74;;21426:93;21515:3;21426:93;:::i;:::-;21544:2;21539:3;21535:12;21528:19;;21333:220;;;:::o;21559:366::-;21701:3;21722:67;21786:2;21781:3;21722:67;:::i;:::-;21715:74;;21798:93;21887:3;21798:93;:::i;:::-;21916:2;21911:3;21907:12;21900:19;;21705:220;;;:::o;22011:2667::-;22144:3;22180:6;22175:3;22171:16;22270:62;22326:4;22319:5;22315:16;22308:5;22270:62;:::i;:::-;22379:3;22373:4;22369:14;22362:4;22357:3;22353:14;22346:38;22405:89;22489:4;22475:12;22461;22405:89;:::i;:::-;22397:97;;22197:308;;22594:62;22650:4;22643:5;22639:16;22632:5;22594:62;:::i;:::-;22703:3;22697:4;22693:14;22686:4;22681:3;22677:14;22670:38;22729:89;22813:4;22799:12;22785;22729:89;:::i;:::-;22721:97;;22515:314;;22919:62;22975:4;22968:5;22964:16;22957:5;22919:62;:::i;:::-;23028:3;23022:4;23018:14;23011:4;23006:3;23002:14;22995:38;23054:89;23138:4;23124:12;23110;23054:89;:::i;:::-;23046:97;;22839:315;;23242:62;23298:4;23291:5;23287:16;23280:5;23242:62;:::i;:::-;23351:3;23345:4;23341:14;23334:4;23329:3;23325:14;23318:38;23377:89;23461:4;23447:12;23433;23377:89;:::i;:::-;23369:97;;23164:313;;23552:50;23596:4;23589:5;23585:16;23578:5;23552:50;:::i;:::-;23615:63;23672:4;23667:3;23663:14;23649:12;23615:63;:::i;:::-;23487:201;23775:62;23831:4;23824:5;23820:16;23813:5;23775:62;:::i;:::-;23884:3;23878:4;23874:14;23867:4;23862:3;23858:14;23851:38;23910:89;23994:4;23980:12;23966;23910:89;:::i;:::-;23902:97;;23698:312;;24099:62;24155:4;24148:5;24144:16;24137:5;24099:62;:::i;:::-;24208:3;24202:4;24198:14;24191:4;24186:3;24182:14;24175:38;24234:89;24318:4;24304:12;24290;24234:89;:::i;:::-;24226:97;;24020:314;;24416:62;24472:4;24465:5;24461:16;24454:5;24416:62;:::i;:::-;24525:3;24519:4;24515:14;24508:4;24503:3;24499:14;24492:38;24551:89;24635:4;24621:12;24607;24551:89;:::i;:::-;24543:97;;24344:307;;24668:4;24661:11;;22149:2529;;;;;:::o;24744:599::-;24855:3;24891:4;24886:3;24882:14;24979:4;24972:5;24968:16;24962:23;24998:63;25055:4;25050:3;25046:14;25032:12;24998:63;:::i;:::-;24906:165;25153:4;25146:5;25142:16;25136:23;25206:3;25200:4;25196:14;25189:4;25184:3;25180:14;25173:38;25232:73;25300:4;25286:12;25232:73;:::i;:::-;25224:81;;25081:235;25333:4;25326:11;;24860:483;;;;;:::o;25349:108::-;25426:24;25444:5;25426:24;:::i;:::-;25421:3;25414:37;25404:53;;:::o;25463:118::-;25550:24;25568:5;25550:24;:::i;:::-;25545:3;25538:37;25528:53;;:::o;25587:157::-;25692:45;25712:24;25730:5;25712:24;:::i;:::-;25692:45;:::i;:::-;25687:3;25680:58;25670:74;;:::o;25750:271::-;25880:3;25902:93;25991:3;25982:6;25902:93;:::i;:::-;25895:100;;26012:3;26005:10;;25884:137;;;;:::o;26027:436::-;26197:3;26219:105;26320:3;26311:6;26303;26219:105;:::i;:::-;26212:112;;26334:75;26405:3;26396:6;26334:75;:::i;:::-;26434:2;26429:3;26425:12;26418:19;;26454:3;26447:10;;26201:262;;;;;;:::o;26469:275::-;26601:3;26623:95;26714:3;26705:6;26623:95;:::i;:::-;26616:102;;26735:3;26728:10;;26605:139;;;;:::o;26750:435::-;26930:3;26952:95;27043:3;27034:6;26952:95;:::i;:::-;26945:102;;27064:95;27155:3;27146:6;27064:95;:::i;:::-;27057:102;;27176:3;27169:10;;26934:251;;;;;:::o;27191:718::-;27417:3;27432:75;27503:3;27494:6;27432:75;:::i;:::-;27532:2;27527:3;27523:12;27516:19;;27545:75;27616:3;27607:6;27545:75;:::i;:::-;27645:2;27640:3;27636:12;27629:19;;27665:105;27766:3;27757:6;27749;27665:105;:::i;:::-;27658:112;;27780:75;27851:3;27842:6;27780:75;:::i;:::-;27880:2;27875:3;27871:12;27864:19;;27900:3;27893:10;;27421:488;;;;;;;;:::o;27915:222::-;28008:4;28046:2;28035:9;28031:18;28023:26;;28059:71;28127:1;28116:9;28112:17;28103:6;28059:71;:::i;:::-;28013:124;;;;:::o;28143:640::-;28338:4;28376:3;28365:9;28361:19;28353:27;;28390:71;28458:1;28447:9;28443:17;28434:6;28390:71;:::i;:::-;28471:72;28539:2;28528:9;28524:18;28515:6;28471:72;:::i;:::-;28553;28621:2;28610:9;28606:18;28597:6;28553:72;:::i;:::-;28672:9;28666:4;28662:20;28657:2;28646:9;28642:18;28635:48;28700:76;28771:4;28762:6;28700:76;:::i;:::-;28692:84;;28343:440;;;;;;;:::o;28789:210::-;28876:4;28914:2;28903:9;28899:18;28891:26;;28927:65;28989:1;28978:9;28974:17;28965:6;28927:65;:::i;:::-;28881:118;;;;:::o;29005:313::-;29118:4;29156:2;29145:9;29141:18;29133:26;;29205:9;29199:4;29195:20;29191:1;29180:9;29176:17;29169:47;29233:78;29306:4;29297:6;29233:78;:::i;:::-;29225:86;;29123:195;;;;:::o;29324:419::-;29490:4;29528:2;29517:9;29513:18;29505:26;;29577:9;29571:4;29567:20;29563:1;29552:9;29548:17;29541:47;29605:131;29731:4;29605:131;:::i;:::-;29597:139;;29495:248;;;:::o;29749:419::-;29915:4;29953:2;29942:9;29938:18;29930:26;;30002:9;29996:4;29992:20;29988:1;29977:9;29973:17;29966:47;30030:131;30156:4;30030:131;:::i;:::-;30022:139;;29920:248;;;:::o;30174:419::-;30340:4;30378:2;30367:9;30363:18;30355:26;;30427:9;30421:4;30417:20;30413:1;30402:9;30398:17;30391:47;30455:131;30581:4;30455:131;:::i;:::-;30447:139;;30345:248;;;:::o;30599:419::-;30765:4;30803:2;30792:9;30788:18;30780:26;;30852:9;30846:4;30842:20;30838:1;30827:9;30823:17;30816:47;30880:131;31006:4;30880:131;:::i;:::-;30872:139;;30770:248;;;:::o;31024:419::-;31190:4;31228:2;31217:9;31213:18;31205:26;;31277:9;31271:4;31267:20;31263:1;31252:9;31248:17;31241:47;31305:131;31431:4;31305:131;:::i;:::-;31297:139;;31195:248;;;:::o;31449:419::-;31615:4;31653:2;31642:9;31638:18;31630:26;;31702:9;31696:4;31692:20;31688:1;31677:9;31673:17;31666:47;31730:131;31856:4;31730:131;:::i;:::-;31722:139;;31620:248;;;:::o;31874:419::-;32040:4;32078:2;32067:9;32063:18;32055:26;;32127:9;32121:4;32117:20;32113:1;32102:9;32098:17;32091:47;32155:131;32281:4;32155:131;:::i;:::-;32147:139;;32045:248;;;:::o;32299:419::-;32465:4;32503:2;32492:9;32488:18;32480:26;;32552:9;32546:4;32542:20;32538:1;32527:9;32523:17;32516:47;32580:131;32706:4;32580:131;:::i;:::-;32572:139;;32470:248;;;:::o;32724:419::-;32890:4;32928:2;32917:9;32913:18;32905:26;;32977:9;32971:4;32967:20;32963:1;32952:9;32948:17;32941:47;33005:131;33131:4;33005:131;:::i;:::-;32997:139;;32895:248;;;:::o;33149:419::-;33315:4;33353:2;33342:9;33338:18;33330:26;;33402:9;33396:4;33392:20;33388:1;33377:9;33373:17;33366:47;33430:131;33556:4;33430:131;:::i;:::-;33422:139;;33320:248;;;:::o;33574:419::-;33740:4;33778:2;33767:9;33763:18;33755:26;;33827:9;33821:4;33817:20;33813:1;33802:9;33798:17;33791:47;33855:131;33981:4;33855:131;:::i;:::-;33847:139;;33745:248;;;:::o;33999:419::-;34165:4;34203:2;34192:9;34188:18;34180:26;;34252:9;34246:4;34242:20;34238:1;34227:9;34223:17;34216:47;34280:131;34406:4;34280:131;:::i;:::-;34272:139;;34170:248;;;:::o;34424:419::-;34590:4;34628:2;34617:9;34613:18;34605:26;;34677:9;34671:4;34667:20;34663:1;34652:9;34648:17;34641:47;34705:131;34831:4;34705:131;:::i;:::-;34697:139;;34595:248;;;:::o;34849:419::-;35015:4;35053:2;35042:9;35038:18;35030:26;;35102:9;35096:4;35092:20;35088:1;35077:9;35073:17;35066:47;35130:131;35256:4;35130:131;:::i;:::-;35122:139;;35020:248;;;:::o;35274:419::-;35440:4;35478:2;35467:9;35463:18;35455:26;;35527:9;35521:4;35517:20;35513:1;35502:9;35498:17;35491:47;35555:131;35681:4;35555:131;:::i;:::-;35547:139;;35445:248;;;:::o;35699:419::-;35865:4;35903:2;35892:9;35888:18;35880:26;;35952:9;35946:4;35942:20;35938:1;35927:9;35923:17;35916:47;35980:131;36106:4;35980:131;:::i;:::-;35972:139;;35870:248;;;:::o;36124:419::-;36290:4;36328:2;36317:9;36313:18;36305:26;;36377:9;36371:4;36367:20;36363:1;36352:9;36348:17;36341:47;36405:131;36531:4;36405:131;:::i;:::-;36397:139;;36295:248;;;:::o;36549:419::-;36715:4;36753:2;36742:9;36738:18;36730:26;;36802:9;36796:4;36792:20;36788:1;36777:9;36773:17;36766:47;36830:131;36956:4;36830:131;:::i;:::-;36822:139;;36720:248;;;:::o;36974:419::-;37140:4;37178:2;37167:9;37163:18;37155:26;;37227:9;37221:4;37217:20;37213:1;37202:9;37198:17;37191:47;37255:131;37381:4;37255:131;:::i;:::-;37247:139;;37145:248;;;:::o;37399:419::-;37565:4;37603:2;37592:9;37588:18;37580:26;;37652:9;37646:4;37642:20;37638:1;37627:9;37623:17;37616:47;37680:131;37806:4;37680:131;:::i;:::-;37672:139;;37570:248;;;:::o;37824:419::-;37990:4;38028:2;38017:9;38013:18;38005:26;;38077:9;38071:4;38067:20;38063:1;38052:9;38048:17;38041:47;38105:131;38231:4;38105:131;:::i;:::-;38097:139;;37995:248;;;:::o;38249:419::-;38415:4;38453:2;38442:9;38438:18;38430:26;;38502:9;38496:4;38492:20;38488:1;38477:9;38473:17;38466:47;38530:131;38656:4;38530:131;:::i;:::-;38522:139;;38420:248;;;:::o;38674:357::-;38809:4;38847:2;38836:9;38832:18;38824:26;;38896:9;38890:4;38886:20;38882:1;38871:9;38867:17;38860:47;38924:100;39019:4;39010:6;38924:100;:::i;:::-;38916:108;;38814:217;;;;:::o;39037:222::-;39130:4;39168:2;39157:9;39153:18;39145:26;;39181:71;39249:1;39238:9;39234:17;39225:6;39181:71;:::i;:::-;39135:124;;;;:::o;39265:423::-;39406:4;39444:2;39433:9;39429:18;39421:26;;39457:71;39525:1;39514:9;39510:17;39501:6;39457:71;:::i;:::-;39575:9;39569:4;39565:20;39560:2;39549:9;39545:18;39538:48;39603:78;39676:4;39667:6;39603:78;:::i;:::-;39595:86;;39411:277;;;;;:::o;39694:843::-;39965:4;40003:3;39992:9;39988:19;39980:27;;40017:71;40085:1;40074:9;40070:17;40061:6;40017:71;:::i;:::-;40098:72;40166:2;40155:9;40151:18;40142:6;40098:72;:::i;:::-;40217:9;40211:4;40207:20;40202:2;40191:9;40187:18;40180:48;40245:88;40328:4;40319:6;40311;40245:88;:::i;:::-;40237:96;;40380:9;40374:4;40370:20;40365:2;40354:9;40350:18;40343:48;40408:122;40525:4;40516:6;40408:122;:::i;:::-;40400:130;;39970:567;;;;;;;;:::o;40543:553::-;40720:4;40758:3;40747:9;40743:19;40735:27;;40772:71;40840:1;40829:9;40825:17;40816:6;40772:71;:::i;:::-;40853:72;40921:2;40910:9;40906:18;40897:6;40853:72;:::i;:::-;40935;41003:2;40992:9;40988:18;40979:6;40935:72;:::i;:::-;41017;41085:2;41074:9;41070:18;41061:6;41017:72;:::i;:::-;40725:371;;;;;;;:::o;41102:524::-;41180:4;41186:6;41242:11;41229:25;41342:1;41336:4;41332:12;41321:8;41305:14;41301:29;41297:48;41277:18;41273:73;41263:2;;41360:1;41357;41350:12;41263:2;41395:18;41385:8;41381:33;41373:41;;41447:4;41434:18;41424:28;;41475:18;41467:6;41464:30;41461:2;;;41507:1;41504;41497:12;41461:2;41538;41532:4;41528:13;41520:21;;41595:4;41587:6;41583:17;41567:14;41563:38;41557:4;41553:49;41550:2;;;41615:1;41612;41605:12;41550:2;41193:433;;;;;;:::o;41632:129::-;41666:6;41693:20;;:::i;:::-;41683:30;;41722:33;41750:4;41742:6;41722:33;:::i;:::-;41673:88;;;:::o;41767:75::-;41800:6;41833:2;41827:9;41817:19;;41807:35;:::o;41848:307::-;41909:4;41999:18;41991:6;41988:30;41985:2;;;42021:18;;:::i;:::-;41985:2;42059:29;42081:6;42059:29;:::i;:::-;42051:37;;42143:4;42137;42133:15;42125:23;;41914:241;;;:::o;42161:308::-;42223:4;42313:18;42305:6;42302:30;42299:2;;;42335:18;;:::i;:::-;42299:2;42373:29;42395:6;42373:29;:::i;:::-;42365:37;;42457:4;42451;42447:15;42439:23;;42228:241;;;:::o;42475:98::-;42526:6;42560:5;42554:12;42544:22;;42533:40;;;:::o;42579:99::-;42631:6;42665:5;42659:12;42649:22;;42638:40;;;:::o;42684:168::-;42767:11;42801:6;42796:3;42789:19;42841:4;42836:3;42832:14;42817:29;;42779:73;;;;:::o;42858:147::-;42959:11;42996:3;42981:18;;42971:34;;;;:::o;43011:159::-;43085:11;43119:6;43114:3;43107:19;43159:4;43154:3;43150:14;43135:29;;43097:73;;;;:::o;43176:169::-;43260:11;43294:6;43289:3;43282:19;43334:4;43329:3;43325:14;43310:29;;43272:73;;;;:::o;43351:148::-;43453:11;43490:3;43475:18;;43465:34;;;;:::o;43505:514::-;43570:5;43577:6;43633:3;43620:17;43725:1;43719:4;43715:12;43704:8;43688:14;43684:29;43680:48;43660:18;43656:73;43646:2;;43743:1;43740;43733:12;43646:2;43789:8;43769:18;43765:33;43756:42;;43831:5;43818:19;43808:29;;43866:4;43859:5;43855:16;43846:25;;43894:18;43886:6;43883:30;43880:2;;;43926:1;43923;43916:12;43880:2;43988:4;43980:6;43976:17;43960:14;43956:38;43946:8;43942:53;43939:2;;;44008:1;44005;43998:12;43939:2;43584:435;;;;;;:::o;44025:122::-;44077:5;44102:39;44137:2;44132:3;44128:12;44123:3;44102:39;:::i;:::-;44093:48;;44083:64;;;;:::o;44153:305::-;44193:3;44212:20;44230:1;44212:20;:::i;:::-;44207:25;;44246:20;44264:1;44246:20;:::i;:::-;44241:25;;44400:1;44332:66;44328:74;44325:1;44322:81;44319:2;;;44406:18;;:::i;:::-;44319:2;44450:1;44447;44443:9;44436:16;;44197:261;;;;:::o;44464:237::-;44502:3;44521:18;44537:1;44521:18;:::i;:::-;44516:23;;44553:18;44569:1;44553:18;:::i;:::-;44548:23;;44643:1;44637:4;44633:12;44630:1;44627:19;44624:2;;;44649:18;;:::i;:::-;44624:2;44693:1;44690;44686:9;44679:16;;44506:195;;;;:::o;44707:191::-;44747:4;44767:20;44785:1;44767:20;:::i;:::-;44762:25;;44801:20;44819:1;44801:20;:::i;:::-;44796:25;;44840:1;44837;44834:8;44831:2;;;44845:18;;:::i;:::-;44831:2;44890:1;44887;44883:9;44875:17;;44752:146;;;;:::o;44904:96::-;44941:7;44970:24;44988:5;44970:24;:::i;:::-;44959:35;;44949:51;;;:::o;45006:90::-;45040:7;45083:5;45076:13;45069:21;45058:32;;45048:48;;;:::o;45102:149::-;45138:7;45178:66;45171:5;45167:78;45156:89;;45146:105;;;:::o;45257:126::-;45294:7;45334:42;45327:5;45323:54;45312:65;;45302:81;;;:::o;45389:77::-;45426:7;45455:5;45444:16;;45434:32;;;:::o;45472:86::-;45507:7;45547:4;45540:5;45536:16;45525:27;;45515:43;;;:::o;45564:154::-;45648:6;45643:3;45638;45625:30;45710:1;45701:6;45696:3;45692:16;45685:27;45615:103;;;:::o;45724:307::-;45792:1;45802:113;45816:6;45813:1;45810:13;45802:113;;;45901:1;45896:3;45892:11;45886:18;45882:1;45877:3;45873:11;45866:39;45838:2;45835:1;45831:10;45826:15;;45802:113;;;45933:6;45930:1;45927:13;45924:2;;;46013:1;46004:6;45999:3;45995:16;45988:27;45924:2;45773:258;;;;:::o;46037:320::-;46081:6;46118:1;46112:4;46108:12;46098:22;;46165:1;46159:4;46155:12;46186:18;46176:2;;46242:4;46234:6;46230:17;46220:27;;46176:2;46304;46296:6;46293:14;46273:18;46270:38;46267:2;;;46323:18;;:::i;:::-;46267:2;46088:269;;;;:::o;46363:281::-;46446:27;46468:4;46446:27;:::i;:::-;46438:6;46434:40;46576:6;46564:10;46561:22;46540:18;46528:10;46525:34;46522:62;46519:2;;;46587:18;;:::i;:::-;46519:2;46627:10;46623:2;46616:22;46406:238;;;:::o;46650:233::-;46689:3;46712:24;46730:5;46712:24;:::i;:::-;46703:33;;46758:66;46751:5;46748:77;46745:2;;;46828:18;;:::i;:::-;46745:2;46875:1;46868:5;46864:13;46857:20;;46693:190;;;:::o;46889:100::-;46928:7;46957:26;46977:5;46957:26;:::i;:::-;46946:37;;46936:53;;;:::o;46995:94::-;47034:7;47063:20;47077:5;47063:20;:::i;:::-;47052:31;;47042:47;;;:::o;47095:79::-;47134:7;47163:5;47152:16;;47142:32;;;:::o;47180:176::-;47212:1;47229:20;47247:1;47229:20;:::i;:::-;47224:25;;47263:20;47281:1;47263:20;:::i;:::-;47258:25;;47302:1;47292:2;;47307:18;;:::i;:::-;47292:2;47348:1;47345;47341:9;47336:14;;47214:142;;;;:::o;47362:180::-;47410:77;47407:1;47400:88;47507:4;47504:1;47497:15;47531:4;47528:1;47521:15;47548:180;47596:77;47593:1;47586:88;47693:4;47690:1;47683:15;47717:4;47714:1;47707:15;47734:180;47782:77;47779:1;47772:88;47879:4;47876:1;47869:15;47903:4;47900:1;47893:15;47920:180;47968:77;47965:1;47958:88;48065:4;48062:1;48055:15;48089:4;48086:1;48079:15;48106:102;48147:6;48198:2;48194:7;48189:2;48182:5;48178:14;48174:28;48164:38;;48154:54;;;:::o;48214:94::-;48247:8;48295:5;48291:2;48287:14;48266:35;;48256:52;;;:::o;48314:237::-;48454:34;48450:1;48442:6;48438:14;48431:58;48523:20;48518:2;48510:6;48506:15;48499:45;48420:131;:::o;48557:225::-;48697:34;48693:1;48685:6;48681:14;48674:58;48766:8;48761:2;48753:6;48749:15;48742:33;48663:119;:::o;48788:178::-;48928:30;48924:1;48916:6;48912:14;48905:54;48894:72;:::o;48972:223::-;49112:34;49108:1;49100:6;49096:14;49089:58;49181:6;49176:2;49168:6;49164:15;49157:31;49078:117;:::o;49201:175::-;49341:27;49337:1;49329:6;49325:14;49318:51;49307:69;:::o;49382:225::-;49522:34;49518:1;49510:6;49506:14;49499:58;49591:8;49586:2;49578:6;49574:15;49567:33;49488:119;:::o;49613:231::-;49753:34;49749:1;49741:6;49737:14;49730:58;49822:14;49817:2;49809:6;49805:15;49798:39;49719:125;:::o;49850:173::-;49990:25;49986:1;49978:6;49974:14;49967:49;49956:67;:::o;50029:243::-;50169:34;50165:1;50157:6;50153:14;50146:58;50238:26;50233:2;50225:6;50221:15;50214:51;50135:137;:::o;50278:229::-;50418:34;50414:1;50406:6;50402:14;50395:58;50487:12;50482:2;50474:6;50470:15;50463:37;50384:123;:::o;50513:182::-;50653:34;50649:1;50641:6;50637:14;50630:58;50619:76;:::o;50701:231::-;50841:34;50837:1;50829:6;50825:14;50818:58;50910:14;50905:2;50897:6;50893:15;50886:39;50807:125;:::o;50938:182::-;51078:34;51074:1;51066:6;51062:14;51055:58;51044:76;:::o;51126:228::-;51266:34;51262:1;51254:6;51250:14;51243:58;51335:11;51330:2;51322:6;51318:15;51311:36;51232:122;:::o;51360:168::-;51500:20;51496:1;51488:6;51484:14;51477:44;51466:62;:::o;51534:234::-;51674:34;51670:1;51662:6;51658:14;51651:58;51743:17;51738:2;51730:6;51726:15;51719:42;51640:128;:::o;51774:170::-;51914:22;51910:1;51902:6;51898:14;51891:46;51880:64;:::o;51950:220::-;52090:34;52086:1;52078:6;52074:14;52067:58;52159:3;52154:2;52146:6;52142:15;52135:28;52056:114;:::o;52176:182::-;52316:34;52312:1;52304:6;52300:14;52293:58;52282:76;:::o;52364:236::-;52504:34;52500:1;52492:6;52488:14;52481:58;52573:19;52568:2;52560:6;52556:15;52549:44;52470:130;:::o;52606:179::-;52746:31;52742:1;52734:6;52730:14;52723:55;52712:73;:::o;52791:172::-;52931:24;52927:1;52919:6;52915:14;52908:48;52897:66;:::o;52969:122::-;53042:24;53060:5;53042:24;:::i;:::-;53035:5;53032:35;53022:2;;53081:1;53078;53071:12;53022:2;53012:79;:::o;53097:116::-;53167:21;53182:5;53167:21;:::i;:::-;53160:5;53157:32;53147:2;;53203:1;53200;53193:12;53147:2;53137:76;:::o;53219:120::-;53291:23;53308:5;53291:23;:::i;:::-;53284:5;53281:34;53271:2;;53329:1;53326;53319:12;53271:2;53261:78;:::o;53345:122::-;53418:24;53436:5;53418:24;:::i;:::-;53411:5;53408:35;53398:2;;53457:1;53454;53447:12;53398:2;53388:79;:::o
Swarm Source
ipfs://c2300c8b96a1f9e42a18469dcb276cdfcbae67ac4c02bacbe8b63d675c263339
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|