Token Smolizards
Overview ERC-721
Total Supply:
6,970 LIZARD
Holders:
2,496 addresses
Contract:
Balance
6 LIZARD
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Smolizard
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan.io on 2022-07-01 */ // SPDX-License-Identifier: MIT // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.14; contract protected { mapping (address => bool) is_auth; function authorized(address addy) public view returns(bool) { return is_auth[addy]; } function set_authorized(address addy, bool booly) public onlyAuth { is_auth[addy] = booly; } modifier onlyAuth() { require( is_auth[msg.sender] || msg.sender==owner, "not owner"); _; } address owner; modifier onlyOwner() { require(msg.sender==owner, "not owner"); _; } bool locked; modifier safe() { require(!locked, "reentrant"); locked = true; _; locked = false; } function change_owner(address new_owner) public onlyAuth { owner = new_owner; } receive() external payable {} fallback() external payable {} } /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // 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); // ============================== // IERC721 // ============================== /** * @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 be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev 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); // ============================== // IERC721Metadata // ============================== /** * @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); } pragma solidity ^0.8.14; interface IERC20 { /// @return decs The decimals of the token function decimals() external view returns(uint256 decs); /// @param _owner The address from which the balance will be retrieved /// @return balance the balance function balanceOf(address _owner) external view returns (uint256 balance); /// @notice send `_value` token to `_to` from `msg.sender` /// @param _to The address of the recipient /// @param _value The amount of token to be transferred /// @return success Whether the transfer was successful or not function transfer(address _to, uint256 _value) external returns (bool success); /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from` /// @param _from The address of the sender /// @param _to The address of the recipient /// @param _value The amount of token to be transferred /// @return success Whether the transfer was successful or not function transferFrom(address _from, address _to, uint256 _value) external returns (bool success); /// @notice `msg.sender` approves `_addr` to spend `_value` tokens /// @param _spender The address of the account able to transfer the tokens /// @param _value The amount of wei to be approved for transfer /// @return success Whether the approval was successful or not function approve(address _spender, uint256 _value) external returns (bool success); /// @param _owner The address of the account owning tokens /// @param _spender The address of the account able to transfer the tokens /// @return remaining Amount of remaining tokens allowed to spent function allowance(address _owner, address _spender) external view returns (uint256 remaining); event Transfer(address indexed _from, address indexed _to, uint256 _value); event Approval(address indexed _owner, address indexed _spender, uint256 _value); } pragma solidity ^0.8.14; abstract contract ERC721E is IERC721A, protected { struct OnChainMetadata { string SVG_Image; // Optional string Image_Uri; // Optional (has priority) string[] properties; mapping(string => string) attributes; // properties -> attributes } mapping(uint => OnChainMetadata) Token_Metadata; // tokenID -> metadata /* tokenURI can be set as https://apiurl.com/retrieve?nft=0xcontractaddress&id=tokenID The API will contain a web3 call with ERC721E abi contract and the below method returning ERC721 compatible json with imageURI being the url or the svg based on content */ function setMetadata(string memory SVG_Image, string memory Image_Uri, string[] memory properties, string[] memory attributes, uint CurrentIndex) internal { Token_Metadata[CurrentIndex].Image_Uri = Image_Uri; Token_Metadata[CurrentIndex].SVG_Image = SVG_Image; Token_Metadata[CurrentIndex].properties = properties; for (uint i; i < attributes.length; i++) { Token_Metadata[CurrentIndex].attributes[properties[i]] = attributes[i]; } } function retrieveMetadata(uint tokenID) public view returns(string memory SVG, string memory URI, string[] memory properties, string[] memory attributes) { string memory _svg = Token_Metadata[tokenID].SVG_Image; string memory _uri = Token_Metadata[tokenID].Image_Uri; string[] memory _properties = Token_Metadata[tokenID].properties; string[] memory _attributes; for(uint a; a < properties.length; a++) { _attributes[a] = (Token_Metadata[tokenID].attributes[properties[a]]); } return(_svg, _uri, _properties, _attributes); } } /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /**************************************************************** Smolizard Library for efficient types management *****************************************************************/ library SmolData { struct MINTER { uint minted_number; bool is_whitelisted; uint[] minted_ids; uint last_mint; } } /**************************************************************** Agile Minters Management and useful types for Smolizard managed externally *****************************************************************/ contract SmolMinters is protected { /* ---------------------------------------------------------------- TYPES ---------------------------------------------------------------- */ address public Magic = 0x539bdE0d7Dbd336b79148AA742883198BBF60342; // mainnet // 0x539bdE0d7Dbd336b79148AA742883198BBF60342; IERC20 Magic_Token = IERC20(Magic); uint required_no_decimals = 20; uint required_tokens = required_no_decimals * (10 ** (Magic_Token.decimals())); uint public MAX_NUMBER = 1; uint public MAX_MINTING = 6969; using SmolData for SmolData.MINTER; mapping(address => SmolData.MINTER) public minters; string base_uri; string external_uri; bool on_chain_metadata; function set_max_minting(uint _max_) public onlyAuth { MAX_MINTING = _max_; } function set_on_chain_metadata(bool on_chain) public onlyAuth { on_chain_metadata = on_chain; } function set_whitelist(address actor, bool is_whitelisted_) public onlyAuth { minters[actor].is_whitelisted = is_whitelisted_; } function set_whitelist_bulk(address[] memory actors) public onlyAuth { require(actors.length > 1, "This function accepts bulk addresses"); for(uint i; i < actors.length; i++) { minters[actors[i]].is_whitelisted = true; } } function get_owned_nfts(address actor) public view returns (uint[] memory _ids_) { return minters[actor].minted_ids; } function get_required_token_balance(address actor) public view returns (uint _balance_) { return Magic_Token.balanceOf(actor); } function is_allowed_on_required_token(address actor) public view returns (bool allowed) { if(Magic_Token.allowance(actor, address(this)) >= required_tokens) { return true; } else { return false; } } function set_required_tokens(uint tokens_no_decimals) public onlyAuth { required_no_decimals = tokens_no_decimals; required_tokens = required_no_decimals * (10 ** (Magic_Token.decimals())); } function set_minting_token(address token) public onlyAuth { Magic = token; Magic_Token = IERC20(Magic); } function set_minting_max_number(uint _MAX_) public onlyAuth { MAX_NUMBER = _MAX_; } function retrieve_payments() public onlyAuth { Magic_Token.transfer(msg.sender, Magic_Token.balanceOf(address(this))); } function retrieve_native() public onlyAuth { (bool sent,) =msg.sender.call{value: (address(this).balance)}(""); require(sent, "Not sent"); } } /**************************************************************** ERC721E: Extending ERC721A Standard with on chain metadata *****************************************************************/ /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract Smolizard is ERC721E, SmolMinters { /* ---------------------------------------------------------------- IMPLEMENTATION ---------------------------------------------------------------- */ // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); owner = msg.sender; is_auth[owner] = true; minters[owner].is_whitelisted = true; _mint(owner, 1); } mapping(address => bool) public is_blacklisted; /** * @dev Public mint endpoint */ function mint() public safe { address actor = msg.sender; require(!is_blacklisted[actor], "Blacklisted"); require(_currentIndex <= MAX_MINTING, "Minting ended"); if(minters[actor].is_whitelisted) { if(block.timestamp < (minters[actor].last_mint + 3 days)) { require(minters[actor].minted_number < 1, "Already minted"); } } else { require(minters[actor].minted_number < 1, "Already minted"); } if(!(minters[actor].is_whitelisted)) { require(is_allowed_on_required_token(actor), "Allo wance not set"); require(get_required_token_balance(actor) >= required_tokens, "Not enough required tokens"); Magic_Token.transferFrom(actor, address(this), required_tokens); } minters[actor].last_mint = block.timestamp; minters[actor].minted_number += 1; _mint(actor, 1); } function side_mint(uint quantity, address to) public onlyAuth { _mint(to, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint quantity) internal { uint256 startTokenId = _currentIndex; if (_addressToUint256(to) == 0) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() public view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address _owner) public view override returns (uint256) { if (_addressToUint256(_owner) == 0) revert BalanceQueryForZeroAddress(); return _packedAddressData[_owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address _owner) internal view returns (uint256) { return (_packedAddressData[_owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address _owner) internal view returns (uint256) { return (_packedAddressData[_owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address _owner) internal view returns (uint64) { return uint64(_packedAddressData[_owner] >> BITPOS_AUX); } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address _owner, uint64 aux) internal { uint256 packed = _packedAddressData[_owner]; uint256 auxCasted; assembly { // Cast aux without masking. auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[_owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { if(!on_chain_metadata) { return base_uri; } else { return external_uri; } } function _externalURI() public view returns(string memory) { return external_uri; } function set_base_uri(string memory base) public onlyAuth { base_uri = base; if(!on_chain_metadata) { external_uri = base; } } function set_external_uri(string memory _external) public onlyAuth { external_uri = _external; } /** * @dev Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address _owner = address(uint160(_packedOwnershipOf(tokenId))); if (to == _owner) revert ApprovalToCurrentOwner(); if (_msgSenderERC721A() != _owner) if (!isApprovedForAll(_owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(_owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address _owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[_owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } function set_blacklist(address actor, bool booly) public onlyAuth { is_blacklisted[actor] = booly; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); require(!is_blacklisted[from] && !is_blacklisted[to], "Blacklisted"); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); address approvedAddress = _tokenApprovals[tokenId]; bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || approvedAddress == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (_addressToUint256(to) == 0) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. if (_addressToUint256(approvedAddress) != 0) { delete _tokenApprovals[tokenId]; } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); address approvedAddress = _tokenApprovals[tokenId]; if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || approvedAddress == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. if (_addressToUint256(approvedAddress) != 0) { delete _tokenApprovals[tokenId]; } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(from) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_BURNED | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"MAX_MINTING","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NUMBER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Magic","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_externalURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"}],"name":"authorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"new_owner","type":"address"}],"name":"change_owner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"actor","type":"address"}],"name":"get_owned_nfts","outputs":[{"internalType":"uint256[]","name":"_ids_","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"actor","type":"address"}],"name":"get_required_token_balance","outputs":[{"internalType":"uint256","name":"_balance_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"actor","type":"address"}],"name":"is_allowed_on_required_token","outputs":[{"internalType":"bool","name":"allowed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"is_blacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"uint256","name":"minted_number","type":"uint256"},{"internalType":"bool","name":"is_whitelisted","type":"bool"},{"internalType":"uint256","name":"last_mint","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"retrieveMetadata","outputs":[{"internalType":"string","name":"SVG","type":"string"},{"internalType":"string","name":"URI","type":"string"},{"internalType":"string[]","name":"properties","type":"string[]"},{"internalType":"string[]","name":"attributes","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"retrieve_native","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"retrieve_payments","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"},{"internalType":"bool","name":"booly","type":"bool"}],"name":"set_authorized","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"base","type":"string"}],"name":"set_base_uri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"actor","type":"address"},{"internalType":"bool","name":"booly","type":"bool"}],"name":"set_blacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_external","type":"string"}],"name":"set_external_uri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max_","type":"uint256"}],"name":"set_max_minting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MAX_","type":"uint256"}],"name":"set_minting_max_number","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"set_minting_token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"on_chain","type":"bool"}],"name":"set_on_chain_metadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens_no_decimals","type":"uint256"}],"name":"set_required_tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"actor","type":"address"},{"internalType":"bool","name":"is_whitelisted_","type":"bool"}],"name":"set_whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"actors","type":"address[]"}],"name":"set_whitelist_bulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"side_mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060408190526003805473539bde0d7dbd336b79148aa742883198bbf603426001600160a01b031991821681179092556004805490911682178155601460055563313ce56760e01b8352909163313ce5679160849160209181865afa1580156200006e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009491906200025a565b620000a190600a62000389565b600554620000b091906200039e565b6006556001600755611b39600855348015620000cb57600080fd5b50604051620030a7380380620030a7833981016040819052620000ee916200048d565b600f620000fc838262000585565b5060106200010b828262000585565b506000600d55600180546001600160a01b031916339081178255600090815260208181526040808320805460ff19908116861790915584546001600160a01b03908116855260099093529220830180549092168317909155815462000173929116906200017b565b505062000651565b600d54826000036200019f57604051622e076360e81b815260040160405180910390fd5b81600003620001c15760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660009081526012602090815260408083208054680100000000000000018702019055838352601190915290204260a01b84176001841460e11b179055808083015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082106200020c5750600d555b505050565b6000602082840312156200026d57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620002cb578160001904821115620002af57620002af62000274565b80851615620002bd57918102915b93841c93908002906200028f565b509250929050565b600082620002e45750600162000383565b81620002f35750600062000383565b81600181146200030c5760028114620003175762000337565b600191505062000383565b60ff8411156200032b576200032b62000274565b50506001821b62000383565b5060208310610133831016604e8410600b84101617156200035c575081810a62000383565b6200036883836200028a565b80600019048211156200037f576200037f62000274565b0290505b92915050565b6000620003978383620002d3565b9392505050565b6000816000190483118215151615620003bb57620003bb62000274565b500290565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620003e857600080fd5b81516001600160401b0380821115620004055762000405620003c0565b604051601f8301601f19908116603f01168101908282118183101715620004305762000430620003c0565b816040528381526020925086838588010111156200044d57600080fd5b600091505b8382101562000471578582018301518183018401529082019062000452565b83821115620004835760008385830101525b9695505050505050565b60008060408385031215620004a157600080fd5b82516001600160401b0380821115620004b957600080fd5b620004c786838701620003d6565b93506020850151915080821115620004de57600080fd5b50620004ed85828601620003d6565b9150509250929050565b600181811c908216806200050c57607f821691505b6020821081036200052d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200025557600081815260208120601f850160051c810160208610156200055c5750805b601f850160051c820191505b818110156200057d5782815560010162000568565b505050505050565b81516001600160401b03811115620005a157620005a1620003c0565b620005b981620005b28454620004f7565b8462000533565b602080601f831160018114620005f15760008415620005d85750858301515b600019600386901b1c1916600185901b1785556200057d565b600085815260208120601f198616915b82811015620006225788860151825594840194600190910190840162000601565b5085821015620006415787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612a4680620006616000396000f3fe60806040526004361061023d5760003560e01c80639bab80591161012d578063c10f47c4116100b0578063e495d4e711610077578063e495d4e7146106fd578063e985e9c51461071d578063ed30f0bc1461073d578063f00c119d1461075d578063f46eccc414610772578063fea9b572146107cc57005b8063c10f47c41461064d578063c87b56dd1461066d578063d57563611461068d578063da4b81ee146106ad578063dc921bc5146106dd57005b8063b200107c116100f4578063b200107c14610594578063b88d4fde146105b4578063b9181611146105d4578063bd7283631461060d578063bfa9f25e1461062d57005b80639bab8059146104f1578063a22cb46514610511578063a84c0e6714610531578063ae32d9db1461055e578063af1c52111461057457005b80632bfe8742116101c0578063736bf59111610187578063736bf59114610452578063737cc43c146104675780637e9254ff146104875780638efd2e7d146104a757806392aa3e74146104bc57806395d89b41146104dc57005b80632bfe8742146103bd57806341d3b22a146103dd57806342842e0e146103f25780636352211e1461041257806370a082311461043257005b80631794e95a116102045780631794e95a1461030a57806318160ddd1461033a5780631962faec1461035d57806323b872dd1461037d578063253c8bd41461039d57005b806301ffc9a71461024657806306fdde031461027b578063081812fc1461029d578063095ea7b3146102d55780631249c58b146102f557005b3661024457005b005b34801561025257600080fd5b50610266610261366004612173565b6107e2565b60405190151581526020015b60405180910390f35b34801561028757600080fd5b50610290610834565b60405161027291906121e8565b3480156102a957600080fd5b506102bd6102b83660046121fb565b6108c6565b6040516001600160a01b039091168152602001610272565b3480156102e157600080fd5b506102446102f036600461222b565b61090a565b34801561030157600080fd5b506102446109dc565b34801561031657600080fd5b50610266610325366004612255565b60156020526000908152604090205460ff1681565b34801561034657600080fd5b50600e54600d54035b604051908152602001610272565b34801561036957600080fd5b50610266610378366004612255565b610d74565b34801561038957600080fd5b50610244610398366004612270565b610e0c565b3480156103a957600080fd5b506102446103b8366004612255565b610e1c565b3480156103c957600080fd5b506102446103d83660046122ba565b610e82565b3480156103e957600080fd5b50610290610ef1565b3480156103fe57600080fd5b5061024461040d366004612270565b610f00565b34801561041e57600080fd5b506102bd61042d3660046121fb565b610f1b565b34801561043e57600080fd5b5061034f61044d366004612255565b610f26565b34801561045e57600080fd5b50600d5461034f565b34801561047357600080fd5b506102446104823660046122f1565b610f6f565b34801561049357600080fd5b506102446104a23660046121fb565b610fc1565b3480156104b357600080fd5b5061024461100a565b3480156104c857600080fd5b506102446104d73660046121fb565b6110d4565b3480156104e857600080fd5b5061029061111d565b3480156104fd57600080fd5b5061024461050c3660046121fb565b61112c565b34801561051d57600080fd5b5061024461052c3660046122ba565b6111fe565b34801561053d57600080fd5b5061055161054c366004612255565b611293565b604051610272919061231d565b34801561056a57600080fd5b5061034f60085481565b34801561058057600080fd5b5061024461058f366004612400565b611302565b3480156105a057600080fd5b506003546102bd906001600160a01b031681565b3480156105c057600080fd5b506102446105cf366004612449565b611369565b3480156105e057600080fd5b506102666105ef366004612255565b6001600160a01b031660009081526020819052604090205460ff1690565b34801561061957600080fd5b5061034f610628366004612255565b6113b3565b34801561063957600080fd5b506102446106483660046124c5565b611427565b34801561065957600080fd5b50610244610668366004612400565b61147e565b34801561067957600080fd5b506102906106883660046121fb565b6114ce565b34801561069957600080fd5b506102446106a83660046122ba565b611552565b3480156106b957600080fd5b506106cd6106c83660046121fb565b6115c1565b6040516102729493929190612537565b3480156106e957600080fd5b506102446106f836600461258f565b611914565b34801561070957600080fd5b506102446107183660046122ba565b611a20565b34801561072957600080fd5b5061026661073836600461263c565b611a92565b34801561074957600080fd5b50610244610758366004612255565b611ac0565b34801561076957600080fd5b50610244611b30565b34801561077e57600080fd5b506107b161078d366004612255565b600960205260009081526040902080546001820154600390920154909160ff169083565b60408051938452911515602084015290820152606001610272565b3480156107d857600080fd5b5061034f60075481565b60006301ffc9a760e01b6001600160e01b03198316148061081357506380ac58cd60e01b6001600160e01b03198316145b8061082e5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600f805461084390612666565b80601f016020809104026020016040519081016040528092919081815260200182805461086f90612666565b80156108bc5780601f10610891576101008083540402835291602001916108bc565b820191906000526020600020905b81548152906001019060200180831161089f57829003601f168201915b5050505050905090565b60006108d182611c5a565b6108ee576040516333d1c03960e21b815260040160405180910390fd5b506000908152601360205260409020546001600160a01b031690565b600061091582611c82565b9050806001600160a01b0316836001600160a01b0316036109495760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610980576109638133611a92565b610980576040516367d9dca160e11b815260040160405180910390fd5b60008281526013602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600154600160a01b900460ff1615610a275760405162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b60448201526064015b60405180910390fd5b6001805460ff60a01b1916600160a01b1790553360008181526015602052604090205460ff1615610a885760405162461bcd60e51b815260206004820152600b60248201526a109b1858dadb1a5cdd195960aa1b6044820152606401610a1e565b600854600d541115610acc5760405162461bcd60e51b815260206004820152600d60248201526c135a5b9d1a5b99c8195b991959609a1b6044820152606401610a1e565b6001600160a01b03811660009081526009602052604090206001015460ff1615610b7e576001600160a01b038116600090815260096020526040902060030154610b19906203f4806126b6565b421015610b79576001600160a01b038116600090815260096020526040902054600111610b795760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b6044820152606401610a1e565b610bd7565b6001600160a01b038116600090815260096020526040902054600111610bd75760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b6044820152606401610a1e565b6001600160a01b03811660009081526009602052604090206001015460ff16610d2457610c0381610d74565b610c455760405162461bcd60e51b8152602060048201526013602482015272105b1b1bc8081dd85b98d9481b9bdd081cd95d606a1b6044820152606401610a1e565b600654610c51826113b3565b1015610c9f5760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420656e6f75676820726571756972656420746f6b656e730000000000006044820152606401610a1e565b600480546006546040516323b872dd60e01b81526001600160a01b038581169482019490945230602482015260448101919091529116906323b872dd906064016020604051808303816000875af1158015610cfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2291906126ce565b505b6001600160a01b0381166000908152600960205260408120426003820155805460019290610d539084906126b6565b90915550610d649050816001611ce9565b506001805460ff60a01b19169055565b60065460048054604051636eb1769f60e11b81526001600160a01b0385811693820193909352306024820152600093929091169063dd62ed3e90604401602060405180830381865afa158015610dce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df291906126eb565b10610dff57506001919050565b506000919050565b919050565b610e17838383611dc4565b505050565b3360009081526020819052604090205460ff1680610e4457506001546001600160a01b031633145b610e605760405162461bcd60e51b8152600401610a1e90612704565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526020819052604090205460ff1680610eaa57506001546001600160a01b031633145b610ec65760405162461bcd60e51b8152600401610a1e90612704565b6001600160a01b03919091166000908152602081905260409020805460ff1916911515919091179055565b6060600b805461084390612666565b610e1783838360405180602001604052806000815250611369565b600061082e82611c82565b600081600003610f49576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526012602052604090205467ffffffffffffffff1690565b3360009081526020819052604090205460ff1680610f9757506001546001600160a01b031633145b610fb35760405162461bcd60e51b8152600401610a1e90612704565b610fbd8183611ce9565b5050565b3360009081526020819052604090205460ff1680610fe957506001546001600160a01b031633145b6110055760405162461bcd60e51b8152600401610a1e90612704565b600755565b3360009081526020819052604090205460ff168061103257506001546001600160a01b031633145b61104e5760405162461bcd60e51b8152600401610a1e90612704565b604051600090339047908381818185875af1925050503d8060008114611090576040519150601f19603f3d011682016040523d82523d6000602084013e611095565b606091505b50509050806110d15760405162461bcd60e51b8152602060048201526008602482015267139bdd081cd95b9d60c21b6044820152606401610a1e565b50565b3360009081526020819052604090205460ff16806110fc57506001546001600160a01b031633145b6111185760405162461bcd60e51b8152600401610a1e90612704565b600855565b60606010805461084390612666565b3360009081526020819052604090205460ff168061115457506001546001600160a01b031633145b6111705760405162461bcd60e51b8152600401610a1e90612704565b6005819055600480546040805163313ce56760e01b815290516001600160a01b039092169263313ce5679282820192602092908290030181865afa1580156111bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e091906126eb565b6111eb90600a61280b565b6005546111f89190612817565b60065550565b336001600160a01b038316036112275760405163b06307db60e01b815260040160405180910390fd5b3360008181526014602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6001600160a01b0381166000908152600960209081526040918290206002018054835181840281018401909452808452606093928301828280156112f657602002820191906000526020600020905b8154815260200190600101908083116112e2575b50505050509050919050565b3360009081526020819052604090205460ff168061132a57506001546001600160a01b031633145b6113465760405162461bcd60e51b8152600401610a1e90612704565b600a611352828261287c565b50600c5460ff166110d157600b610fbd828261287c565b611374848484611dc4565b6001600160a01b0383163b156113ad5761139084848484611ffb565b6113ad576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b600480546040516370a0823160e01b81526001600160a01b0384811693820193909352600092909116906370a0823190602401602060405180830381865afa158015611403573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082e91906126eb565b3360009081526020819052604090205460ff168061144f57506001546001600160a01b031633145b61146b5760405162461bcd60e51b8152600401610a1e90612704565b600c805460ff1916911515919091179055565b3360009081526020819052604090205460ff16806114a657506001546001600160a01b031633145b6114c25760405162461bcd60e51b8152600401610a1e90612704565b600b610fbd828261287c565b60606114d982611c5a565b6114f657604051630a14c4b560e41b815260040160405180910390fd5b60006115006120e7565b90508051600003611520576040518060200160405280600081525061154b565b8061152a8461210e565b60405160200161153b92919061293c565b6040516020818303038152906040525b9392505050565b3360009081526020819052604090205460ff168061157a57506001546001600160a01b031633145b6115965760405162461bcd60e51b8152600401610a1e90612704565b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b6000818152600260205260408120805460609283928392839291906115e590612666565b80601f016020809104026020016040519081016040528092919081815260200182805461161190612666565b801561165e5780601f106116335761010080835404028352916020019161165e565b820191906000526020600020905b81548152906001019060200180831161164157829003601f168201915b50505050509050600060026000888152602001908152602001600020600101805461168890612666565b80601f01602080910402602001604051908101604052809291908181526020018280546116b490612666565b80156117015780601f106116d657610100808354040283529160200191611701565b820191906000526020600020905b8154815290600101906020018083116116e457829003601f168201915b50505050509050600060026000898152602001908152602001600020600201805480602002602001604051908101604052809291908181526020016000905b828210156117ec57838290600052602060002001805461175f90612666565b80601f016020809104026020016040519081016040528092919081815260200182805461178b90612666565b80156117d85780601f106117ad576101008083540402835291602001916117d8565b820191906000526020600020905b8154815290600101906020018083116117bb57829003601f168201915b505050505081526020019060010190611740565b505050509050606060005b865181101561190457600260008b81526020019081526020016000206003018782815181106118285761182861296b565b602002602001015160405161183d9190612981565b9081526020016040518091039020805461185690612666565b80601f016020809104026020016040519081016040528092919081815260200182805461188290612666565b80156118cf5780601f106118a4576101008083540402835291602001916118cf565b820191906000526020600020905b8154815290600101906020018083116118b257829003601f168201915b50505050508282815181106118e6576118e661296b565b602002602001018190525080806118fc9061299d565b9150506117f7565b5092989197509550909350915050565b3360009081526020819052604090205460ff168061193c57506001546001600160a01b031633145b6119585760405162461bcd60e51b8152600401610a1e90612704565b60018151116119b55760405162461bcd60e51b8152602060048201526024808201527f546869732066756e6374696f6e20616363657074732062756c6b2061646472656044820152637373657360e01b6064820152608401610a1e565b60005b8151811015610fbd576001600960008484815181106119d9576119d961296b565b6020908102919091018101516001600160a01b03168252810191909152604001600020600101805460ff191691151591909117905580611a188161299d565b9150506119b8565b3360009081526020819052604090205460ff1680611a4857506001546001600160a01b031633145b611a645760405162461bcd60e51b8152600401610a1e90612704565b6001600160a01b03919091166000908152600960205260409020600101805460ff1916911515919091179055565b6001600160a01b03918216600090815260146020908152604080832093909416825291909152205460ff1690565b3360009081526020819052604090205460ff1680611ae857506001546001600160a01b031633145b611b045760405162461bcd60e51b8152600401610a1e90612704565b600380546001600160a01b039092166001600160a01b0319928316811790915560048054909216179055565b3360009081526020819052604090205460ff1680611b5857506001546001600160a01b031633145b611b745760405162461bcd60e51b8152600401610a1e90612704565b600480546040516370a0823160e01b815230928101929092526001600160a01b03169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015611bc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611beb91906126eb565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611c36573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d191906126ce565b6000600d548210801561082e575050600090815260116020526040902054600160e01b161590565b600081600d54811015611cd05760008181526011602052604081205490600160e01b82169003611cce575b8060000361154b575060001901600081815260116020526040902054611cad565b505b604051636f96cda160e11b815260040160405180910390fd5b600d5482600003611d0c57604051622e076360e81b815260040160405180910390fd5b81600003611d2d5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660009081526012602090815260408083208054680100000000000000018702019055838352601190915290204260a01b84176001841460e11b179055808083015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210611d785750600d55505050565b6000611dcf82611c82565b6001600160a01b03851660009081526015602052604090205490915060ff16158015611e1457506001600160a01b03831660009081526015602052604090205460ff16155b611e4e5760405162461bcd60e51b815260206004820152600b60248201526a109b1858dadb1a5cdd195960aa1b6044820152606401610a1e565b836001600160a01b0316816001600160a01b031614611e7f5760405162a1148160e81b815260040160405180910390fd5b6000828152601360205260408120546001600160a01b0390811691908616331480611eaf5750611eaf8633611a92565b80611ec257506001600160a01b03821633145b905080611ee257604051632ce44b5f60e11b815260040160405180910390fd5b84600003611f0357604051633a954ecd60e21b815260040160405180910390fd5b8115611f2657600084815260136020526040902080546001600160a01b03191690555b6001600160a01b038681166000908152601260209081526040808320805460001901905592881682528282208054600101905586825260119052908120600160e11b4260a01b8817811790915584169003611fb157600184016000818152601160205260408120549003611faf57600d548114611faf5760008181526011602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906120309033908990889088906004016129b6565b6020604051808303816000875af192505050801561206b575060408051601f3d908101601f19168201909252612068918101906129f3565b60015b6120c9573d808015612099576040519150601f19603f3d011682016040523d82523d6000602084013e61209e565b606091505b5080516000036120c1576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b600c5460609060ff1661210157600a805461084390612666565b600b805461084390612666565b604080516080810191829052607f0190826030600a8206018353600a90045b801561214b57600183039250600a81066030018353600a900461212d565b50819003601f19909101908152919050565b6001600160e01b0319811681146110d157600080fd5b60006020828403121561218557600080fd5b813561154b8161215d565b60005b838110156121ab578181015183820152602001612193565b838111156113ad5750506000910152565b600081518084526121d4816020860160208601612190565b601f01601f19169290920160200192915050565b60208152600061154b60208301846121bc565b60006020828403121561220d57600080fd5b5035919050565b80356001600160a01b0381168114610e0757600080fd5b6000806040838503121561223e57600080fd5b61224783612214565b946020939093013593505050565b60006020828403121561226757600080fd5b61154b82612214565b60008060006060848603121561228557600080fd5b61228e84612214565b925061229c60208501612214565b9150604084013590509250925092565b80151581146110d157600080fd5b600080604083850312156122cd57600080fd5b6122d683612214565b915060208301356122e6816122ac565b809150509250929050565b6000806040838503121561230457600080fd5b8235915061231460208401612214565b90509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561235557835183529284019291840191600101612339565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156123a0576123a0612361565b604052919050565b600067ffffffffffffffff8311156123c2576123c2612361565b6123d5601f8401601f1916602001612377565b90508281528383830111156123e957600080fd5b828260208301376000602084830101529392505050565b60006020828403121561241257600080fd5b813567ffffffffffffffff81111561242957600080fd5b8201601f8101841361243a57600080fd5b6120df848235602084016123a8565b6000806000806080858703121561245f57600080fd5b61246885612214565b935061247660208601612214565b925060408501359150606085013567ffffffffffffffff81111561249957600080fd5b8501601f810187136124aa57600080fd5b6124b9878235602084016123a8565b91505092959194509250565b6000602082840312156124d757600080fd5b813561154b816122ac565b600081518084526020808501808196508360051b8101915082860160005b8581101561252a5782840389526125188483516121bc565b98850198935090840190600101612500565b5091979650505050505050565b60808152600061254a60808301876121bc565b828103602084015261255c81876121bc565b9050828103604084015261257081866124e2565b9050828103606084015261258481856124e2565b979650505050505050565b600060208083850312156125a257600080fd5b823567ffffffffffffffff808211156125ba57600080fd5b818501915085601f8301126125ce57600080fd5b8135818111156125e0576125e0612361565b8060051b91506125f1848301612377565b818152918301840191848101908884111561260b57600080fd5b938501935b838510156126305761262185612214565b82529385019390850190612610565b98975050505050505050565b6000806040838503121561264f57600080fd5b61265883612214565b915061231460208401612214565b600181811c9082168061267a57607f821691505b60208210810361269a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156126c9576126c96126a0565b500190565b6000602082840312156126e057600080fd5b815161154b816122ac565b6000602082840312156126fd57600080fd5b5051919050565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b600181815b80851115612762578160001904821115612748576127486126a0565b8085161561275557918102915b93841c939080029061272c565b509250929050565b6000826127795750600161082e565b816127865750600061082e565b816001811461279c57600281146127a6576127c2565b600191505061082e565b60ff8411156127b7576127b76126a0565b50506001821b61082e565b5060208310610133831016604e8410600b84101617156127e5575081810a61082e565b6127ef8383612727565b8060001904821115612803576128036126a0565b029392505050565b600061154b838361276a565b6000816000190483118215151615612831576128316126a0565b500290565b601f821115610e1757600081815260208120601f850160051c8101602086101561285d5750805b601f850160051c820191505b81811015611ff357828155600101612869565b815167ffffffffffffffff81111561289657612896612361565b6128aa816128a48454612666565b84612836565b602080601f8311600181146128df57600084156128c75750858301515b600019600386901b1c1916600185901b178555611ff3565b600085815260208120601f198616915b8281101561290e578886015182559484019460019091019084016128ef565b508582101561292c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000835161294e818460208801612190565b835190830190612962818360208801612190565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b60008251612993818460208701612190565b9190910192915050565b6000600182016129af576129af6126a0565b5060010190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906129e9908301846121bc565b9695505050505050565b600060208284031215612a0557600080fd5b815161154b8161215d56fea2646970667358221220dcf750ecebe042db9c2f989f00f424fe286556080d56b3408e025daf450a1e7864736f6c634300080f003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a536d6f6c697a617264730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064c495a4152440000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061023d5760003560e01c80639bab80591161012d578063c10f47c4116100b0578063e495d4e711610077578063e495d4e7146106fd578063e985e9c51461071d578063ed30f0bc1461073d578063f00c119d1461075d578063f46eccc414610772578063fea9b572146107cc57005b8063c10f47c41461064d578063c87b56dd1461066d578063d57563611461068d578063da4b81ee146106ad578063dc921bc5146106dd57005b8063b200107c116100f4578063b200107c14610594578063b88d4fde146105b4578063b9181611146105d4578063bd7283631461060d578063bfa9f25e1461062d57005b80639bab8059146104f1578063a22cb46514610511578063a84c0e6714610531578063ae32d9db1461055e578063af1c52111461057457005b80632bfe8742116101c0578063736bf59111610187578063736bf59114610452578063737cc43c146104675780637e9254ff146104875780638efd2e7d146104a757806392aa3e74146104bc57806395d89b41146104dc57005b80632bfe8742146103bd57806341d3b22a146103dd57806342842e0e146103f25780636352211e1461041257806370a082311461043257005b80631794e95a116102045780631794e95a1461030a57806318160ddd1461033a5780631962faec1461035d57806323b872dd1461037d578063253c8bd41461039d57005b806301ffc9a71461024657806306fdde031461027b578063081812fc1461029d578063095ea7b3146102d55780631249c58b146102f557005b3661024457005b005b34801561025257600080fd5b50610266610261366004612173565b6107e2565b60405190151581526020015b60405180910390f35b34801561028757600080fd5b50610290610834565b60405161027291906121e8565b3480156102a957600080fd5b506102bd6102b83660046121fb565b6108c6565b6040516001600160a01b039091168152602001610272565b3480156102e157600080fd5b506102446102f036600461222b565b61090a565b34801561030157600080fd5b506102446109dc565b34801561031657600080fd5b50610266610325366004612255565b60156020526000908152604090205460ff1681565b34801561034657600080fd5b50600e54600d54035b604051908152602001610272565b34801561036957600080fd5b50610266610378366004612255565b610d74565b34801561038957600080fd5b50610244610398366004612270565b610e0c565b3480156103a957600080fd5b506102446103b8366004612255565b610e1c565b3480156103c957600080fd5b506102446103d83660046122ba565b610e82565b3480156103e957600080fd5b50610290610ef1565b3480156103fe57600080fd5b5061024461040d366004612270565b610f00565b34801561041e57600080fd5b506102bd61042d3660046121fb565b610f1b565b34801561043e57600080fd5b5061034f61044d366004612255565b610f26565b34801561045e57600080fd5b50600d5461034f565b34801561047357600080fd5b506102446104823660046122f1565b610f6f565b34801561049357600080fd5b506102446104a23660046121fb565b610fc1565b3480156104b357600080fd5b5061024461100a565b3480156104c857600080fd5b506102446104d73660046121fb565b6110d4565b3480156104e857600080fd5b5061029061111d565b3480156104fd57600080fd5b5061024461050c3660046121fb565b61112c565b34801561051d57600080fd5b5061024461052c3660046122ba565b6111fe565b34801561053d57600080fd5b5061055161054c366004612255565b611293565b604051610272919061231d565b34801561056a57600080fd5b5061034f60085481565b34801561058057600080fd5b5061024461058f366004612400565b611302565b3480156105a057600080fd5b506003546102bd906001600160a01b031681565b3480156105c057600080fd5b506102446105cf366004612449565b611369565b3480156105e057600080fd5b506102666105ef366004612255565b6001600160a01b031660009081526020819052604090205460ff1690565b34801561061957600080fd5b5061034f610628366004612255565b6113b3565b34801561063957600080fd5b506102446106483660046124c5565b611427565b34801561065957600080fd5b50610244610668366004612400565b61147e565b34801561067957600080fd5b506102906106883660046121fb565b6114ce565b34801561069957600080fd5b506102446106a83660046122ba565b611552565b3480156106b957600080fd5b506106cd6106c83660046121fb565b6115c1565b6040516102729493929190612537565b3480156106e957600080fd5b506102446106f836600461258f565b611914565b34801561070957600080fd5b506102446107183660046122ba565b611a20565b34801561072957600080fd5b5061026661073836600461263c565b611a92565b34801561074957600080fd5b50610244610758366004612255565b611ac0565b34801561076957600080fd5b50610244611b30565b34801561077e57600080fd5b506107b161078d366004612255565b600960205260009081526040902080546001820154600390920154909160ff169083565b60408051938452911515602084015290820152606001610272565b3480156107d857600080fd5b5061034f60075481565b60006301ffc9a760e01b6001600160e01b03198316148061081357506380ac58cd60e01b6001600160e01b03198316145b8061082e5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600f805461084390612666565b80601f016020809104026020016040519081016040528092919081815260200182805461086f90612666565b80156108bc5780601f10610891576101008083540402835291602001916108bc565b820191906000526020600020905b81548152906001019060200180831161089f57829003601f168201915b5050505050905090565b60006108d182611c5a565b6108ee576040516333d1c03960e21b815260040160405180910390fd5b506000908152601360205260409020546001600160a01b031690565b600061091582611c82565b9050806001600160a01b0316836001600160a01b0316036109495760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610980576109638133611a92565b610980576040516367d9dca160e11b815260040160405180910390fd5b60008281526013602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600154600160a01b900460ff1615610a275760405162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b60448201526064015b60405180910390fd5b6001805460ff60a01b1916600160a01b1790553360008181526015602052604090205460ff1615610a885760405162461bcd60e51b815260206004820152600b60248201526a109b1858dadb1a5cdd195960aa1b6044820152606401610a1e565b600854600d541115610acc5760405162461bcd60e51b815260206004820152600d60248201526c135a5b9d1a5b99c8195b991959609a1b6044820152606401610a1e565b6001600160a01b03811660009081526009602052604090206001015460ff1615610b7e576001600160a01b038116600090815260096020526040902060030154610b19906203f4806126b6565b421015610b79576001600160a01b038116600090815260096020526040902054600111610b795760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b6044820152606401610a1e565b610bd7565b6001600160a01b038116600090815260096020526040902054600111610bd75760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b6044820152606401610a1e565b6001600160a01b03811660009081526009602052604090206001015460ff16610d2457610c0381610d74565b610c455760405162461bcd60e51b8152602060048201526013602482015272105b1b1bc8081dd85b98d9481b9bdd081cd95d606a1b6044820152606401610a1e565b600654610c51826113b3565b1015610c9f5760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420656e6f75676820726571756972656420746f6b656e730000000000006044820152606401610a1e565b600480546006546040516323b872dd60e01b81526001600160a01b038581169482019490945230602482015260448101919091529116906323b872dd906064016020604051808303816000875af1158015610cfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2291906126ce565b505b6001600160a01b0381166000908152600960205260408120426003820155805460019290610d539084906126b6565b90915550610d649050816001611ce9565b506001805460ff60a01b19169055565b60065460048054604051636eb1769f60e11b81526001600160a01b0385811693820193909352306024820152600093929091169063dd62ed3e90604401602060405180830381865afa158015610dce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df291906126eb565b10610dff57506001919050565b506000919050565b919050565b610e17838383611dc4565b505050565b3360009081526020819052604090205460ff1680610e4457506001546001600160a01b031633145b610e605760405162461bcd60e51b8152600401610a1e90612704565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526020819052604090205460ff1680610eaa57506001546001600160a01b031633145b610ec65760405162461bcd60e51b8152600401610a1e90612704565b6001600160a01b03919091166000908152602081905260409020805460ff1916911515919091179055565b6060600b805461084390612666565b610e1783838360405180602001604052806000815250611369565b600061082e82611c82565b600081600003610f49576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526012602052604090205467ffffffffffffffff1690565b3360009081526020819052604090205460ff1680610f9757506001546001600160a01b031633145b610fb35760405162461bcd60e51b8152600401610a1e90612704565b610fbd8183611ce9565b5050565b3360009081526020819052604090205460ff1680610fe957506001546001600160a01b031633145b6110055760405162461bcd60e51b8152600401610a1e90612704565b600755565b3360009081526020819052604090205460ff168061103257506001546001600160a01b031633145b61104e5760405162461bcd60e51b8152600401610a1e90612704565b604051600090339047908381818185875af1925050503d8060008114611090576040519150601f19603f3d011682016040523d82523d6000602084013e611095565b606091505b50509050806110d15760405162461bcd60e51b8152602060048201526008602482015267139bdd081cd95b9d60c21b6044820152606401610a1e565b50565b3360009081526020819052604090205460ff16806110fc57506001546001600160a01b031633145b6111185760405162461bcd60e51b8152600401610a1e90612704565b600855565b60606010805461084390612666565b3360009081526020819052604090205460ff168061115457506001546001600160a01b031633145b6111705760405162461bcd60e51b8152600401610a1e90612704565b6005819055600480546040805163313ce56760e01b815290516001600160a01b039092169263313ce5679282820192602092908290030181865afa1580156111bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e091906126eb565b6111eb90600a61280b565b6005546111f89190612817565b60065550565b336001600160a01b038316036112275760405163b06307db60e01b815260040160405180910390fd5b3360008181526014602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6001600160a01b0381166000908152600960209081526040918290206002018054835181840281018401909452808452606093928301828280156112f657602002820191906000526020600020905b8154815260200190600101908083116112e2575b50505050509050919050565b3360009081526020819052604090205460ff168061132a57506001546001600160a01b031633145b6113465760405162461bcd60e51b8152600401610a1e90612704565b600a611352828261287c565b50600c5460ff166110d157600b610fbd828261287c565b611374848484611dc4565b6001600160a01b0383163b156113ad5761139084848484611ffb565b6113ad576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b600480546040516370a0823160e01b81526001600160a01b0384811693820193909352600092909116906370a0823190602401602060405180830381865afa158015611403573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082e91906126eb565b3360009081526020819052604090205460ff168061144f57506001546001600160a01b031633145b61146b5760405162461bcd60e51b8152600401610a1e90612704565b600c805460ff1916911515919091179055565b3360009081526020819052604090205460ff16806114a657506001546001600160a01b031633145b6114c25760405162461bcd60e51b8152600401610a1e90612704565b600b610fbd828261287c565b60606114d982611c5a565b6114f657604051630a14c4b560e41b815260040160405180910390fd5b60006115006120e7565b90508051600003611520576040518060200160405280600081525061154b565b8061152a8461210e565b60405160200161153b92919061293c565b6040516020818303038152906040525b9392505050565b3360009081526020819052604090205460ff168061157a57506001546001600160a01b031633145b6115965760405162461bcd60e51b8152600401610a1e90612704565b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b6000818152600260205260408120805460609283928392839291906115e590612666565b80601f016020809104026020016040519081016040528092919081815260200182805461161190612666565b801561165e5780601f106116335761010080835404028352916020019161165e565b820191906000526020600020905b81548152906001019060200180831161164157829003601f168201915b50505050509050600060026000888152602001908152602001600020600101805461168890612666565b80601f01602080910402602001604051908101604052809291908181526020018280546116b490612666565b80156117015780601f106116d657610100808354040283529160200191611701565b820191906000526020600020905b8154815290600101906020018083116116e457829003601f168201915b50505050509050600060026000898152602001908152602001600020600201805480602002602001604051908101604052809291908181526020016000905b828210156117ec57838290600052602060002001805461175f90612666565b80601f016020809104026020016040519081016040528092919081815260200182805461178b90612666565b80156117d85780601f106117ad576101008083540402835291602001916117d8565b820191906000526020600020905b8154815290600101906020018083116117bb57829003601f168201915b505050505081526020019060010190611740565b505050509050606060005b865181101561190457600260008b81526020019081526020016000206003018782815181106118285761182861296b565b602002602001015160405161183d9190612981565b9081526020016040518091039020805461185690612666565b80601f016020809104026020016040519081016040528092919081815260200182805461188290612666565b80156118cf5780601f106118a4576101008083540402835291602001916118cf565b820191906000526020600020905b8154815290600101906020018083116118b257829003601f168201915b50505050508282815181106118e6576118e661296b565b602002602001018190525080806118fc9061299d565b9150506117f7565b5092989197509550909350915050565b3360009081526020819052604090205460ff168061193c57506001546001600160a01b031633145b6119585760405162461bcd60e51b8152600401610a1e90612704565b60018151116119b55760405162461bcd60e51b8152602060048201526024808201527f546869732066756e6374696f6e20616363657074732062756c6b2061646472656044820152637373657360e01b6064820152608401610a1e565b60005b8151811015610fbd576001600960008484815181106119d9576119d961296b565b6020908102919091018101516001600160a01b03168252810191909152604001600020600101805460ff191691151591909117905580611a188161299d565b9150506119b8565b3360009081526020819052604090205460ff1680611a4857506001546001600160a01b031633145b611a645760405162461bcd60e51b8152600401610a1e90612704565b6001600160a01b03919091166000908152600960205260409020600101805460ff1916911515919091179055565b6001600160a01b03918216600090815260146020908152604080832093909416825291909152205460ff1690565b3360009081526020819052604090205460ff1680611ae857506001546001600160a01b031633145b611b045760405162461bcd60e51b8152600401610a1e90612704565b600380546001600160a01b039092166001600160a01b0319928316811790915560048054909216179055565b3360009081526020819052604090205460ff1680611b5857506001546001600160a01b031633145b611b745760405162461bcd60e51b8152600401610a1e90612704565b600480546040516370a0823160e01b815230928101929092526001600160a01b03169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015611bc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611beb91906126eb565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611c36573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d191906126ce565b6000600d548210801561082e575050600090815260116020526040902054600160e01b161590565b600081600d54811015611cd05760008181526011602052604081205490600160e01b82169003611cce575b8060000361154b575060001901600081815260116020526040902054611cad565b505b604051636f96cda160e11b815260040160405180910390fd5b600d5482600003611d0c57604051622e076360e81b815260040160405180910390fd5b81600003611d2d5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660009081526012602090815260408083208054680100000000000000018702019055838352601190915290204260a01b84176001841460e11b179055808083015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210611d785750600d55505050565b6000611dcf82611c82565b6001600160a01b03851660009081526015602052604090205490915060ff16158015611e1457506001600160a01b03831660009081526015602052604090205460ff16155b611e4e5760405162461bcd60e51b815260206004820152600b60248201526a109b1858dadb1a5cdd195960aa1b6044820152606401610a1e565b836001600160a01b0316816001600160a01b031614611e7f5760405162a1148160e81b815260040160405180910390fd5b6000828152601360205260408120546001600160a01b0390811691908616331480611eaf5750611eaf8633611a92565b80611ec257506001600160a01b03821633145b905080611ee257604051632ce44b5f60e11b815260040160405180910390fd5b84600003611f0357604051633a954ecd60e21b815260040160405180910390fd5b8115611f2657600084815260136020526040902080546001600160a01b03191690555b6001600160a01b038681166000908152601260209081526040808320805460001901905592881682528282208054600101905586825260119052908120600160e11b4260a01b8817811790915584169003611fb157600184016000818152601160205260408120549003611faf57600d548114611faf5760008181526011602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906120309033908990889088906004016129b6565b6020604051808303816000875af192505050801561206b575060408051601f3d908101601f19168201909252612068918101906129f3565b60015b6120c9573d808015612099576040519150601f19603f3d011682016040523d82523d6000602084013e61209e565b606091505b5080516000036120c1576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b600c5460609060ff1661210157600a805461084390612666565b600b805461084390612666565b604080516080810191829052607f0190826030600a8206018353600a90045b801561214b57600183039250600a81066030018353600a900461212d565b50819003601f19909101908152919050565b6001600160e01b0319811681146110d157600080fd5b60006020828403121561218557600080fd5b813561154b8161215d565b60005b838110156121ab578181015183820152602001612193565b838111156113ad5750506000910152565b600081518084526121d4816020860160208601612190565b601f01601f19169290920160200192915050565b60208152600061154b60208301846121bc565b60006020828403121561220d57600080fd5b5035919050565b80356001600160a01b0381168114610e0757600080fd5b6000806040838503121561223e57600080fd5b61224783612214565b946020939093013593505050565b60006020828403121561226757600080fd5b61154b82612214565b60008060006060848603121561228557600080fd5b61228e84612214565b925061229c60208501612214565b9150604084013590509250925092565b80151581146110d157600080fd5b600080604083850312156122cd57600080fd5b6122d683612214565b915060208301356122e6816122ac565b809150509250929050565b6000806040838503121561230457600080fd5b8235915061231460208401612214565b90509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561235557835183529284019291840191600101612339565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156123a0576123a0612361565b604052919050565b600067ffffffffffffffff8311156123c2576123c2612361565b6123d5601f8401601f1916602001612377565b90508281528383830111156123e957600080fd5b828260208301376000602084830101529392505050565b60006020828403121561241257600080fd5b813567ffffffffffffffff81111561242957600080fd5b8201601f8101841361243a57600080fd5b6120df848235602084016123a8565b6000806000806080858703121561245f57600080fd5b61246885612214565b935061247660208601612214565b925060408501359150606085013567ffffffffffffffff81111561249957600080fd5b8501601f810187136124aa57600080fd5b6124b9878235602084016123a8565b91505092959194509250565b6000602082840312156124d757600080fd5b813561154b816122ac565b600081518084526020808501808196508360051b8101915082860160005b8581101561252a5782840389526125188483516121bc565b98850198935090840190600101612500565b5091979650505050505050565b60808152600061254a60808301876121bc565b828103602084015261255c81876121bc565b9050828103604084015261257081866124e2565b9050828103606084015261258481856124e2565b979650505050505050565b600060208083850312156125a257600080fd5b823567ffffffffffffffff808211156125ba57600080fd5b818501915085601f8301126125ce57600080fd5b8135818111156125e0576125e0612361565b8060051b91506125f1848301612377565b818152918301840191848101908884111561260b57600080fd5b938501935b838510156126305761262185612214565b82529385019390850190612610565b98975050505050505050565b6000806040838503121561264f57600080fd5b61265883612214565b915061231460208401612214565b600181811c9082168061267a57607f821691505b60208210810361269a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156126c9576126c96126a0565b500190565b6000602082840312156126e057600080fd5b815161154b816122ac565b6000602082840312156126fd57600080fd5b5051919050565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b600181815b80851115612762578160001904821115612748576127486126a0565b8085161561275557918102915b93841c939080029061272c565b509250929050565b6000826127795750600161082e565b816127865750600061082e565b816001811461279c57600281146127a6576127c2565b600191505061082e565b60ff8411156127b7576127b76126a0565b50506001821b61082e565b5060208310610133831016604e8410600b84101617156127e5575081810a61082e565b6127ef8383612727565b8060001904821115612803576128036126a0565b029392505050565b600061154b838361276a565b6000816000190483118215151615612831576128316126a0565b500290565b601f821115610e1757600081815260208120601f850160051c8101602086101561285d5750805b601f850160051c820191505b81811015611ff357828155600101612869565b815167ffffffffffffffff81111561289657612896612361565b6128aa816128a48454612666565b84612836565b602080601f8311600181146128df57600084156128c75750858301515b600019600386901b1c1916600185901b178555611ff3565b600085815260208120601f198616915b8281101561290e578886015182559484019460019091019084016128ef565b508582101561292c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000835161294e818460208801612190565b835190830190612962818360208801612190565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b60008251612993818460208701612190565b9190910192915050565b6000600182016129af576129af6126a0565b5060010190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906129e9908301846121bc565b9695505050505050565b600060208284031215612a0557600080fd5b815161154b8161215d56fea2646970667358221220dcf750ecebe042db9c2f989f00f424fe286556080d56b3408e025daf450a1e7864736f6c634300080f0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a536d6f6c697a617264730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064c495a4152440000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): Smolizards
Arg [1] : symbol_ (string): LIZARD
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [3] : 536d6f6c697a6172647300000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [5] : 4c495a4152440000000000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
17070:29177:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24682:615;;;;;;;;;;-1:-1:-1;24682:615:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;24682:615:0;;;;;;;;29717:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32303:204::-;;;;;;;;;;-1:-1:-1;32303:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;32303:204:0;1528:203:1;31758:479:0;;;;;;;;;;-1:-1:-1;31758:479:0;;;;;:::i;:::-;;:::i;20092:992::-;;;;;;;;;;;;;:::i;19979:46::-;;;;;;;;;;-1:-1:-1;19979:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;23738:315;;;;;;;;;;-1:-1:-1;24004:12:0;;23988:13;;:28;23738:315;;;2510:25:1;;;2498:2;2483:18;23738:315:0;2364:177:1;15320:256:0;;;;;;;;;;-1:-1:-1;15320:256:0;;;;;:::i;:::-;;:::i;33191:170::-;;;;;;;;;;-1:-1:-1;33191:170:0;;;;;:::i;:::-;;:::i;787:93::-;;;;;;;;;;-1:-1:-1;787:93:0;;;;;:::i;:::-;;:::i;289:106::-;;;;;;;;;;-1:-1:-1;289:106:0;;;;;:::i;:::-;;:::i;30840:97::-;;;;;;;;;;;;;:::i;33432:185::-;;;;;;;;;;-1:-1:-1;33432:185:0;;;;;:::i;:::-;;:::i;29506:144::-;;;;;;;;;;-1:-1:-1;29506:144:0;;;;;:::i;:::-;;:::i;25361:237::-;;;;;;;;;;-1:-1:-1;25361:237:0;;;;;:::i;:::-;;:::i;24151:283::-;;;;;;;;;;-1:-1:-1;24384:13:0;;24151:283;;21093:101;;;;;;;;;;-1:-1:-1;21093:101:0;;;;;:::i;:::-;;:::i;15942:97::-;;;;;;;;;;-1:-1:-1;15942:97:0;;;;;:::i;:::-;;:::i;16189:163::-;;;;;;;;;;;;;:::i;14389:91::-;;;;;;;;;;-1:-1:-1;14389:91:0;;;;;:::i;:::-;;:::i;29886:104::-;;;;;;;;;;;;;:::i;15584:214::-;;;;;;;;;;-1:-1:-1;15584:214:0;;;;;:::i;:::-;;:::i;32579:308::-;;;;;;;;;;-1:-1:-1;32579:308:0;;;;;:::i;:::-;;:::i;15030:132::-;;;;;;;;;;-1:-1:-1;15030:132:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;14165:30::-;;;;;;;;;;;;;;;;30945:171;;;;;;;;;;-1:-1:-1;30945:171:0;;;;;:::i;:::-;;:::i;13826:65::-;;;;;;;;;;-1:-1:-1;13826:65:0;;;;-1:-1:-1;;;;;13826:65:0;;;33688:396;;;;;;;;;;-1:-1:-1;33688:396:0;;;;;:::i;:::-;;:::i;184:99::-;;;;;;;;;;-1:-1:-1;184:99:0;;;;;:::i;:::-;-1:-1:-1;;;;;262:13:0;238:4;262:13;;;;;;;;;;;;;;184:99;15170:142;;;;;;;;;;-1:-1:-1;15170:142:0;;;;;:::i;:::-;;:::i;14488:109::-;;;;;;;;;;-1:-1:-1;14488:109:0;;;;;:::i;:::-;;:::i;31124:110::-;;;;;;;;;;-1:-1:-1;31124:110:0;;;;;:::i;:::-;;:::i;30061:318::-;;;;;;;;;;-1:-1:-1;30061:318:0;;;;;:::i;:::-;;:::i;34092:114::-;;;;;;;;;;-1:-1:-1;34092:114:0;;;;;:::i;:::-;;:::i;12095:605::-;;;;;;;;;;-1:-1:-1;12095:605:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;14755:267::-;;;;;;;;;;-1:-1:-1;14755:267:0;;;;;:::i;:::-;;:::i;14605:142::-;;;;;;;;;;-1:-1:-1;14605:142:0;;;;;:::i;:::-;;:::i;32958:166::-;;;;;;;;;;-1:-1:-1;32958:166:0;;;;;:::i;:::-;;:::i;15806:128::-;;;;;;;;;;-1:-1:-1;15806:128:0;;;;;:::i;:::-;;:::i;16047:134::-;;;;;;;;;;;;;:::i;14247:50::-;;;;;;;;;;-1:-1:-1;14247:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9291:25:1;;;9359:14;;9352:22;9347:2;9332:18;;9325:50;9391:18;;;9384:34;9279:2;9264:18;14247:50:0;9095:329:1;14130:26:0;;;;;;;;;;;;;;;;24682:615;24767:4;-1:-1:-1;;;;;;;;;25067:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;25144:25:0;;;25067:102;:179;;;-1:-1:-1;;;;;;;;;;25221:25:0;;;25067:179;25047:199;24682:615;-1:-1:-1;;24682:615:0:o;29717:100::-;29771:13;29804:5;29797:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29717:100;:::o;32303:204::-;32371:7;32396:16;32404:7;32396;:16::i;:::-;32391:64;;32421:34;;-1:-1:-1;;;32421:34:0;;;;;;;;;;;32391:64;-1:-1:-1;32475:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;32475:24:0;;32303:204::o;31758:479::-;31831:14;31864:27;31883:7;31864:18;:27::i;:::-;31831:62;;31914:6;-1:-1:-1;;;;;31908:12:0;:2;-1:-1:-1;;;;;31908:12:0;;31904:49;;31929:24;;-1:-1:-1;;;31929:24:0;;;;;;;;;;;31904:49;44161:10;-1:-1:-1;;;;;31970:29:0;;;31966:177;;32019:45;32036:6;44161:10;32958:166;:::i;32019:45::-;32014:129;;32092:35;;-1:-1:-1;;;32092:35:0;;;;;;;;;;;32014:129;32155:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;32155:29:0;-1:-1:-1;;;;;32155:29:0;;;;;;;;;32200;;32155:24;;32200:29;;;;;;;31820:417;31758:479;;:::o;20092:992::-;692:6;;-1:-1:-1;;;692:6:0;;;;691:7;683:29;;;;-1:-1:-1;;;683:29:0;;10016:2:1;683:29:0;;;9998:21:1;10055:1;10035:18;;;10028:29;-1:-1:-1;;;10073:18:1;;;10066:39;10122:18;;683:29:0;;;;;;;;;732:4;723:13;;-1:-1:-1;;;;723:13:0;-1:-1:-1;;;723:13:0;;;20149:10:::1;723:13:::0;20181:21;;;:14:::1;:21;::::0;;;;;723:13;20181:21:::1;20180:22;20172:46;;;::::0;-1:-1:-1;;;20172:46:0;;10353:2:1;20172:46:0::1;::::0;::::1;10335:21:1::0;10392:2;10372:18;;;10365:30;-1:-1:-1;;;10411:18:1;;;10404:41;10462:18;;20172:46:0::1;10151:335:1::0;20172:46:0::1;20256:11;;20239:13;;:28;;20231:54;;;::::0;-1:-1:-1;;;20231:54:0;;10693:2:1;20231:54:0::1;::::0;::::1;10675:21:1::0;10732:2;10712:18;;;10705:30;-1:-1:-1;;;10751:18:1;;;10744:43;10804:18;;20231:54:0::1;10491:337:1::0;20231:54:0::1;-1:-1:-1::0;;;;;20301:14:0;::::1;;::::0;;;:7:::1;:14;::::0;;;;:29:::1;;::::0;::::1;;20298:308;;;-1:-1:-1::0;;;;;20369:14:0;::::1;;::::0;;;:7:::1;:14;::::0;;;;:24:::1;;::::0;:33:::1;::::0;20396:6:::1;20369:33;:::i;:::-;20350:15;:53;20347:152;;;-1:-1:-1::0;;;;;20432:14:0;::::1;;::::0;;;:7:::1;:14;::::0;;;;:28;20463:1:::1;-1:-1:-1::0;20424:59:0::1;;;::::0;-1:-1:-1;;;20424:59:0;;11300:2:1;20424:59:0::1;::::0;::::1;11282:21:1::0;11339:2;11319:18;;;11312:30;-1:-1:-1;;;11358:18:1;;;11351:44;11412:18;;20424:59:0::1;11098:338:1::0;20424:59:0::1;20298:308;;;-1:-1:-1::0;;;;;20543:14:0;::::1;;::::0;;;:7:::1;:14;::::0;;;;:28;20574:1:::1;-1:-1:-1::0;20535:59:0::1;;;::::0;-1:-1:-1;;;20535:59:0;;11300:2:1;20535:59:0::1;::::0;::::1;11282:21:1::0;11339:2;11319:18;;;11312:30;-1:-1:-1;;;11358:18:1;;;11351:44;11412:18;;20535:59:0::1;11098:338:1::0;20535:59:0::1;-1:-1:-1::0;;;;;20630:14:0;::::1;;::::0;;;:7:::1;:14;::::0;;;;:29:::1;;::::0;::::1;;20625:315;;20685:35;20714:5;20685:28;:35::i;:::-;20677:67;;;::::0;-1:-1:-1;;;20677:67:0;;11643:2:1;20677:67:0::1;::::0;::::1;11625:21:1::0;11682:2;11662:18;;;11655:30;-1:-1:-1;;;11701:18:1;;;11694:49;11760:18;;20677:67:0::1;11441:343:1::0;20677:67:0::1;20804:15;;20767:33;20794:5;20767:26;:33::i;:::-;:52;;20759:91;;;::::0;-1:-1:-1;;;20759:91:0;;11991:2:1;20759:91:0::1;::::0;::::1;11973:21:1::0;12030:2;12010:18;;;12003:30;12069:28;12049:18;;;12042:56;12115:18;;20759:91:0::1;11789:350:1::0;20759:91:0::1;20865:11;::::0;;20912:15:::1;::::0;20865:63:::1;::::0;-1:-1:-1;;;20865:63:0;;-1:-1:-1;;;;;12402:15:1;;;20865:63:0;;::::1;12384:34:1::0;;;;20905:4:0::1;12434:18:1::0;;;12427:43;12486:18;;;12479:34;;;;20865:11:0;::::1;::::0;:24:::1;::::0;12319:18:1;;20865:63:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20625:315;-1:-1:-1::0;;;;;20961:14:0;::::1;;::::0;;;:7:::1;:14;::::0;;;;20988:15:::1;20961:24;::::0;::::1;:42:::0;21014:33;;21046:1:::1;::::0;20961:14;21014:33:::1;::::0;21046:1;;21014:33:::1;:::i;:::-;::::0;;;-1:-1:-1;21058:15:0::1;::::0;-1:-1:-1;21064:5:0;21071:1:::1;21058:5;:15::i;:::-;-1:-1:-1::0;759:6:0;:14;;-1:-1:-1;;;;759:14:0;;;20092:992::o;15320:256::-;15469:15;;15422:11;;;:43;;-1:-1:-1;;;15422:43:0;;-1:-1:-1;;;;;13004:15:1;;;15422:43:0;;;12986:34:1;;;;15459:4:0;13036:18:1;;;13029:43;15394:12:0;;15469:15;15422:11;;;;:21;;12921:18:1;;15422:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;15419:150;;-1:-1:-1;15508:4:0;;15320:256;-1:-1:-1;15320:256:0:o;15419:150::-;-1:-1:-1;15552:5:0;;15320:256;-1:-1:-1;15320:256:0:o;15419:150::-;15320:256;;;:::o;33191:170::-;33325:28;33335:4;33341:2;33345:7;33325:9;:28::i;:::-;33191:170;;;:::o;787:93::-;449:10;441:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;476:5:0;;-1:-1:-1;;;;;476:5:0;464:10;:17;441:40;432:63;;;;-1:-1:-1;;;432:63:0;;;;;;;:::i;:::-;855:5:::1;:17:::0;;-1:-1:-1;;;;;;855:17:0::1;-1:-1:-1::0;;;;;855:17:0;;;::::1;::::0;;;::::1;::::0;;787:93::o;289:106::-;449:10;441:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;476:5:0;;-1:-1:-1;;;;;476:5:0;464:10;:17;441:40;432:63;;;;-1:-1:-1;;;432:63:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;366:13:0;;;::::1;:7;:13:::0;;;::::1;::::0;;;;;;:21;;-1:-1:-1;;366:21:0::1;::::0;::::1;;::::0;;;::::1;::::0;;289:106::o;30840:97::-;30884:13;30917:12;30910:19;;;;;:::i;33432:185::-;33570:39;33587:4;33593:2;33597:7;33570:39;;;;;;;;;;;;:16;:39::i;29506:144::-;29570:7;29613:27;29632:7;29613:18;:27::i;25361:237::-;25426:7;25468:6;25479:1;25450:30;25446:71;;25489:28;;-1:-1:-1;;;25489:28:0;;;;;;;;;;;25446:71;-1:-1:-1;;;;;;25535:26:0;;;;;:18;:26;;;;;;17421:13;25535:55;;25361:237::o;21093:101::-;449:10;441:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;476:5:0;;-1:-1:-1;;;;;476:5:0;464:10;:17;441:40;432:63;;;;-1:-1:-1;;;432:63:0;;;;;;;:::i;:::-;21166:19:::1;21172:2;21176:8;21166:5;:19::i;:::-;21093:101:::0;;:::o;15942:97::-;449:10;441:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;476:5:0;;-1:-1:-1;;;;;476:5:0;464:10;:17;441:40;432:63;;;;-1:-1:-1;;;432:63:0;;;;;;;:::i;:::-;16013:10:::1;:18:::0;15942:97::o;16189:163::-;449:10;441:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;476:5:0;;-1:-1:-1;;;;;476:5:0;464:10;:17;441:40;432:63;;;;-1:-1:-1;;;432:63:0;;;;;;;:::i;:::-;16257:51:::1;::::0;16244:9:::1;::::0;16257:10:::1;::::0;16281:21:::1;::::0;16244:9;16257:51;16244:9;16257:51;16281:21;16257:10;:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16243:65;;;16327:4;16319:25;;;::::0;-1:-1:-1;;;16319:25:0;;14021:2:1;16319:25:0::1;::::0;::::1;14003:21:1::0;14060:1;14040:18;;;14033:29;-1:-1:-1;;;14078:18:1;;;14071:38;14126:18;;16319:25:0::1;13819:331:1::0;16319:25:0::1;16232:120;16189:163::o:0;14389:91::-;449:10;441:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;476:5:0;;-1:-1:-1;;;;;476:5:0;464:10;:17;441:40;432:63;;;;-1:-1:-1;;;432:63:0;;;;;;;:::i;:::-;14453:11:::1;:19:::0;14389:91::o;29886:104::-;29942:13;29975:7;29968:14;;;;;:::i;15584:214::-;449:10;441:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;476:5:0;;-1:-1:-1;;;;;476:5:0;464:10;:17;441:40;432:63;;;;-1:-1:-1;;;432:63:0;;;;;;;:::i;:::-;15665:20:::1;:41:::0;;;15766:11:::1;::::0;;:22:::1;::::0;;-1:-1:-1;;;15766:22:0;;;;-1:-1:-1;;;;;15766:11:0;;::::1;::::0;:20:::1;::::0;:22;;::::1;::::0;::::1;::::0;;;;;;;:11;:22:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15759:30;::::0;:2:::1;:30;:::i;:::-;15735:20;;:55;;;;:::i;:::-;15717:15;:73:::0;-1:-1:-1;15584:214:0:o;32579:308::-;44161:10;-1:-1:-1;;;;;32678:31:0;;;32674:61;;32718:17;;-1:-1:-1;;;32718:17:0;;;;;;;;;;;32674:61;44161:10;32748:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;32748:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;32748:60:0;;;;;;;;;;32824:55;;540:41:1;;;32748:49:0;;44161:10;32824:55;;513:18:1;32824:55:0;;;;;;;32579:308;;:::o;15030:132::-;-1:-1:-1;;;;;15129:14:0;;;;;;:7;:14;;;;;;;;;:25;;15122:32;;;;;;;;;;;;;;;;;15090:19;;15122:32;;;15129:25;15122:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15030:132;;;:::o;30945:171::-;449:10;441:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;476:5:0;;-1:-1:-1;;;;;476:5:0;464:10;:17;441:40;432:63;;;;-1:-1:-1;;;432:63:0;;;;;;;:::i;:::-;31014:8:::1;:15;31025:4:::0;31014:8;:15:::1;:::i;:::-;-1:-1:-1::0;31044:17:0::1;::::0;::::1;;31040:69;;31078:12;:19;31093:4:::0;31078:12;:19:::1;:::i;33688:396::-:0;33855:28;33865:4;33871:2;33875:7;33855:9;:28::i;:::-;-1:-1:-1;;;;;33898:14:0;;;:19;33894:183;;33937:56;33968:4;33974:2;33978:7;33987:5;33937:30;:56::i;:::-;33932:145;;34021:40;;-1:-1:-1;;;34021:40:0;;;;;;;;;;;33932:145;33688:396;;;;:::o;15170:142::-;15276:11;;;:28;;-1:-1:-1;;;15276:28:0;;-1:-1:-1;;;;;1692:32:1;;;15276:28:0;;;1674:51:1;;;;15242:14:0;;15276:11;;;;:21;;1647:18:1;;15276:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14488:109::-;449:10;441:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;476:5:0;;-1:-1:-1;;;;;476:5:0;464:10;:17;441:40;432:63;;;;-1:-1:-1;;;432:63:0;;;;;;;:::i;:::-;14561:17:::1;:28:::0;;-1:-1:-1;;14561:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;14488:109::o;31124:110::-;449:10;441:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;476:5:0;;-1:-1:-1;;;;;476:5:0;464:10;:17;441:40;432:63;;;;-1:-1:-1;;;432:63:0;;;;;;;:::i;:::-;31202:12:::1;:24;31217:9:::0;31202:12;:24:::1;:::i;30061:318::-:0;30134:13;30165:16;30173:7;30165;:16::i;:::-;30160:59;;30190:29;;-1:-1:-1;;;30190:29:0;;;;;;;;;;;30160:59;30232:21;30256:10;:8;:10::i;:::-;30232:34;;30290:7;30284:21;30309:1;30284:26;:87;;;;;;;;;;;;;;;;;30337:7;30346:18;30356:7;30346:9;:18::i;:::-;30320:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30284:87;30277:94;30061:318;-1:-1:-1;;;30061:318:0:o;34092:114::-;449:10;441:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;476:5:0;;-1:-1:-1;;;;;476:5:0;464:10;:17;441:40;432:63;;;;-1:-1:-1;;;432:63:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34169:21:0;;;::::1;;::::0;;;:14:::1;:21;::::0;;;;:29;;-1:-1:-1;;34169:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;34092:114::o;12095:605::-;12260:18;12281:23;;;:14;:23;;;;;12260:54;;12155:17;;;;;;;;12260:18;12281:23;12260:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12325:18;12346:14;:23;12361:7;12346:23;;;;;;;;;;;:33;;12325:54;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12390:27;12420:14;:23;12435:7;12420:23;;;;;;;;;;;:34;;12390:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12465:27;12507:6;12503:135;12519:10;:17;12515:1;:21;12503:135;;;12576:14;:23;12591:7;12576:23;;;;;;;;;;;:34;;12611:10;12622:1;12611:13;;;;;;;;:::i;:::-;;;;;;;12576:49;;;;;;:::i;:::-;;;;;;;;;;;;;12558:68;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:11;12570:1;12558:14;;;;;;;;:::i;:::-;;;;;;:68;;;;12538:3;;;;;:::i;:::-;;;;12503:135;;;-1:-1:-1;12655:4:0;;12661;;-1:-1:-1;12661:4:0;-1:-1:-1;12655:4:0;;-1:-1:-1;12095:605:0;-1:-1:-1;;12095:605:0:o;14755:267::-;449:10;441:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;476:5:0;;-1:-1:-1;;;;;476:5:0;464:10;:17;441:40;432:63;;;;-1:-1:-1;;;432:63:0;;;;;;;:::i;:::-;14859:1:::1;14843:6;:13;:17;14835:66;;;::::0;-1:-1:-1;;;14835:66:0;;19136:2:1;14835:66:0::1;::::0;::::1;19118:21:1::0;19175:2;19155:18;;;19148:30;19214:34;19194:18;;;19187:62;-1:-1:-1;;;19265:18:1;;;19258:34;19309:19;;14835:66:0::1;18934:400:1::0;14835:66:0::1;14916:6;14912:103;14928:6;:13;14924:1;:17;14912:103;;;14999:4;14963:7;:18;14971:6;14978:1;14971:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;14963:18:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;14963:18:0;:33:::1;;:40:::0;;-1:-1:-1;;14963:40:0::1;::::0;::::1;;::::0;;;::::1;::::0;;14943:3;::::1;::::0;::::1;:::i;:::-;;;;14912:103;;14605:142:::0;449:10;441:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;476:5:0;;-1:-1:-1;;;;;476:5:0;464:10;:17;441:40;432:63;;;;-1:-1:-1;;;432:63:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14692:14:0;;;::::1;;::::0;;;:7:::1;:14;::::0;;;;:29:::1;;:47:::0;;-1:-1:-1;;14692:47:0::1;::::0;::::1;;::::0;;;::::1;::::0;;14605:142::o;32958:166::-;-1:-1:-1;;;;;33080:26:0;;;33056:4;33080:26;;;:18;:26;;;;;;;;:36;;;;;;;;;;;;;;;32958:166::o;15806:128::-;449:10;441:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;476:5:0;;-1:-1:-1;;;;;476:5:0;464:10;:17;441:40;432:63;;;;-1:-1:-1;;;432:63:0;;;;;;;:::i;:::-;15875:5:::1;:13:::0;;-1:-1:-1;;;;;15875:13:0;;::::1;-1:-1:-1::0;;;;;;15875:13:0;;::::1;::::0;::::1;::::0;;;15899:11:::1;:27:::0;;;;::::1;;::::0;;15806:128::o;16047:134::-;449:10;441:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;476:5:0;;-1:-1:-1;;;;;476:5:0;464:10;:17;441:40;432:63;;;;-1:-1:-1;;;432:63:0;;;;;;;:::i;:::-;16103:11:::1;::::0;;16136:36:::1;::::0;-1:-1:-1;;;16136:36:0;;16166:4:::1;16136:36:::0;;::::1;1674:51:1::0;;;;-1:-1:-1;;;;;16103:11:0::1;::::0;:20:::1;::::0;16124:10:::1;::::0;16103:11;;16136:21:::1;::::0;1647:18:1;;16136:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16103:70;::::0;-1:-1:-1;;;;;;16103:70:0::1;::::0;;;;;;-1:-1:-1;;;;;19531:32:1;;;16103:70:0::1;::::0;::::1;19513:51:1::0;19580:18;;;19573:34;19486:18;;16103:70:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34459:273::-:0;34516:4;34606:13;;34596:7;:23;34553:152;;;;-1:-1:-1;;34657:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;34657:43:0;:48;;34459:273::o;27021:1129::-;27088:7;27123;27225:13;;27218:4;:20;27214:869;;;27263:14;27280:23;;;:17;:23;;;;;;;-1:-1:-1;;;27369:23:0;;:28;;27365:699;;27888:113;27895:6;27905:1;27895:11;27888:113;;-1:-1:-1;;;27966:6:0;27948:25;;;;:17;:25;;;;;;27888:113;;27365:699;27240:843;27214:869;28111:31;;-1:-1:-1;;;28111:31:0;;;;;;;;;;;21453:1663;21538:13;;21584:2;21591:1;21566:26;21562:58;;21601:19;;-1:-1:-1;;;21601:19:0;;;;;;;;;;;21562:58;21635:8;21647:1;21635:13;21631:44;;21657:18;;-1:-1:-1;;;21657:18:0;;;;;;;;;;;21631:44;-1:-1:-1;;;;;22224:22:0;;;;;;:18;:22;;;;17558:2;22224:22;;;:70;;22262:31;22250:44;;22224:70;;;22537:31;;;:17;:31;;;;;22630:15;18075:3;22630:41;22588:84;;-1:-1:-1;22708:13:0;;18338:3;22693:56;22588:162;22537:213;;:31;22831:23;;;22871:111;22898:40;;22923:14;;;;;-1:-1:-1;;;;;22898:40:0;;;22915:1;;22898:40;;22915:1;;22898:40;22977:3;22962:12;:18;22871:111;;-1:-1:-1;22998:13:0;:28;33191:170;;;:::o;34986:2733::-;35101:27;35131;35150:7;35131:18;:27::i;:::-;-1:-1:-1;;;;;35180:20:0;;;;;;:14;:20;;;;;;35101:57;;-1:-1:-1;35180:20:0;;35179:21;:44;;;;-1:-1:-1;;;;;;35205:18:0;;;;;;:14;:18;;;;;;;;35204:19;35179:44;35171:68;;;;-1:-1:-1;;;35171:68:0;;10353:2:1;35171:68:0;;;10335:21:1;10392:2;10372:18;;;10365:30;-1:-1:-1;;;10411:18:1;;;10404:41;10462:18;;35171:68:0;10151:335:1;35171:68:0;35295:4;-1:-1:-1;;;;;35254:45:0;35270:19;-1:-1:-1;;;;;35254:45:0;;35250:86;;35308:28;;-1:-1:-1;;;35308:28:0;;;;;;;;;;;35250:86;35349:23;35375:24;;;:15;:24;;;;;;-1:-1:-1;;;;;35375:24:0;;;;35349:23;35438:27;;44161:10;35438:27;;:87;;-1:-1:-1;35482:43:0;35499:4;44161:10;32958:166;:::i;35482:43::-;35438:142;;;-1:-1:-1;;;;;;35542:38:0;;44161:10;35542:38;35438:142;35412:169;;35599:17;35594:66;;35625:35;;-1:-1:-1;;;35625:35:0;;;;;;;;;;;35594:66;35693:2;35700:1;35675:26;35671:62;;35710:23;;-1:-1:-1;;;35710:23:0;;;;;;;;;;;35671:62;35877:15;35859:39;35855:103;;35922:24;;;;:15;:24;;;;;35915:31;;-1:-1:-1;;;;;;35915:31:0;;;35855:103;-1:-1:-1;;;;;36325:24:0;;;;;;;:18;:24;;;;;;;;36323:26;;-1:-1:-1;;36323:26:0;;;36394:22;;;;;;;;36392:24;;-1:-1:-1;36392:24:0;;;36687:26;;;:17;:26;;;;;-1:-1:-1;;;36775:15:0;18075:3;36775:41;36733:84;;:128;;36687:174;;;36981:46;;:51;;36977:626;;37085:1;37075:11;;37053:19;37208:30;;;:17;:30;;;;;;:35;;37204:384;;37346:13;;37331:11;:28;37327:242;;37493:30;;;;:17;:30;;;;;:52;;;37327:242;37034:569;36977:626;37650:7;37646:2;-1:-1:-1;;;;;37631:27:0;37640:4;-1:-1:-1;;;;;37631:27:0;;;;;;;;;;;37669:42;35090:2629;;;34986:2733;;;:::o;41543:716::-;41727:88;;-1:-1:-1;;;41727:88:0;;41706:4;;-1:-1:-1;;;;;41727:45:0;;;;;:88;;44161:10;;41794:4;;41800:7;;41809:5;;41727:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41727:88:0;;;;;;;;-1:-1:-1;;41727:88:0;;;;;;;;;;;;:::i;:::-;;;41723:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42010:6;:13;42027:1;42010:18;42006:235;;42056:40;;-1:-1:-1;;;42056:40:0;;;;;;;;;;;42006:235;42199:6;42193:13;42184:6;42180:2;42176:15;42169:38;41723:529;-1:-1:-1;;;;;;41886:64:0;-1:-1:-1;;;41886:64:0;;-1:-1:-1;41723:529:0;41543:716;;;;;;:::o;30627:205::-;30708:17;;30678:13;;30708:17;;30704:121;;30749:8;30742:15;;;;;:::i;30704:121::-;30797:12;30790:19;;;;;:::i;44285:1959::-;44756:4;44750:11;;44763:3;44746:21;;44841:17;;;;45538:11;;;45417:5;45670:2;45684;45674:13;;45666:22;45538:11;45653:36;45725:2;45715:13;;45308:682;45744:4;45308:682;;;45919:1;45914:3;45910:11;45903:18;;45970:2;45964:4;45960:13;45956:2;45952:22;45947:3;45939:36;45840:2;45830:13;;45308:682;;;-1:-1:-1;46032:13:0;;;-1:-1:-1;;46147:12:0;;;46207:19;;;46147:12;44285:1959;-1:-1:-1;44285:1959:0:o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1914:254;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2173:186::-;2232:6;2285:2;2273:9;2264:7;2260:23;2256:32;2253:52;;;2301:1;2298;2291:12;2253:52;2324:29;2343:9;2324:29;:::i;2546:328::-;2623:6;2631;2639;2692:2;2680:9;2671:7;2667:23;2663:32;2660:52;;;2708:1;2705;2698:12;2660:52;2731:29;2750:9;2731:29;:::i;:::-;2721:39;;2779:38;2813:2;2802:9;2798:18;2779:38;:::i;:::-;2769:48;;2864:2;2853:9;2849:18;2836:32;2826:42;;2546:328;;;;;:::o;2879:118::-;2965:5;2958:13;2951:21;2944:5;2941:32;2931:60;;2987:1;2984;2977:12;3002:315;3067:6;3075;3128:2;3116:9;3107:7;3103:23;3099:32;3096:52;;;3144:1;3141;3134:12;3096:52;3167:29;3186:9;3167:29;:::i;:::-;3157:39;;3246:2;3235:9;3231:18;3218:32;3259:28;3281:5;3259:28;:::i;:::-;3306:5;3296:15;;;3002:315;;;;;:::o;3322:254::-;3390:6;3398;3451:2;3439:9;3430:7;3426:23;3422:32;3419:52;;;3467:1;3464;3457:12;3419:52;3503:9;3490:23;3480:33;;3532:38;3566:2;3555:9;3551:18;3532:38;:::i;:::-;3522:48;;3322:254;;;;;:::o;3581:632::-;3752:2;3804:21;;;3874:13;;3777:18;;;3896:22;;;3723:4;;3752:2;3975:15;;;;3949:2;3934:18;;;3723:4;4018:169;4032:6;4029:1;4026:13;4018:169;;;4093:13;;4081:26;;4162:15;;;;4127:12;;;;4054:1;4047:9;4018:169;;;-1:-1:-1;4204:3:1;;3581:632;-1:-1:-1;;;;;;3581:632:1:o;4218:127::-;4279:10;4274:3;4270:20;4267:1;4260:31;4310:4;4307:1;4300:15;4334:4;4331:1;4324:15;4350:275;4421:2;4415:9;4486:2;4467:13;;-1:-1:-1;;4463:27:1;4451:40;;4521:18;4506:34;;4542:22;;;4503:62;4500:88;;;4568:18;;:::i;:::-;4604:2;4597:22;4350:275;;-1:-1:-1;4350:275:1:o;4630:407::-;4695:5;4729:18;4721:6;4718:30;4715:56;;;4751:18;;:::i;:::-;4789:57;4834:2;4813:15;;-1:-1:-1;;4809:29:1;4840:4;4805:40;4789:57;:::i;:::-;4780:66;;4869:6;4862:5;4855:21;4909:3;4900:6;4895:3;4891:16;4888:25;4885:45;;;4926:1;4923;4916:12;4885:45;4975:6;4970:3;4963:4;4956:5;4952:16;4939:43;5029:1;5022:4;5013:6;5006:5;5002:18;4998:29;4991:40;4630:407;;;;;:::o;5042:451::-;5111:6;5164:2;5152:9;5143:7;5139:23;5135:32;5132:52;;;5180:1;5177;5170:12;5132:52;5220:9;5207:23;5253:18;5245:6;5242:30;5239:50;;;5285:1;5282;5275:12;5239:50;5308:22;;5361:4;5353:13;;5349:27;-1:-1:-1;5339:55:1;;5390:1;5387;5380:12;5339:55;5413:74;5479:7;5474:2;5461:16;5456:2;5452;5448:11;5413:74;:::i;5498:667::-;5593:6;5601;5609;5617;5670:3;5658:9;5649:7;5645:23;5641:33;5638:53;;;5687:1;5684;5677:12;5638:53;5710:29;5729:9;5710:29;:::i;:::-;5700:39;;5758:38;5792:2;5781:9;5777:18;5758:38;:::i;:::-;5748:48;;5843:2;5832:9;5828:18;5815:32;5805:42;;5898:2;5887:9;5883:18;5870:32;5925:18;5917:6;5914:30;5911:50;;;5957:1;5954;5947:12;5911:50;5980:22;;6033:4;6025:13;;6021:27;-1:-1:-1;6011:55:1;;6062:1;6059;6052:12;6011:55;6085:74;6151:7;6146:2;6133:16;6128:2;6124;6120:11;6085:74;:::i;:::-;6075:84;;;5498:667;;;;;;;:::o;6170:241::-;6226:6;6279:2;6267:9;6258:7;6254:23;6250:32;6247:52;;;6295:1;6292;6285:12;6247:52;6334:9;6321:23;6353:28;6375:5;6353:28;:::i;6416:616::-;6468:3;6506:5;6500:12;6533:6;6528:3;6521:19;6559:4;6600:2;6595:3;6591:12;6625:11;6652;6645:18;;6702:6;6699:1;6695:14;6688:5;6684:26;6672:38;;6744:2;6737:5;6733:14;6765:1;6775:231;6789:6;6786:1;6783:13;6775:231;;;6860:5;6854:4;6850:16;6845:3;6838:29;6888:38;6921:4;6912:6;6906:13;6888:38;:::i;:::-;6984:12;;;;6880:46;-1:-1:-1;6949:15:1;;;;6811:1;6804:9;6775:231;;;-1:-1:-1;7022:4:1;;6416:616;-1:-1:-1;;;;;;;6416:616:1:o;7037:831::-;7430:3;7419:9;7412:22;7393:4;7457:46;7498:3;7487:9;7483:19;7475:6;7457:46;:::i;:::-;7551:9;7543:6;7539:22;7534:2;7523:9;7519:18;7512:50;7585:33;7611:6;7603;7585:33;:::i;:::-;7571:47;;7666:9;7658:6;7654:22;7649:2;7638:9;7634:18;7627:50;7700:43;7736:6;7728;7700:43;:::i;:::-;7686:57;;7791:9;7783:6;7779:22;7774:2;7763:9;7759:18;7752:50;7819:43;7855:6;7847;7819:43;:::i;:::-;7811:51;7037:831;-1:-1:-1;;;;;;;7037:831:1:o;7873:952::-;7957:6;7988:2;8031;8019:9;8010:7;8006:23;8002:32;7999:52;;;8047:1;8044;8037:12;7999:52;8087:9;8074:23;8116:18;8157:2;8149:6;8146:14;8143:34;;;8173:1;8170;8163:12;8143:34;8211:6;8200:9;8196:22;8186:32;;8256:7;8249:4;8245:2;8241:13;8237:27;8227:55;;8278:1;8275;8268:12;8227:55;8314:2;8301:16;8336:2;8332;8329:10;8326:36;;;8342:18;;:::i;:::-;8388:2;8385:1;8381:10;8371:20;;8411:28;8435:2;8431;8427:11;8411:28;:::i;:::-;8473:15;;;8543:11;;;8539:20;;;8504:12;;;;8571:19;;;8568:39;;;8603:1;8600;8593:12;8568:39;8627:11;;;;8647:148;8663:6;8658:3;8655:15;8647:148;;;8729:23;8748:3;8729:23;:::i;:::-;8717:36;;8680:12;;;;8773;;;;8647:148;;;8814:5;7873:952;-1:-1:-1;;;;;;;;7873:952:1:o;8830:260::-;8898:6;8906;8959:2;8947:9;8938:7;8934:23;8930:32;8927:52;;;8975:1;8972;8965:12;8927:52;8998:29;9017:9;8998:29;:::i;:::-;8988:39;;9046:38;9080:2;9069:9;9065:18;9046:38;:::i;9429:380::-;9508:1;9504:12;;;;9551;;;9572:61;;9626:4;9618:6;9614:17;9604:27;;9572:61;9679:2;9671:6;9668:14;9648:18;9645:38;9642:161;;9725:10;9720:3;9716:20;9713:1;9706:31;9760:4;9757:1;9750:15;9788:4;9785:1;9778:15;9642:161;;9429:380;;;:::o;10833:127::-;10894:10;10889:3;10885:20;10882:1;10875:31;10925:4;10922:1;10915:15;10949:4;10946:1;10939:15;10965:128;11005:3;11036:1;11032:6;11029:1;11026:13;11023:39;;;11042:18;;:::i;:::-;-1:-1:-1;11078:9:1;;10965:128::o;12524:245::-;12591:6;12644:2;12632:9;12623:7;12619:23;12615:32;12612:52;;;12660:1;12657;12650:12;12612:52;12692:9;12686:16;12711:28;12733:5;12711:28;:::i;13083:184::-;13153:6;13206:2;13194:9;13185:7;13181:23;13177:32;13174:52;;;13222:1;13219;13212:12;13174:52;-1:-1:-1;13245:16:1;;13083:184;-1:-1:-1;13083:184:1:o;13272:332::-;13474:2;13456:21;;;13513:1;13493:18;;;13486:29;-1:-1:-1;;;13546:2:1;13531:18;;13524:39;13595:2;13580:18;;13272:332::o;14155:422::-;14244:1;14287:5;14244:1;14301:270;14322:7;14312:8;14309:21;14301:270;;;14381:4;14377:1;14373:6;14369:17;14363:4;14360:27;14357:53;;;14390:18;;:::i;:::-;14440:7;14430:8;14426:22;14423:55;;;14460:16;;;;14423:55;14539:22;;;;14499:15;;;;14301:270;;;14305:3;14155:422;;;;;:::o;14582:806::-;14631:5;14661:8;14651:80;;-1:-1:-1;14702:1:1;14716:5;;14651:80;14750:4;14740:76;;-1:-1:-1;14787:1:1;14801:5;;14740:76;14832:4;14850:1;14845:59;;;;14918:1;14913:130;;;;14825:218;;14845:59;14875:1;14866:10;;14889:5;;;14913:130;14950:3;14940:8;14937:17;14934:43;;;14957:18;;:::i;:::-;-1:-1:-1;;15013:1:1;14999:16;;15028:5;;14825:218;;15127:2;15117:8;15114:16;15108:3;15102:4;15099:13;15095:36;15089:2;15079:8;15076:16;15071:2;15065:4;15062:12;15058:35;15055:77;15052:159;;;-1:-1:-1;15164:19:1;;;15196:5;;15052:159;15243:34;15268:8;15262:4;15243:34;:::i;:::-;15313:6;15309:1;15305:6;15301:19;15292:7;15289:32;15286:58;;;15324:18;;:::i;:::-;15362:20;;14582:806;-1:-1:-1;;;14582:806:1:o;15393:131::-;15453:5;15482:36;15509:8;15503:4;15482:36;:::i;15529:168::-;15569:7;15635:1;15631;15627:6;15623:14;15620:1;15617:21;15612:1;15605:9;15598:17;15594:45;15591:71;;;15642:18;;:::i;:::-;-1:-1:-1;15682:9:1;;15529:168::o;15828:545::-;15930:2;15925:3;15922:11;15919:448;;;15966:1;15991:5;15987:2;15980:17;16036:4;16032:2;16022:19;16106:2;16094:10;16090:19;16087:1;16083:27;16077:4;16073:38;16142:4;16130:10;16127:20;16124:47;;;-1:-1:-1;16165:4:1;16124:47;16220:2;16215:3;16211:12;16208:1;16204:20;16198:4;16194:31;16184:41;;16275:82;16293:2;16286:5;16283:13;16275:82;;;16338:17;;;16319:1;16308:13;16275:82;;16549:1352;16675:3;16669:10;16702:18;16694:6;16691:30;16688:56;;;16724:18;;:::i;:::-;16753:97;16843:6;16803:38;16835:4;16829:11;16803:38;:::i;:::-;16797:4;16753:97;:::i;:::-;16905:4;;16969:2;16958:14;;16986:1;16981:663;;;;17688:1;17705:6;17702:89;;;-1:-1:-1;17757:19:1;;;17751:26;17702:89;-1:-1:-1;;16506:1:1;16502:11;;;16498:24;16494:29;16484:40;16530:1;16526:11;;;16481:57;17804:81;;16951:944;;16981:663;15775:1;15768:14;;;15812:4;15799:18;;-1:-1:-1;;17017:20:1;;;17135:236;17149:7;17146:1;17143:14;17135:236;;;17238:19;;;17232:26;17217:42;;17330:27;;;;17298:1;17286:14;;;;17165:19;;17135:236;;;17139:3;17399:6;17390:7;17387:19;17384:201;;;17460:19;;;17454:26;-1:-1:-1;;17543:1:1;17539:14;;;17555:3;17535:24;17531:37;17527:42;17512:58;17497:74;;17384:201;-1:-1:-1;;;;;17631:1:1;17615:14;;;17611:22;17598:36;;-1:-1:-1;16549:1352:1:o;17906:470::-;18085:3;18123:6;18117:13;18139:53;18185:6;18180:3;18173:4;18165:6;18161:17;18139:53;:::i;:::-;18255:13;;18214:16;;;;18277:57;18255:13;18214:16;18311:4;18299:17;;18277:57;:::i;:::-;18350:20;;17906:470;-1:-1:-1;;;;17906:470:1:o;18381:127::-;18442:10;18437:3;18433:20;18430:1;18423:31;18473:4;18470:1;18463:15;18497:4;18494:1;18487:15;18513:276;18644:3;18682:6;18676:13;18698:53;18744:6;18739:3;18732:4;18724:6;18720:17;18698:53;:::i;:::-;18767:16;;;;;18513:276;-1:-1:-1;;18513:276:1:o;18794:135::-;18833:3;18854:17;;;18851:43;;18874:18;;:::i;:::-;-1:-1:-1;18921:1:1;18910:13;;18794:135::o;19618:489::-;-1:-1:-1;;;;;19887:15:1;;;19869:34;;19939:15;;19934:2;19919:18;;19912:43;19986:2;19971:18;;19964:34;;;20034:3;20029:2;20014:18;;20007:31;;;19812:4;;20055:46;;20081:19;;20073:6;20055:46;:::i;:::-;20047:54;19618:489;-1:-1:-1;;;;;;19618:489:1:o;20112:249::-;20181:6;20234:2;20222:9;20213:7;20209:23;20205:32;20202:52;;;20250:1;20247;20240:12;20202:52;20282:9;20276:16;20301:30;20325:5;20301:30;:::i
Metadata Hash
ipfs://dcf750ecebe042db9c2f989f00f424fe286556080d56b3408e025daf450a1e78