ERC-721
Overview
Max Total Supply
428 BROS
Holders
33
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 BROSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
broculas
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-03 */ // File: Broculas_flat.sol // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: https://github.com/chiru-labs/ERC721A/blob/3fed4e909aff50469c316de1263e10660f9af58b/contracts/IERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @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(); /** * 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(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); 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; // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`. uint24 extraData; } /** * @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); // ============================== // IERC2309 // ============================== /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, * as defined in the ERC2309 standard. See `_mintERC2309` for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: https://github.com/chiru-labs/ERC721A/blob/3fed4e909aff50469c316de1263e10660f9af58b/contracts/ERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @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 ERC721A is IERC721A { // 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 bit position of `extraData` in packed ownership. uint256 private constant BITPOS_EXTRA_DATA = 232; // The mask of the lower 160 bits for addresses. uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with `_mintERC2309`. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309` // is required to cause an overflow, which is unrealistic. uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // 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` // - [232..255] `extraData` 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(); } /** * @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() internal 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 (owner == address(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 auxiliary 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 auxiliary 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; ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA); } /** * 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 Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, BITMASK_ADDRESS) // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @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, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @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 = ownerOf(tokenId); 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-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 { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @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 for each mint. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _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] = _packOwnershipData( to, (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED) | _nextExtraData(address(0), to, 0) ); uint256 tokenId = startTokenId; uint256 end = quantity + startTokenId; do { emit Transfer(address(0), to, tokenId++); } while (tokenId < end); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _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] = _packOwnershipData( to, (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { // Compute the slot. mstore(0x00, tokenId) mstore(0x20, tokenApprovalsPtr.slot) approvedAddressSlot := keccak256(0x00, 0x40) // Load the slot's value from storage. approvedAddress := sload(approvedAddressSlot) } } /** * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`. */ function _isOwnerOrApproved( address approvedAddress, address from, address msgSender ) private pure returns (bool result) { assembly { // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from := and(from, BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, BITMASK_ADDRESS) // `msgSender == from || msgSender == approvedAddress`. result := or(eq(msgSender, from), eq(msgSender, approvedAddress)) } } /** * @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 transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // 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] = _packOwnershipData( to, BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // 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)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); if (approvalCheck) // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // 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] = _packOwnershipData( from, (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // 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 Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) internal view virtual returns (uint256) { uint24 previousExtraData; assembly { previousExtraData := shr(BITPOS_EXTRA_DATA, prevOwnershipPacked) } return uint256(_extraData(from, to, previousExtraData)) << BITPOS_EXTRA_DATA; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * 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 _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @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) } } } // File: contracts/Broculas.sol pragma solidity ^0.8.4; error HadClaimed(); error OutofMaxSupply(); contract broculas is ERC721A, Ownable { using Strings for uint256; mapping(address => bool) public claimed; bool freeMintActive = false; uint256 public constant MAX_SUPPLY = 6666; uint256 public cost = 0.005 ether; string public baseUrl = "ipfs://bafybeiaux6iuvazahq74uehxavsrqlj26hl7ekbyw57vobfpag4cdt3m5q/"; constructor() ERC721A("Broculas", "BROS") {} function freeMint(uint256 _amount) external payable { require(freeMintActive, "Free mint closed"); if(totalSupply() + _amount > MAX_SUPPLY) revert OutofMaxSupply(); if(claimed[msg.sender]) { require(msg.value >= _amount * cost, "Insufficient funds"); } else { require(msg.value >= (_amount - 1) * cost, "Insufficient funds"); } claimed[msg.sender] = true; _safeMint(msg.sender, _amount); } function revive() external payable { require(!freeMintActive, "Free mint is open"); require(msg.value >= cost, "Insufficient funds"); if(totalSupply() + 1 > MAX_SUPPLY) revert OutofMaxSupply(); _safeMint(msg.sender, 1); } function ownerBatchMint(uint256 amount) external onlyOwner { if(totalSupply() + amount > MAX_SUPPLY) revert OutofMaxSupply(); _safeMint(msg.sender, amount); } function batchBurn(uint256[] memory tokenids) external onlyOwner { uint256 len = tokenids.length; for (uint256 i; i < len; i++) { _burn(tokenids[i]); } } function toggleFreeMint(bool _state) external onlyOwner { freeMintActive = _state; } function withdraw() external onlyOwner { (bool os, ) = payable(owner()).call{value: address(this).balance}(''); require(os); } function setBaseURI(string memory url) external onlyOwner { baseUrl = url; } function setCost(uint256 _cost) external onlyOwner { cost = _cost; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), ".json")) : ''; } function _baseURI() internal view virtual override returns (string memory) { return baseUrl; } function _startTokenId() internal view virtual override returns (uint256) { return 1; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OutofMaxSupply","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUrl","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenids","type":"uint256[]"}],"name":"batchBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"payable","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":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revive","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"url","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","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":"bool","name":"_state","type":"bool"}],"name":"toggleFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600a60006101000a81548160ff0219169083151502179055506611c37937e08000600b556040518060800160405280604381526020016200356960439139600c90805190602001906200005b9291906200021d565b503480156200006957600080fd5b506040518060400160405280600881526020017f42726f63756c61730000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f42524f53000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000ee9291906200021d565b508060039080519060200190620001079291906200021d565b50620001186200014660201b60201c565b600081905550505062000140620001346200014f60201b60201c565b6200015760201b60201c565b62000332565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200022b90620002cd565b90600052602060002090601f0160209004810192826200024f57600085556200029b565b82601f106200026a57805160ff19168380011785556200029b565b828001600101855582156200029b579182015b828111156200029a5782518255916020019190600101906200027d565b5b509050620002aa9190620002ae565b5090565b5b80821115620002c9576000816000905550600101620002af565b5090565b60006002820490506001821680620002e657607f821691505b60208210811415620002fd57620002fc62000303565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61322780620003426000396000f3fe6080604052600436106101c25760003560e01c806370a08231116100f7578063a22cb46511610095578063dc8e92ea11610064578063dc8e92ea146105fe578063e1fe470c14610627578063e985e9c514610650578063f2fde38b1461068d576101c2565b8063a22cb46514610532578063b88d4fde1461055b578063c87b56dd14610584578063c884ef83146105c1576101c2565b80638da5cb5b116100d15780638da5cb5b146104a95780638db89f07146104d457806395851a65146104fd57806395d89b4114610507576101c2565b806370a0823114610439578063715018a6146104765780637c928fe91461048d576101c2565b806332cb6b0c1161016457806344a0d68a1161013e57806344a0d68a1461037f57806355f804b3146103a85780635bcabf04146103d15780636352211e146103fc576101c2565b806332cb6b0c146103145780633ccfd60b1461033f57806342842e0e14610356576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806313faede61461029557806318160ddd146102c057806323b872dd146102eb576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e991906127dc565b6106b6565b6040516101fb9190612b08565b60405180910390f35b34801561021057600080fd5b50610219610748565b6040516102269190612b23565b60405180910390f35b34801561023b57600080fd5b506102566004803603810190610251919061286f565b6107da565b6040516102639190612aa1565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612736565b610856565b005b3480156102a157600080fd5b506102aa610997565b6040516102b79190612be5565b60405180910390f35b3480156102cc57600080fd5b506102d561099d565b6040516102e29190612be5565b60405180910390f35b3480156102f757600080fd5b50610312600480360381019061030d9190612630565b6109b4565b005b34801561032057600080fd5b50610329610cd9565b6040516103369190612be5565b60405180910390f35b34801561034b57600080fd5b50610354610cdf565b005b34801561036257600080fd5b5061037d60048036038101906103789190612630565b610d67565b005b34801561038b57600080fd5b506103a660048036038101906103a1919061286f565b610d87565b005b3480156103b457600080fd5b506103cf60048036038101906103ca919061282e565b610d99565b005b3480156103dd57600080fd5b506103e6610dbb565b6040516103f39190612b23565b60405180910390f35b34801561040857600080fd5b50610423600480360381019061041e919061286f565b610e49565b6040516104309190612aa1565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b91906125cb565b610e5b565b60405161046d9190612be5565b60405180910390f35b34801561048257600080fd5b5061048b610f14565b005b6104a760048036038101906104a2919061286f565b610f28565b005b3480156104b557600080fd5b506104be61112e565b6040516104cb9190612aa1565b60405180910390f35b3480156104e057600080fd5b506104fb60048036038101906104f6919061286f565b611158565b005b6105056111bb565b005b34801561051357600080fd5b5061051c6112ac565b6040516105299190612b23565b60405180910390f35b34801561053e57600080fd5b50610559600480360381019061055491906126fa565b61133e565b005b34801561056757600080fd5b50610582600480360381019061057d919061267f565b6114b6565b005b34801561059057600080fd5b506105ab60048036038101906105a6919061286f565b611529565b6040516105b89190612b23565b60405180910390f35b3480156105cd57600080fd5b506105e860048036038101906105e391906125cb565b611588565b6040516105f59190612b08565b60405180910390f35b34801561060a57600080fd5b5061062560048036038101906106209190612772565b6115a8565b005b34801561063357600080fd5b5061064e600480360381019061064991906127b3565b611622565b005b34801561065c57600080fd5b50610677600480360381019061067291906125f4565b611647565b6040516106849190612b08565b60405180910390f35b34801561069957600080fd5b506106b460048036038101906106af91906125cb565b6116db565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061071157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107415750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461075790612ecc565b80601f016020809104026020016040519081016040528092919081815260200182805461078390612ecc565b80156107d05780601f106107a5576101008083540402835291602001916107d0565b820191906000526020600020905b8154815290600101906020018083116107b357829003601f168201915b5050505050905090565b60006107e58261175f565b61081b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061086182610e49565b90508073ffffffffffffffffffffffffffffffffffffffff166108826117be565b73ffffffffffffffffffffffffffffffffffffffff16146108e5576108ae816108a96117be565b611647565b6108e4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600b5481565b60006109a76117c6565b6001546000540303905090565b60006109bf826117cf565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a26576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610a328461189d565b91509150610a488187610a436117be565b6118bf565b610a9457610a5d86610a586117be565b611647565b610a93576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610afb576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b088686866001611903565b8015610b1357600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610be185610bbd888887611909565b7c020000000000000000000000000000000000000000000000000000000017611930565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610c69576000600185019050600060046000838152602001908152602001600020541415610c67576000548114610c66578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610cd1868686600161195b565b505050505050565b611a0a81565b610ce7611961565b6000610cf161112e565b73ffffffffffffffffffffffffffffffffffffffff1647604051610d1490612a8c565b60006040518083038185875af1925050503d8060008114610d51576040519150601f19603f3d011682016040523d82523d6000602084013e610d56565b606091505b5050905080610d6457600080fd5b50565b610d82838383604051806020016040528060008152506114b6565b505050565b610d8f611961565b80600b8190555050565b610da1611961565b80600c9080519060200190610db7929190612359565b5050565b600c8054610dc890612ecc565b80601f0160208091040260200160405190810160405280929190818152602001828054610df490612ecc565b8015610e415780601f10610e1657610100808354040283529160200191610e41565b820191906000526020600020905b815481529060010190602001808311610e2457829003601f168201915b505050505081565b6000610e54826117cf565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ec3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610f1c611961565b610f2660006119df565b565b600a60009054906101000a900460ff16610f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6e90612bc5565b60405180910390fd5b611a0a81610f8361099d565b610f8d9190612d01565b1115610fc5576040517fd565523400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561106c57600b54816110259190612d88565b341015611067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105e90612b65565b60405180910390fd5b6110c9565b600b5460018261107c9190612de2565b6110869190612d88565b3410156110c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bf90612b65565b60405180910390fd5b5b6001600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061112b3382611aa5565b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611160611961565b611a0a8161116c61099d565b6111769190612d01565b11156111ae576040517fd565523400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111b83382611aa5565b50565b600a60009054906101000a900460ff161561120b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120290612b85565b60405180910390fd5b600b54341015611250576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124790612b65565b60405180910390fd5b611a0a600161125d61099d565b6112679190612d01565b111561129f576040517fd565523400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112aa336001611aa5565b565b6060600380546112bb90612ecc565b80601f01602080910402602001604051908101604052809291908181526020018280546112e790612ecc565b80156113345780601f1061130957610100808354040283529160200191611334565b820191906000526020600020905b81548152906001019060200180831161131757829003601f168201915b5050505050905090565b6113466117be565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113ab576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006113b86117be565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114656117be565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114aa9190612b08565b60405180910390a35050565b6114c18484846109b4565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611523576114ec84848484611ac3565b611522576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606000611535611c23565b905060008151116115555760405180602001604052806000815250611580565b8061155f84611cb5565b604051602001611570929190612a5d565b6040516020818303038152906040525b915050919050565b60096020528060005260406000206000915054906101000a900460ff1681565b6115b0611961565b60008151905060005b8181101561161d5761160a8382815181106115fd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611e62565b808061161590612f2f565b9150506115b9565b505050565b61162a611961565b80600a60006101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116e3611961565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a90612b45565b60405180910390fd5b61175c816119df565b50565b60008161176a6117c6565b11158015611779575060005482105b80156117b7575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b600080829050806117de6117c6565b11611866576000548110156118655760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611863575b600081141561185957600460008360019003935083815260200190815260200160002054905061182e565b8092505050611898565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b6000808260e81c905060e861191f868684611e70565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611969611e79565b73ffffffffffffffffffffffffffffffffffffffff1661198761112e565b73ffffffffffffffffffffffffffffffffffffffff16146119dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d490612ba5565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611abf828260405180602001604052806000815250611e81565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ae96117be565b8786866040518563ffffffff1660e01b8152600401611b0b9493929190612abc565b602060405180830381600087803b158015611b2557600080fd5b505af1925050508015611b5657506040513d601f19601f82011682018060405250810190611b539190612805565b60015b611bd0573d8060008114611b86576040519150601f19603f3d011682016040523d82523d6000602084013e611b8b565b606091505b50600081511415611bc8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c8054611c3290612ecc565b80601f0160208091040260200160405190810160405280929190818152602001828054611c5e90612ecc565b8015611cab5780601f10611c8057610100808354040283529160200191611cab565b820191906000526020600020905b815481529060010190602001808311611c8e57829003601f168201915b5050505050905090565b60606000821415611cfd576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611e5d565b600082905060005b60008214611d2f578080611d1890612f2f565b915050600a82611d289190612d57565b9150611d05565b60008167ffffffffffffffff811115611d71577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611da35781602001600182028036833780820191505090505b5090505b60008514611e5657600182611dbc9190612de2565b9150600a85611dcb9190612f78565b6030611dd79190612d01565b60f81b818381518110611e13577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611e4f9190612d57565b9450611da7565b8093505050505b919050565b611e6d816000611f1e565b50565b60009392505050565b600033905090565b611e8b8383612172565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611f1957600080549050600083820390505b611ecb6000868380600101945086611ac3565b611f01576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611eb8578160005414611f1657600080fd5b50505b505050565b6000611f29836117cf565b90506000819050600080611f3c8661189d565b915091508415611fa557611f588184611f536117be565b6118bf565b611fa457611f6d83611f686117be565b611647565b611fa3576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b611fb3836000886001611903565b8015611fbe57600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506120668361202385600088611909565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717611930565b600460008881526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000851614156120ee5760006001870190506000600460008381526020019081526020016000205414156120ec5760005481146120eb578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461215883600088600161195b565b600160008154809291906001019190505550505050505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121df576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082141561221a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122276000848385611903565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506122a58361228f6000866000611909565b60e161229d6001871461234f565b901b17611930565b60046000838152602001908152602001600020819055506000819050600082840190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106122c957838301600081905550505061234a600084838561195b565b505050565b6000819050919050565b82805461236590612ecc565b90600052602060002090601f01602090048101928261238757600085556123ce565b82601f106123a057805160ff19168380011785556123ce565b828001600101855582156123ce579182015b828111156123cd5782518255916020019190600101906123b2565b5b5090506123db91906123df565b5090565b5b808211156123f85760008160009055506001016123e0565b5090565b600061240f61240a84612c25565b612c00565b9050808382526020820190508285602086028201111561242e57600080fd5b60005b8581101561245e578161244488826125b6565b845260208401935060208301925050600181019050612431565b5050509392505050565b600061247b61247684612c51565b612c00565b90508281526020810184848401111561249357600080fd5b61249e848285612e8a565b509392505050565b60006124b96124b484612c82565b612c00565b9050828152602081018484840111156124d157600080fd5b6124dc848285612e8a565b509392505050565b6000813590506124f381613195565b92915050565b600082601f83011261250a57600080fd5b813561251a8482602086016123fc565b91505092915050565b600081359050612532816131ac565b92915050565b600081359050612547816131c3565b92915050565b60008151905061255c816131c3565b92915050565b600082601f83011261257357600080fd5b8135612583848260208601612468565b91505092915050565b600082601f83011261259d57600080fd5b81356125ad8482602086016124a6565b91505092915050565b6000813590506125c5816131da565b92915050565b6000602082840312156125dd57600080fd5b60006125eb848285016124e4565b91505092915050565b6000806040838503121561260757600080fd5b6000612615858286016124e4565b9250506020612626858286016124e4565b9150509250929050565b60008060006060848603121561264557600080fd5b6000612653868287016124e4565b9350506020612664868287016124e4565b9250506040612675868287016125b6565b9150509250925092565b6000806000806080858703121561269557600080fd5b60006126a3878288016124e4565b94505060206126b4878288016124e4565b93505060406126c5878288016125b6565b925050606085013567ffffffffffffffff8111156126e257600080fd5b6126ee87828801612562565b91505092959194509250565b6000806040838503121561270d57600080fd5b600061271b858286016124e4565b925050602061272c85828601612523565b9150509250929050565b6000806040838503121561274957600080fd5b6000612757858286016124e4565b9250506020612768858286016125b6565b9150509250929050565b60006020828403121561278457600080fd5b600082013567ffffffffffffffff81111561279e57600080fd5b6127aa848285016124f9565b91505092915050565b6000602082840312156127c557600080fd5b60006127d384828501612523565b91505092915050565b6000602082840312156127ee57600080fd5b60006127fc84828501612538565b91505092915050565b60006020828403121561281757600080fd5b60006128258482850161254d565b91505092915050565b60006020828403121561284057600080fd5b600082013567ffffffffffffffff81111561285a57600080fd5b6128668482850161258c565b91505092915050565b60006020828403121561288157600080fd5b600061288f848285016125b6565b91505092915050565b6128a181612e16565b82525050565b6128b081612e28565b82525050565b60006128c182612cb3565b6128cb8185612cc9565b93506128db818560208601612e99565b6128e481613065565b840191505092915050565b60006128fa82612cbe565b6129048185612ce5565b9350612914818560208601612e99565b61291d81613065565b840191505092915050565b600061293382612cbe565b61293d8185612cf6565b935061294d818560208601612e99565b80840191505092915050565b6000612966602683612ce5565b915061297182613076565b604082019050919050565b6000612989601283612ce5565b9150612994826130c5565b602082019050919050565b60006129ac600583612cf6565b91506129b7826130ee565b600582019050919050565b60006129cf601183612ce5565b91506129da82613117565b602082019050919050565b60006129f2602083612ce5565b91506129fd82613140565b602082019050919050565b6000612a15601083612ce5565b9150612a2082613169565b602082019050919050565b6000612a38600083612cda565b9150612a4382613192565b600082019050919050565b612a5781612e80565b82525050565b6000612a698285612928565b9150612a758284612928565b9150612a808261299f565b91508190509392505050565b6000612a9782612a2b565b9150819050919050565b6000602082019050612ab66000830184612898565b92915050565b6000608082019050612ad16000830187612898565b612ade6020830186612898565b612aeb6040830185612a4e565b8181036060830152612afd81846128b6565b905095945050505050565b6000602082019050612b1d60008301846128a7565b92915050565b60006020820190508181036000830152612b3d81846128ef565b905092915050565b60006020820190508181036000830152612b5e81612959565b9050919050565b60006020820190508181036000830152612b7e8161297c565b9050919050565b60006020820190508181036000830152612b9e816129c2565b9050919050565b60006020820190508181036000830152612bbe816129e5565b9050919050565b60006020820190508181036000830152612bde81612a08565b9050919050565b6000602082019050612bfa6000830184612a4e565b92915050565b6000612c0a612c1b565b9050612c168282612efe565b919050565b6000604051905090565b600067ffffffffffffffff821115612c4057612c3f613036565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612c6c57612c6b613036565b5b612c7582613065565b9050602081019050919050565b600067ffffffffffffffff821115612c9d57612c9c613036565b5b612ca682613065565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612d0c82612e80565b9150612d1783612e80565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612d4c57612d4b612fa9565b5b828201905092915050565b6000612d6282612e80565b9150612d6d83612e80565b925082612d7d57612d7c612fd8565b5b828204905092915050565b6000612d9382612e80565b9150612d9e83612e80565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612dd757612dd6612fa9565b5b828202905092915050565b6000612ded82612e80565b9150612df883612e80565b925082821015612e0b57612e0a612fa9565b5b828203905092915050565b6000612e2182612e60565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612eb7578082015181840152602081019050612e9c565b83811115612ec6576000848401525b50505050565b60006002820490506001821680612ee457607f821691505b60208210811415612ef857612ef7613007565b5b50919050565b612f0782613065565b810181811067ffffffffffffffff82111715612f2657612f25613036565b5b80604052505050565b6000612f3a82612e80565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612f6d57612f6c612fa9565b5b600182019050919050565b6000612f8382612e80565b9150612f8e83612e80565b925082612f9e57612f9d612fd8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f46726565206d696e74206973206f70656e000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f46726565206d696e7420636c6f73656400000000000000000000000000000000600082015250565b50565b61319e81612e16565b81146131a957600080fd5b50565b6131b581612e28565b81146131c057600080fd5b50565b6131cc81612e34565b81146131d757600080fd5b50565b6131e381612e80565b81146131ee57600080fd5b5056fea2646970667358221220cc7b5b26cfa1a33b2f0b9ae8fc9ec5ea1f60e6f6985db2e4c8f6307a6d9f86c264736f6c63430008040033697066733a2f2f6261667962656961757836697576617a61687137347565687861767372716c6a3236686c37656b6279773537766f626670616734636474336d35712f
Deployed Bytecode
0x6080604052600436106101c25760003560e01c806370a08231116100f7578063a22cb46511610095578063dc8e92ea11610064578063dc8e92ea146105fe578063e1fe470c14610627578063e985e9c514610650578063f2fde38b1461068d576101c2565b8063a22cb46514610532578063b88d4fde1461055b578063c87b56dd14610584578063c884ef83146105c1576101c2565b80638da5cb5b116100d15780638da5cb5b146104a95780638db89f07146104d457806395851a65146104fd57806395d89b4114610507576101c2565b806370a0823114610439578063715018a6146104765780637c928fe91461048d576101c2565b806332cb6b0c1161016457806344a0d68a1161013e57806344a0d68a1461037f57806355f804b3146103a85780635bcabf04146103d15780636352211e146103fc576101c2565b806332cb6b0c146103145780633ccfd60b1461033f57806342842e0e14610356576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806313faede61461029557806318160ddd146102c057806323b872dd146102eb576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e991906127dc565b6106b6565b6040516101fb9190612b08565b60405180910390f35b34801561021057600080fd5b50610219610748565b6040516102269190612b23565b60405180910390f35b34801561023b57600080fd5b506102566004803603810190610251919061286f565b6107da565b6040516102639190612aa1565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612736565b610856565b005b3480156102a157600080fd5b506102aa610997565b6040516102b79190612be5565b60405180910390f35b3480156102cc57600080fd5b506102d561099d565b6040516102e29190612be5565b60405180910390f35b3480156102f757600080fd5b50610312600480360381019061030d9190612630565b6109b4565b005b34801561032057600080fd5b50610329610cd9565b6040516103369190612be5565b60405180910390f35b34801561034b57600080fd5b50610354610cdf565b005b34801561036257600080fd5b5061037d60048036038101906103789190612630565b610d67565b005b34801561038b57600080fd5b506103a660048036038101906103a1919061286f565b610d87565b005b3480156103b457600080fd5b506103cf60048036038101906103ca919061282e565b610d99565b005b3480156103dd57600080fd5b506103e6610dbb565b6040516103f39190612b23565b60405180910390f35b34801561040857600080fd5b50610423600480360381019061041e919061286f565b610e49565b6040516104309190612aa1565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b91906125cb565b610e5b565b60405161046d9190612be5565b60405180910390f35b34801561048257600080fd5b5061048b610f14565b005b6104a760048036038101906104a2919061286f565b610f28565b005b3480156104b557600080fd5b506104be61112e565b6040516104cb9190612aa1565b60405180910390f35b3480156104e057600080fd5b506104fb60048036038101906104f6919061286f565b611158565b005b6105056111bb565b005b34801561051357600080fd5b5061051c6112ac565b6040516105299190612b23565b60405180910390f35b34801561053e57600080fd5b50610559600480360381019061055491906126fa565b61133e565b005b34801561056757600080fd5b50610582600480360381019061057d919061267f565b6114b6565b005b34801561059057600080fd5b506105ab60048036038101906105a6919061286f565b611529565b6040516105b89190612b23565b60405180910390f35b3480156105cd57600080fd5b506105e860048036038101906105e391906125cb565b611588565b6040516105f59190612b08565b60405180910390f35b34801561060a57600080fd5b5061062560048036038101906106209190612772565b6115a8565b005b34801561063357600080fd5b5061064e600480360381019061064991906127b3565b611622565b005b34801561065c57600080fd5b50610677600480360381019061067291906125f4565b611647565b6040516106849190612b08565b60405180910390f35b34801561069957600080fd5b506106b460048036038101906106af91906125cb565b6116db565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061071157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107415750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461075790612ecc565b80601f016020809104026020016040519081016040528092919081815260200182805461078390612ecc565b80156107d05780601f106107a5576101008083540402835291602001916107d0565b820191906000526020600020905b8154815290600101906020018083116107b357829003601f168201915b5050505050905090565b60006107e58261175f565b61081b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061086182610e49565b90508073ffffffffffffffffffffffffffffffffffffffff166108826117be565b73ffffffffffffffffffffffffffffffffffffffff16146108e5576108ae816108a96117be565b611647565b6108e4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600b5481565b60006109a76117c6565b6001546000540303905090565b60006109bf826117cf565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a26576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610a328461189d565b91509150610a488187610a436117be565b6118bf565b610a9457610a5d86610a586117be565b611647565b610a93576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610afb576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b088686866001611903565b8015610b1357600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610be185610bbd888887611909565b7c020000000000000000000000000000000000000000000000000000000017611930565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610c69576000600185019050600060046000838152602001908152602001600020541415610c67576000548114610c66578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610cd1868686600161195b565b505050505050565b611a0a81565b610ce7611961565b6000610cf161112e565b73ffffffffffffffffffffffffffffffffffffffff1647604051610d1490612a8c565b60006040518083038185875af1925050503d8060008114610d51576040519150601f19603f3d011682016040523d82523d6000602084013e610d56565b606091505b5050905080610d6457600080fd5b50565b610d82838383604051806020016040528060008152506114b6565b505050565b610d8f611961565b80600b8190555050565b610da1611961565b80600c9080519060200190610db7929190612359565b5050565b600c8054610dc890612ecc565b80601f0160208091040260200160405190810160405280929190818152602001828054610df490612ecc565b8015610e415780601f10610e1657610100808354040283529160200191610e41565b820191906000526020600020905b815481529060010190602001808311610e2457829003601f168201915b505050505081565b6000610e54826117cf565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ec3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610f1c611961565b610f2660006119df565b565b600a60009054906101000a900460ff16610f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6e90612bc5565b60405180910390fd5b611a0a81610f8361099d565b610f8d9190612d01565b1115610fc5576040517fd565523400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561106c57600b54816110259190612d88565b341015611067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105e90612b65565b60405180910390fd5b6110c9565b600b5460018261107c9190612de2565b6110869190612d88565b3410156110c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bf90612b65565b60405180910390fd5b5b6001600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061112b3382611aa5565b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611160611961565b611a0a8161116c61099d565b6111769190612d01565b11156111ae576040517fd565523400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111b83382611aa5565b50565b600a60009054906101000a900460ff161561120b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120290612b85565b60405180910390fd5b600b54341015611250576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124790612b65565b60405180910390fd5b611a0a600161125d61099d565b6112679190612d01565b111561129f576040517fd565523400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112aa336001611aa5565b565b6060600380546112bb90612ecc565b80601f01602080910402602001604051908101604052809291908181526020018280546112e790612ecc565b80156113345780601f1061130957610100808354040283529160200191611334565b820191906000526020600020905b81548152906001019060200180831161131757829003601f168201915b5050505050905090565b6113466117be565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113ab576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006113b86117be565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114656117be565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114aa9190612b08565b60405180910390a35050565b6114c18484846109b4565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611523576114ec84848484611ac3565b611522576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606000611535611c23565b905060008151116115555760405180602001604052806000815250611580565b8061155f84611cb5565b604051602001611570929190612a5d565b6040516020818303038152906040525b915050919050565b60096020528060005260406000206000915054906101000a900460ff1681565b6115b0611961565b60008151905060005b8181101561161d5761160a8382815181106115fd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611e62565b808061161590612f2f565b9150506115b9565b505050565b61162a611961565b80600a60006101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116e3611961565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a90612b45565b60405180910390fd5b61175c816119df565b50565b60008161176a6117c6565b11158015611779575060005482105b80156117b7575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b600080829050806117de6117c6565b11611866576000548110156118655760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611863575b600081141561185957600460008360019003935083815260200190815260200160002054905061182e565b8092505050611898565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b6000808260e81c905060e861191f868684611e70565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611969611e79565b73ffffffffffffffffffffffffffffffffffffffff1661198761112e565b73ffffffffffffffffffffffffffffffffffffffff16146119dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d490612ba5565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611abf828260405180602001604052806000815250611e81565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ae96117be565b8786866040518563ffffffff1660e01b8152600401611b0b9493929190612abc565b602060405180830381600087803b158015611b2557600080fd5b505af1925050508015611b5657506040513d601f19601f82011682018060405250810190611b539190612805565b60015b611bd0573d8060008114611b86576040519150601f19603f3d011682016040523d82523d6000602084013e611b8b565b606091505b50600081511415611bc8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c8054611c3290612ecc565b80601f0160208091040260200160405190810160405280929190818152602001828054611c5e90612ecc565b8015611cab5780601f10611c8057610100808354040283529160200191611cab565b820191906000526020600020905b815481529060010190602001808311611c8e57829003601f168201915b5050505050905090565b60606000821415611cfd576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611e5d565b600082905060005b60008214611d2f578080611d1890612f2f565b915050600a82611d289190612d57565b9150611d05565b60008167ffffffffffffffff811115611d71577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611da35781602001600182028036833780820191505090505b5090505b60008514611e5657600182611dbc9190612de2565b9150600a85611dcb9190612f78565b6030611dd79190612d01565b60f81b818381518110611e13577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611e4f9190612d57565b9450611da7565b8093505050505b919050565b611e6d816000611f1e565b50565b60009392505050565b600033905090565b611e8b8383612172565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611f1957600080549050600083820390505b611ecb6000868380600101945086611ac3565b611f01576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611eb8578160005414611f1657600080fd5b50505b505050565b6000611f29836117cf565b90506000819050600080611f3c8661189d565b915091508415611fa557611f588184611f536117be565b6118bf565b611fa457611f6d83611f686117be565b611647565b611fa3576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b611fb3836000886001611903565b8015611fbe57600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506120668361202385600088611909565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717611930565b600460008881526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000851614156120ee5760006001870190506000600460008381526020019081526020016000205414156120ec5760005481146120eb578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461215883600088600161195b565b600160008154809291906001019190505550505050505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121df576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082141561221a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122276000848385611903565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506122a58361228f6000866000611909565b60e161229d6001871461234f565b901b17611930565b60046000838152602001908152602001600020819055506000819050600082840190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106122c957838301600081905550505061234a600084838561195b565b505050565b6000819050919050565b82805461236590612ecc565b90600052602060002090601f01602090048101928261238757600085556123ce565b82601f106123a057805160ff19168380011785556123ce565b828001600101855582156123ce579182015b828111156123cd5782518255916020019190600101906123b2565b5b5090506123db91906123df565b5090565b5b808211156123f85760008160009055506001016123e0565b5090565b600061240f61240a84612c25565b612c00565b9050808382526020820190508285602086028201111561242e57600080fd5b60005b8581101561245e578161244488826125b6565b845260208401935060208301925050600181019050612431565b5050509392505050565b600061247b61247684612c51565b612c00565b90508281526020810184848401111561249357600080fd5b61249e848285612e8a565b509392505050565b60006124b96124b484612c82565b612c00565b9050828152602081018484840111156124d157600080fd5b6124dc848285612e8a565b509392505050565b6000813590506124f381613195565b92915050565b600082601f83011261250a57600080fd5b813561251a8482602086016123fc565b91505092915050565b600081359050612532816131ac565b92915050565b600081359050612547816131c3565b92915050565b60008151905061255c816131c3565b92915050565b600082601f83011261257357600080fd5b8135612583848260208601612468565b91505092915050565b600082601f83011261259d57600080fd5b81356125ad8482602086016124a6565b91505092915050565b6000813590506125c5816131da565b92915050565b6000602082840312156125dd57600080fd5b60006125eb848285016124e4565b91505092915050565b6000806040838503121561260757600080fd5b6000612615858286016124e4565b9250506020612626858286016124e4565b9150509250929050565b60008060006060848603121561264557600080fd5b6000612653868287016124e4565b9350506020612664868287016124e4565b9250506040612675868287016125b6565b9150509250925092565b6000806000806080858703121561269557600080fd5b60006126a3878288016124e4565b94505060206126b4878288016124e4565b93505060406126c5878288016125b6565b925050606085013567ffffffffffffffff8111156126e257600080fd5b6126ee87828801612562565b91505092959194509250565b6000806040838503121561270d57600080fd5b600061271b858286016124e4565b925050602061272c85828601612523565b9150509250929050565b6000806040838503121561274957600080fd5b6000612757858286016124e4565b9250506020612768858286016125b6565b9150509250929050565b60006020828403121561278457600080fd5b600082013567ffffffffffffffff81111561279e57600080fd5b6127aa848285016124f9565b91505092915050565b6000602082840312156127c557600080fd5b60006127d384828501612523565b91505092915050565b6000602082840312156127ee57600080fd5b60006127fc84828501612538565b91505092915050565b60006020828403121561281757600080fd5b60006128258482850161254d565b91505092915050565b60006020828403121561284057600080fd5b600082013567ffffffffffffffff81111561285a57600080fd5b6128668482850161258c565b91505092915050565b60006020828403121561288157600080fd5b600061288f848285016125b6565b91505092915050565b6128a181612e16565b82525050565b6128b081612e28565b82525050565b60006128c182612cb3565b6128cb8185612cc9565b93506128db818560208601612e99565b6128e481613065565b840191505092915050565b60006128fa82612cbe565b6129048185612ce5565b9350612914818560208601612e99565b61291d81613065565b840191505092915050565b600061293382612cbe565b61293d8185612cf6565b935061294d818560208601612e99565b80840191505092915050565b6000612966602683612ce5565b915061297182613076565b604082019050919050565b6000612989601283612ce5565b9150612994826130c5565b602082019050919050565b60006129ac600583612cf6565b91506129b7826130ee565b600582019050919050565b60006129cf601183612ce5565b91506129da82613117565b602082019050919050565b60006129f2602083612ce5565b91506129fd82613140565b602082019050919050565b6000612a15601083612ce5565b9150612a2082613169565b602082019050919050565b6000612a38600083612cda565b9150612a4382613192565b600082019050919050565b612a5781612e80565b82525050565b6000612a698285612928565b9150612a758284612928565b9150612a808261299f565b91508190509392505050565b6000612a9782612a2b565b9150819050919050565b6000602082019050612ab66000830184612898565b92915050565b6000608082019050612ad16000830187612898565b612ade6020830186612898565b612aeb6040830185612a4e565b8181036060830152612afd81846128b6565b905095945050505050565b6000602082019050612b1d60008301846128a7565b92915050565b60006020820190508181036000830152612b3d81846128ef565b905092915050565b60006020820190508181036000830152612b5e81612959565b9050919050565b60006020820190508181036000830152612b7e8161297c565b9050919050565b60006020820190508181036000830152612b9e816129c2565b9050919050565b60006020820190508181036000830152612bbe816129e5565b9050919050565b60006020820190508181036000830152612bde81612a08565b9050919050565b6000602082019050612bfa6000830184612a4e565b92915050565b6000612c0a612c1b565b9050612c168282612efe565b919050565b6000604051905090565b600067ffffffffffffffff821115612c4057612c3f613036565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612c6c57612c6b613036565b5b612c7582613065565b9050602081019050919050565b600067ffffffffffffffff821115612c9d57612c9c613036565b5b612ca682613065565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612d0c82612e80565b9150612d1783612e80565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612d4c57612d4b612fa9565b5b828201905092915050565b6000612d6282612e80565b9150612d6d83612e80565b925082612d7d57612d7c612fd8565b5b828204905092915050565b6000612d9382612e80565b9150612d9e83612e80565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612dd757612dd6612fa9565b5b828202905092915050565b6000612ded82612e80565b9150612df883612e80565b925082821015612e0b57612e0a612fa9565b5b828203905092915050565b6000612e2182612e60565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612eb7578082015181840152602081019050612e9c565b83811115612ec6576000848401525b50505050565b60006002820490506001821680612ee457607f821691505b60208210811415612ef857612ef7613007565b5b50919050565b612f0782613065565b810181811067ffffffffffffffff82111715612f2657612f25613036565b5b80604052505050565b6000612f3a82612e80565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612f6d57612f6c612fa9565b5b600182019050919050565b6000612f8382612e80565b9150612f8e83612e80565b925082612f9e57612f9d612fd8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f46726565206d696e74206973206f70656e000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f46726565206d696e7420636c6f73656400000000000000000000000000000000600082015250565b50565b61319e81612e16565b81146131a957600080fd5b50565b6131b581612e28565b81146131c057600080fd5b50565b6131cc81612e34565b81146131d757600080fd5b50565b6131e381612e80565b81146131ee57600080fd5b5056fea2646970667358221220cc7b5b26cfa1a33b2f0b9ae8fc9ec5ea1f60e6f6985db2e4c8f6307a6d9f86c264736f6c63430008040033
Deployed Bytecode Sourcemap
50133:2548:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20583:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26207:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27958:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27506:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50344:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19637:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37299:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50296:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51814:149;;;;;;;;;;;;;:::i;:::-;;28848:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52069:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51971:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50386:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25996:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21262:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5338:103;;;;;;;;;;;;;:::i;:::-;;50540:491;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4690:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51313:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51039:262;;;:::i;:::-;;26376:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28234:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29104:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52159:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50212:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51502:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51708:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28613:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5596:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20583:615;20668:4;20983:10;20968:25;;:11;:25;;;;:102;;;;21060:10;21045:25;;:11;:25;;;;20968:102;:179;;;;21137:10;21122:25;;:11;:25;;;;20968:179;20948:199;;20583:615;;;:::o;26207:100::-;26261:13;26294:5;26287:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26207:100;:::o;27958:204::-;28026:7;28051:16;28059:7;28051;:16::i;:::-;28046:64;;28076:34;;;;;;;;;;;;;;28046:64;28130:15;:24;28146:7;28130:24;;;;;;;;;;;;;;;;;;;;;28123:31;;27958:204;;;:::o;27506:386::-;27579:13;27595:16;27603:7;27595;:16::i;:::-;27579:32;;27651:5;27628:28;;:19;:17;:19::i;:::-;:28;;;27624:175;;27676:44;27693:5;27700:19;:17;:19::i;:::-;27676:16;:44::i;:::-;27671:128;;27748:35;;;;;;;;;;;;;;27671:128;27624:175;27838:2;27811:15;:24;27827:7;27811:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;27876:7;27872:2;27856:28;;27865:5;27856:28;;;;;;;;;;;;27506:386;;;:::o;50344:33::-;;;;:::o;19637:315::-;19690:7;19918:15;:13;:15::i;:::-;19903:12;;19887:13;;:28;:46;19880:53;;19637:315;:::o;37299:2800::-;37433:27;37463;37482:7;37463:18;:27::i;:::-;37433:57;;37548:4;37507:45;;37523:19;37507:45;;;37503:86;;37561:28;;;;;;;;;;;;;;37503:86;37603:27;37632:23;37659:28;37679:7;37659:19;:28::i;:::-;37602:85;;;;37787:62;37806:15;37823:4;37829:19;:17;:19::i;:::-;37787:18;:62::i;:::-;37782:174;;37869:43;37886:4;37892:19;:17;:19::i;:::-;37869:16;:43::i;:::-;37864:92;;37921:35;;;;;;;;;;;;;;37864:92;37782:174;37987:1;37973:16;;:2;:16;;;37969:52;;;37998:23;;;;;;;;;;;;;;37969:52;38034:43;38056:4;38062:2;38066:7;38075:1;38034:21;:43::i;:::-;38170:15;38167:2;;;38310:1;38289:19;38282:30;38167:2;38705:18;:24;38724:4;38705:24;;;;;;;;;;;;;;;;38703:26;;;;;;;;;;;;38774:18;:22;38793:2;38774:22;;;;;;;;;;;;;;;;38772:24;;;;;;;;;;;39096:145;39133:2;39181:45;39196:4;39202:2;39206:19;39181:14;:45::i;:::-;17032:8;39154:72;39096:18;:145::i;:::-;39067:17;:26;39085:7;39067:26;;;;;;;;;;;:174;;;;39411:1;17032:8;39361:19;:46;:51;39357:626;;;39433:19;39465:1;39455:7;:11;39433:33;;39622:1;39588:17;:30;39606:11;39588:30;;;;;;;;;;;;:35;39584:384;;;39726:13;;39711:11;:28;39707:242;;39906:19;39873:17;:30;39891:11;39873:30;;;;;;;;;;;:52;;;;39707:242;39584:384;39357:626;;40030:7;40026:2;40011:27;;40020:4;40011:27;;;;;;;;;;;;40049:42;40070:4;40076:2;40080:7;40089:1;40049:20;:42::i;:::-;37299:2800;;;;;;:::o;50296:41::-;50333:4;50296:41;:::o;51814:149::-;4576:13;:11;:13::i;:::-;51865:7:::1;51886;:5;:7::i;:::-;51878:21;;51907;51878:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51864:69;;;51952:2;51944:11;;;::::0;::::1;;4600:1;51814:149::o:0;28848:185::-;28986:39;29003:4;29009:2;29013:7;28986:39;;;;;;;;;;;;:16;:39::i;:::-;28848:185;;;:::o;52069:82::-;4576:13;:11;:13::i;:::-;52138:5:::1;52131:4;:12;;;;52069:82:::0;:::o;51971:90::-;4576:13;:11;:13::i;:::-;52050:3:::1;52040:7;:13;;;;;;;;;;;;:::i;:::-;;51971:90:::0;:::o;50386:93::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25996:144::-;26060:7;26103:27;26122:7;26103:18;:27::i;:::-;26080:52;;25996:144;;;:::o;21262:224::-;21326:7;21367:1;21350:19;;:5;:19;;;21346:60;;;21378:28;;;;;;;;;;;;;;21346:60;15984:13;21424:18;:25;21443:5;21424:25;;;;;;;;;;;;;;;;:54;21417:61;;21262:224;;;:::o;5338:103::-;4576:13;:11;:13::i;:::-;5403:30:::1;5430:1;5403:18;:30::i;:::-;5338:103::o:0;50540:491::-;50611:14;;;;;;;;;;;50603:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;50333:4;50676:7;50660:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:36;50657:64;;;50705:16;;;;;;;;;;;;;;50657:64;50741:7;:19;50749:10;50741:19;;;;;;;;;;;;;;;;;;;;;;;;;50738:206;;;50808:4;;50798:7;:14;;;;:::i;:::-;50785:9;:27;;50777:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;50738:206;;;50905:4;;50900:1;50890:7;:11;;;;:::i;:::-;50889:20;;;;:::i;:::-;50876:9;:33;;50868:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;50738:206;50978:4;50956:7;:19;50964:10;50956:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;50993:30;51003:10;51015:7;50993:9;:30::i;:::-;50540:491;:::o;4690:87::-;4736:7;4763:6;;;;;;;;;;;4756:13;;4690:87;:::o;51313:181::-;4576:13;:11;:13::i;:::-;50333:4:::1;51402:6;51386:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;51383:63;;;51430:16;;;;;;;;;;;;;;51383:63;51457:29;51467:10;51479:6;51457:9;:29::i;:::-;51313:181:::0;:::o;51039:262::-;51094:14;;;;;;;;;;;51093:15;51085:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;51162:4;;51149:9;:17;;51141:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;50333:4;51219:1;51203:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:30;51200:58;;;51242:16;;;;;;;;;;;;;;51200:58;51269:24;51279:10;51291:1;51269:9;:24::i;:::-;51039:262::o;26376:104::-;26432:13;26465:7;26458:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26376:104;:::o;28234:308::-;28345:19;:17;:19::i;:::-;28333:31;;:8;:31;;;28329:61;;;28373:17;;;;;;;;;;;;;;28329:61;28455:8;28403:18;:39;28422:19;:17;:19::i;:::-;28403:39;;;;;;;;;;;;;;;:49;28443:8;28403:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;28515:8;28479:55;;28494:19;:17;:19::i;:::-;28479:55;;;28525:8;28479:55;;;;;;:::i;:::-;;;;;;;;28234:308;;:::o;29104:399::-;29271:31;29284:4;29290:2;29294:7;29271:12;:31::i;:::-;29335:1;29317:2;:14;;;:19;29313:183;;29356:56;29387:4;29393:2;29397:7;29406:5;29356:30;:56::i;:::-;29351:145;;29440:40;;;;;;;;;;;;;;29351:145;29313:183;29104:399;;;;:::o;52159:295::-;52233:13;52259:28;52290:10;:8;:10::i;:::-;52259:41;;52349:1;52324:14;52318:28;:32;:128;;;;;;;;;;;;;;;;;52386:14;52402:19;:8;:17;:19::i;:::-;52369:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52318:128;52311:135;;;52159:295;;;:::o;50212:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;51502:198::-;4576:13;:11;:13::i;:::-;51578:11:::1;51592:8;:15;51578:29;;51623:9;51618:75;51638:3;51634:1;:7;51618:75;;;51663:18;51669:8;51678:1;51669:11;;;;;;;;;;;;;;;;;;;;;;51663:5;:18::i;:::-;51643:3;;;;;:::i;:::-;;;;51618:75;;;;4600:1;51502:198:::0;:::o;51708:98::-;4576:13;:11;:13::i;:::-;51792:6:::1;51775:14;;:23;;;;;;;;;;;;;;;;;;51708:98:::0;:::o;28613:164::-;28710:4;28734:18;:25;28753:5;28734:25;;;;;;;;;;;;;;;:35;28760:8;28734:35;;;;;;;;;;;;;;;;;;;;;;;;;28727:42;;28613:164;;;;:::o;5596:201::-;4576:13;:11;:13::i;:::-;5705:1:::1;5685:22;;:8;:22;;;;5677:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5761:28;5780:8;5761:18;:28::i;:::-;5596:201:::0;:::o;29758:273::-;29815:4;29871:7;29852:15;:13;:15::i;:::-;:26;;:66;;;;;29905:13;;29895:7;:23;29852:66;:152;;;;;30003:1;16754:8;29956:17;:26;29974:7;29956:26;;;;;;;;;;;;:43;:48;29852:152;29832:172;;29758:273;;;:::o;47835:105::-;47895:7;47922:10;47915:17;;47835:105;:::o;52577:101::-;52642:7;52669:1;52662:8;;52577:101;:::o;22913:1129::-;22980:7;23000:12;23015:7;23000:22;;23083:4;23064:15;:13;:15::i;:::-;:23;23060:915;;23117:13;;23110:4;:20;23106:869;;;23155:14;23172:17;:23;23190:4;23172:23;;;;;;;;;;;;23155:40;;23288:1;16754:8;23261:6;:23;:28;23257:699;;;23780:113;23797:1;23787:6;:11;23780:113;;;23840:17;:25;23858:6;;;;;;;23840:25;;;;;;;;;;;;23831:34;;23780:113;;;23926:6;23919:13;;;;;;23257:699;23106:869;;23060:915;24003:31;;;;;;;;;;;;;;22913:1129;;;;:::o;35635:652::-;35730:27;35759:23;35800:53;35856:15;35800:71;;36042:7;36036:4;36029:21;36077:22;36071:4;36064:36;36153:4;36147;36137:21;36114:44;;36249:19;36243:26;36224:45;;35980:300;;;;:::o;36400:645::-;36542:11;36704:15;36698:4;36694:26;36686:34;;36863:15;36852:9;36848:31;36835:44;;37010:15;36999:9;36996:30;36989:4;36978:9;36975:19;36972:55;36962:65;;36575:463;;;;;:::o;46668:159::-;;;;;:::o;44905:392::-;45049:7;45069:24;45172:19;45153:17;45149:43;45128:64;;17155:3;45228:39;45239:4;45245:2;45249:17;45228:10;:39::i;:::-;45220:48;;:69;;45213:76;;;44905:392;;;;;:::o;25487:447::-;25567:14;25735:15;25728:5;25724:27;25715:36;;25909:5;25895:11;25871:22;25867:40;25864:51;25857:5;25854:62;25844:72;;25603:324;;;;:::o;47486:158::-;;;;;:::o;4855:132::-;4930:12;:10;:12::i;:::-;4919:23;;:7;:5;:7::i;:::-;:23;;;4911:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4855:132::o;5957:191::-;6031:16;6050:6;;;;;;;;;;;6031:25;;6076:8;6067:6;;:17;;;;;;;;;;;;;;;;;;6131:8;6100:40;;6121:8;6100:40;;;;;;;;;;;;5957:191;;:::o;30115:104::-;30184:27;30194:2;30198:8;30184:27;;;;;;;;;;;;:9;:27::i;:::-;30115:104;;:::o;44037:716::-;44200:4;44246:2;44221:45;;;44267:19;:17;:19::i;:::-;44288:4;44294:7;44303:5;44221:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44217:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44521:1;44504:6;:13;:18;44500:235;;;44550:40;;;;;;;;;;;;;;44500:235;44693:6;44687:13;44678:6;44674:2;44670:15;44663:38;44217:529;44390:54;;;44380:64;;;:6;:64;;;;44373:71;;;44037:716;;;;;;:::o;52461:108::-;52521:13;52554:7;52547:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52461:108;:::o;495:723::-;551:13;781:1;772:5;:10;768:53;;;799:10;;;;;;;;;;;;;;;;;;;;;768:53;831:12;846:5;831:20;;862:14;887:78;902:1;894:4;:9;887:78;;920:8;;;;;:::i;:::-;;;;951:2;943:10;;;;;:::i;:::-;;;887:78;;;975:19;1007:6;997:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;975:39;;1025:154;1041:1;1032:5;:10;1025:154;;1069:1;1059:11;;;;;:::i;:::-;;;1136:2;1128:5;:10;;;;:::i;:::-;1115:2;:24;;;;:::i;:::-;1102:39;;1085:6;1092;1085:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;1165:2;1156:11;;;;;:::i;:::-;;;1025:154;;;1203:6;1189:21;;;;;495:723;;;;:::o;40177:89::-;40237:21;40243:7;40252:5;40237;:21::i;:::-;40177:89;:::o;45873:147::-;46010:6;45873:147;;;;;:::o;3241:98::-;3294:7;3321:10;3314:17;;3241:98;:::o;30635:681::-;30758:19;30764:2;30768:8;30758:5;:19::i;:::-;30837:1;30819:2;:14;;;:19;30815:483;;30859:11;30873:13;;30859:27;;30905:13;30927:8;30921:3;:14;30905:30;;30954:233;30985:62;31024:1;31028:2;31032:7;;;;;;31041:5;30985:30;:62::i;:::-;30980:167;;31083:40;;;;;;;;;;;;;;30980:167;31182:3;31174:5;:11;30954:233;;31269:3;31252:13;;:20;31248:34;;31274:8;;;31248:34;30815:483;;;30635:681;;;:::o;40495:3050::-;40575:27;40605;40624:7;40605:18;:27::i;:::-;40575:57;;40645:12;40676:19;40645:52;;40711:27;40740:23;40767:28;40787:7;40767:19;:28::i;:::-;40710:85;;;;40812:13;40808:296;;;40931:62;40950:15;40967:4;40973:19;:17;:19::i;:::-;40931:18;:62::i;:::-;40926:178;;41017:43;41034:4;41040:19;:17;:19::i;:::-;41017:16;:43::i;:::-;41012:92;;41069:35;;;;;;;;;;;;;;41012:92;40926:178;40808:296;41117:51;41139:4;41153:1;41157:7;41166:1;41117:21;:51::i;:::-;41261:15;41258:2;;;41401:1;41380:19;41373:30;41258:2;42077:1;16247:3;42048:1;:25;;42047:31;42019:18;:24;42038:4;42019:24;;;;;;;;;;;;;;;;:59;;;;;;;;;;;42345:174;42382:4;42451:53;42466:4;42480:1;42484:19;42451:14;:53::i;:::-;17032:8;16754;42406:41;42405:99;42345:18;:174::i;:::-;42316:17;:26;42334:7;42316:26;;;;;;;;;;;:203;;;;42689:1;17032:8;42639:19;:46;:51;42635:626;;;42711:19;42743:1;42733:7;:11;42711:33;;42900:1;42866:17;:30;42884:11;42866:30;;;;;;;;;;;;:35;42862:384;;;43004:13;;42989:11;:28;42985:242;;43184:19;43151:17;:30;43169:11;43151:30;;;;;;;;;;;:52;;;;42985:242;42862:384;42635:626;;43316:7;43312:1;43289:35;;43298:4;43289:35;;;;;;;;;;;;43335:50;43356:4;43370:1;43374:7;43383:1;43335:20;:50::i;:::-;43512:12;;:14;;;;;;;;;;;;;40495:3050;;;;;;:::o;31589:1577::-;31654:20;31677:13;;31654:36;;31719:1;31705:16;;:2;:16;;;31701:48;;;31730:19;;;;;;;;;;;;;;31701:48;31776:1;31764:8;:13;31760:44;;;31786:18;;;;;;;;;;;;;;31760:44;31817:61;31847:1;31851:2;31855:12;31869:8;31817:21;:61::i;:::-;32360:1;16121:2;32331:1;:25;;32330:31;32318:8;:44;32292:18;:22;32311:2;32292:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;32639:167;32676:2;32758:33;32781:1;32785:2;32789:1;32758:14;:33::i;:::-;16897:3;32698:29;32725:1;32713:8;:13;32698:14;:29::i;:::-;:56;;32697:94;32639:18;:167::i;:::-;32605:17;:31;32623:12;32605:31;;;;;;;;;;;:201;;;;32823:15;32841:12;32823:30;;32868:11;32893:12;32882:8;:23;32868:37;;32920:101;32972:9;;;;;;32968:2;32947:35;;32964:1;32947:35;;;;;;;;;;;;33016:3;33006:7;:13;32920:101;;33068:8;33053:12;:23;33037:13;:39;;;;31589:1577;;33098:60;33127:1;33131:2;33135:12;33149:8;33098:20;:60::i;:::-;31589:1577;;;:::o;27302:142::-;27360:14;27421:5;27411:15;;27396:41;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;685:343::-;762:5;787:65;803:48;844:6;803:48;:::i;:::-;787:65;:::i;:::-;778:74;;875:6;868:5;861:21;913:4;906:5;902:16;951:3;942:6;937:3;933:16;930:25;927:2;;;968:1;965;958:12;927:2;981:41;1015:6;1010:3;1005;981:41;:::i;:::-;768:260;;;;;;:::o;1034:345::-;1112:5;1137:66;1153:49;1195:6;1153:49;:::i;:::-;1137:66;:::i;:::-;1128:75;;1226:6;1219:5;1212:21;1264:4;1257:5;1253:16;1302:3;1293:6;1288:3;1284:16;1281:25;1278:2;;;1319:1;1316;1309:12;1278:2;1332:41;1366:6;1361:3;1356;1332:41;:::i;:::-;1118:261;;;;;;:::o;1385:139::-;1431:5;1469:6;1456:20;1447:29;;1485:33;1512:5;1485:33;:::i;:::-;1437:87;;;;:::o;1547:303::-;1618:5;1667:3;1660:4;1652:6;1648:17;1644:27;1634:2;;1685:1;1682;1675:12;1634:2;1725:6;1712:20;1750:94;1840:3;1832:6;1825:4;1817:6;1813:17;1750:94;:::i;:::-;1741:103;;1624:226;;;;;:::o;1856:133::-;1899:5;1937:6;1924:20;1915:29;;1953:30;1977:5;1953:30;:::i;:::-;1905:84;;;;:::o;1995:137::-;2040:5;2078:6;2065:20;2056:29;;2094:32;2120:5;2094:32;:::i;:::-;2046:86;;;;:::o;2138:141::-;2194:5;2225:6;2219:13;2210:22;;2241:32;2267:5;2241:32;:::i;:::-;2200:79;;;;:::o;2298:271::-;2353:5;2402:3;2395:4;2387:6;2383:17;2379:27;2369:2;;2420:1;2417;2410:12;2369:2;2460:6;2447:20;2485:78;2559:3;2551:6;2544:4;2536:6;2532:17;2485:78;:::i;:::-;2476:87;;2359:210;;;;;:::o;2589:273::-;2645:5;2694:3;2687:4;2679:6;2675:17;2671:27;2661:2;;2712:1;2709;2702:12;2661:2;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2651:211;;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2920:87;;;;:::o;3013:262::-;3072:6;3121:2;3109:9;3100:7;3096:23;3092:32;3089:2;;;3137:1;3134;3127:12;3089:2;3180:1;3205:53;3250:7;3241:6;3230:9;3226:22;3205:53;:::i;:::-;3195:63;;3151:117;3079:196;;;;:::o;3281:407::-;3349:6;3357;3406:2;3394:9;3385:7;3381:23;3377:32;3374:2;;;3422:1;3419;3412:12;3374:2;3465:1;3490:53;3535:7;3526:6;3515:9;3511:22;3490:53;:::i;:::-;3480:63;;3436:117;3592:2;3618:53;3663:7;3654:6;3643:9;3639:22;3618:53;:::i;:::-;3608:63;;3563:118;3364:324;;;;;:::o;3694:552::-;3771:6;3779;3787;3836:2;3824:9;3815:7;3811:23;3807:32;3804:2;;;3852:1;3849;3842:12;3804:2;3895:1;3920:53;3965:7;3956:6;3945:9;3941:22;3920:53;:::i;:::-;3910:63;;3866:117;4022:2;4048:53;4093:7;4084:6;4073:9;4069:22;4048:53;:::i;:::-;4038:63;;3993:118;4150:2;4176:53;4221:7;4212:6;4201:9;4197:22;4176:53;:::i;:::-;4166:63;;4121:118;3794:452;;;;;:::o;4252:809::-;4347:6;4355;4363;4371;4420:3;4408:9;4399:7;4395:23;4391:33;4388:2;;;4437:1;4434;4427:12;4388:2;4480:1;4505:53;4550:7;4541:6;4530:9;4526:22;4505:53;:::i;:::-;4495:63;;4451:117;4607:2;4633:53;4678:7;4669:6;4658:9;4654:22;4633:53;:::i;:::-;4623:63;;4578:118;4735:2;4761:53;4806:7;4797:6;4786:9;4782:22;4761:53;:::i;:::-;4751:63;;4706:118;4891:2;4880:9;4876:18;4863:32;4922:18;4914:6;4911:30;4908:2;;;4954:1;4951;4944:12;4908:2;4982:62;5036:7;5027:6;5016:9;5012:22;4982:62;:::i;:::-;4972:72;;4834:220;4378:683;;;;;;;:::o;5067:401::-;5132:6;5140;5189:2;5177:9;5168:7;5164:23;5160:32;5157:2;;;5205:1;5202;5195:12;5157:2;5248:1;5273:53;5318:7;5309:6;5298:9;5294:22;5273:53;:::i;:::-;5263:63;;5219:117;5375:2;5401:50;5443:7;5434:6;5423:9;5419:22;5401:50;:::i;:::-;5391:60;;5346:115;5147:321;;;;;:::o;5474:407::-;5542:6;5550;5599:2;5587:9;5578:7;5574:23;5570:32;5567:2;;;5615:1;5612;5605:12;5567:2;5658:1;5683:53;5728:7;5719:6;5708:9;5704:22;5683:53;:::i;:::-;5673:63;;5629:117;5785:2;5811:53;5856:7;5847:6;5836:9;5832:22;5811:53;:::i;:::-;5801:63;;5756:118;5557:324;;;;;:::o;5887:405::-;5971:6;6020:2;6008:9;5999:7;5995:23;5991:32;5988:2;;;6036:1;6033;6026:12;5988:2;6107:1;6096:9;6092:17;6079:31;6137:18;6129:6;6126:30;6123:2;;;6169:1;6166;6159:12;6123:2;6197:78;6267:7;6258:6;6247:9;6243:22;6197:78;:::i;:::-;6187:88;;6050:235;5978:314;;;;:::o;6298:256::-;6354:6;6403:2;6391:9;6382:7;6378:23;6374:32;6371:2;;;6419:1;6416;6409:12;6371:2;6462:1;6487:50;6529:7;6520:6;6509:9;6505:22;6487:50;:::i;:::-;6477:60;;6433:114;6361:193;;;;:::o;6560:260::-;6618:6;6667:2;6655:9;6646:7;6642:23;6638:32;6635:2;;;6683:1;6680;6673:12;6635:2;6726:1;6751:52;6795:7;6786:6;6775:9;6771:22;6751:52;:::i;:::-;6741:62;;6697:116;6625:195;;;;:::o;6826:282::-;6895:6;6944:2;6932:9;6923:7;6919:23;6915:32;6912:2;;;6960:1;6957;6950:12;6912:2;7003:1;7028:63;7083:7;7074:6;7063:9;7059:22;7028:63;:::i;:::-;7018:73;;6974:127;6902:206;;;;:::o;7114:375::-;7183:6;7232:2;7220:9;7211:7;7207:23;7203:32;7200:2;;;7248:1;7245;7238:12;7200:2;7319:1;7308:9;7304:17;7291:31;7349:18;7341:6;7338:30;7335:2;;;7381:1;7378;7371:12;7335:2;7409:63;7464:7;7455:6;7444:9;7440:22;7409:63;:::i;:::-;7399:73;;7262:220;7190:299;;;;:::o;7495:262::-;7554:6;7603:2;7591:9;7582:7;7578:23;7574:32;7571:2;;;7619:1;7616;7609:12;7571:2;7662:1;7687:53;7732:7;7723:6;7712:9;7708:22;7687:53;:::i;:::-;7677:63;;7633:117;7561:196;;;;:::o;7763:118::-;7850:24;7868:5;7850:24;:::i;:::-;7845:3;7838:37;7828:53;;:::o;7887:109::-;7968:21;7983:5;7968:21;:::i;:::-;7963:3;7956:34;7946:50;;:::o;8002:360::-;8088:3;8116:38;8148:5;8116:38;:::i;:::-;8170:70;8233:6;8228:3;8170:70;:::i;:::-;8163:77;;8249:52;8294:6;8289:3;8282:4;8275:5;8271:16;8249:52;:::i;:::-;8326:29;8348:6;8326:29;:::i;:::-;8321:3;8317:39;8310:46;;8092:270;;;;;:::o;8368:364::-;8456:3;8484:39;8517:5;8484:39;:::i;:::-;8539:71;8603:6;8598:3;8539:71;:::i;:::-;8532:78;;8619:52;8664:6;8659:3;8652:4;8645:5;8641:16;8619:52;:::i;:::-;8696:29;8718:6;8696:29;:::i;:::-;8691:3;8687:39;8680:46;;8460:272;;;;;:::o;8738:377::-;8844:3;8872:39;8905:5;8872:39;:::i;:::-;8927:89;9009:6;9004:3;8927:89;:::i;:::-;8920:96;;9025:52;9070:6;9065:3;9058:4;9051:5;9047:16;9025:52;:::i;:::-;9102:6;9097:3;9093:16;9086:23;;8848:267;;;;;:::o;9121:366::-;9263:3;9284:67;9348:2;9343:3;9284:67;:::i;:::-;9277:74;;9360:93;9449:3;9360:93;:::i;:::-;9478:2;9473:3;9469:12;9462:19;;9267:220;;;:::o;9493:366::-;9635:3;9656:67;9720:2;9715:3;9656:67;:::i;:::-;9649:74;;9732:93;9821:3;9732:93;:::i;:::-;9850:2;9845:3;9841:12;9834:19;;9639:220;;;:::o;9865:400::-;10025:3;10046:84;10128:1;10123:3;10046:84;:::i;:::-;10039:91;;10139:93;10228:3;10139:93;:::i;:::-;10257:1;10252:3;10248:11;10241:18;;10029:236;;;:::o;10271:366::-;10413:3;10434:67;10498:2;10493:3;10434:67;:::i;:::-;10427:74;;10510:93;10599:3;10510:93;:::i;:::-;10628:2;10623:3;10619:12;10612:19;;10417:220;;;:::o;10643:366::-;10785:3;10806:67;10870:2;10865:3;10806:67;:::i;:::-;10799:74;;10882:93;10971:3;10882:93;:::i;:::-;11000:2;10995:3;10991:12;10984:19;;10789:220;;;:::o;11015:366::-;11157:3;11178:67;11242:2;11237:3;11178:67;:::i;:::-;11171:74;;11254:93;11343:3;11254:93;:::i;:::-;11372:2;11367:3;11363:12;11356:19;;11161:220;;;:::o;11387:398::-;11546:3;11567:83;11648:1;11643:3;11567:83;:::i;:::-;11560:90;;11659:93;11748:3;11659:93;:::i;:::-;11777:1;11772:3;11768:11;11761:18;;11550:235;;;:::o;11791:118::-;11878:24;11896:5;11878:24;:::i;:::-;11873:3;11866:37;11856:53;;:::o;11915:701::-;12196:3;12218:95;12309:3;12300:6;12218:95;:::i;:::-;12211:102;;12330:95;12421:3;12412:6;12330:95;:::i;:::-;12323:102;;12442:148;12586:3;12442:148;:::i;:::-;12435:155;;12607:3;12600:10;;12200:416;;;;;:::o;12622:379::-;12806:3;12828:147;12971:3;12828:147;:::i;:::-;12821:154;;12992:3;12985:10;;12810:191;;;:::o;13007:222::-;13100:4;13138:2;13127:9;13123:18;13115:26;;13151:71;13219:1;13208:9;13204:17;13195:6;13151:71;:::i;:::-;13105:124;;;;:::o;13235:640::-;13430:4;13468:3;13457:9;13453:19;13445:27;;13482:71;13550:1;13539:9;13535:17;13526:6;13482:71;:::i;:::-;13563:72;13631:2;13620:9;13616:18;13607:6;13563:72;:::i;:::-;13645;13713:2;13702:9;13698:18;13689:6;13645:72;:::i;:::-;13764:9;13758:4;13754:20;13749:2;13738:9;13734:18;13727:48;13792:76;13863:4;13854:6;13792:76;:::i;:::-;13784:84;;13435:440;;;;;;;:::o;13881:210::-;13968:4;14006:2;13995:9;13991:18;13983:26;;14019:65;14081:1;14070:9;14066:17;14057:6;14019:65;:::i;:::-;13973:118;;;;:::o;14097:313::-;14210:4;14248:2;14237:9;14233:18;14225:26;;14297:9;14291:4;14287:20;14283:1;14272:9;14268:17;14261:47;14325:78;14398:4;14389:6;14325:78;:::i;:::-;14317:86;;14215:195;;;;:::o;14416:419::-;14582:4;14620:2;14609:9;14605:18;14597:26;;14669:9;14663:4;14659:20;14655:1;14644:9;14640:17;14633:47;14697:131;14823:4;14697:131;:::i;:::-;14689:139;;14587:248;;;:::o;14841:419::-;15007:4;15045:2;15034:9;15030:18;15022:26;;15094:9;15088:4;15084:20;15080:1;15069:9;15065:17;15058:47;15122:131;15248:4;15122:131;:::i;:::-;15114:139;;15012:248;;;:::o;15266:419::-;15432:4;15470:2;15459:9;15455:18;15447:26;;15519:9;15513:4;15509:20;15505:1;15494:9;15490:17;15483:47;15547:131;15673:4;15547:131;:::i;:::-;15539:139;;15437:248;;;:::o;15691:419::-;15857:4;15895:2;15884:9;15880:18;15872:26;;15944:9;15938:4;15934:20;15930:1;15919:9;15915:17;15908:47;15972:131;16098:4;15972:131;:::i;:::-;15964:139;;15862:248;;;:::o;16116:419::-;16282:4;16320:2;16309:9;16305:18;16297:26;;16369:9;16363:4;16359:20;16355:1;16344:9;16340:17;16333:47;16397:131;16523:4;16397:131;:::i;:::-;16389:139;;16287:248;;;:::o;16541:222::-;16634:4;16672:2;16661:9;16657:18;16649:26;;16685:71;16753:1;16742:9;16738:17;16729:6;16685:71;:::i;:::-;16639:124;;;;:::o;16769:129::-;16803:6;16830:20;;:::i;:::-;16820:30;;16859:33;16887:4;16879:6;16859:33;:::i;:::-;16810:88;;;:::o;16904:75::-;16937:6;16970:2;16964:9;16954:19;;16944:35;:::o;16985:311::-;17062:4;17152:18;17144:6;17141:30;17138:2;;;17174:18;;:::i;:::-;17138:2;17224:4;17216:6;17212:17;17204:25;;17284:4;17278;17274:15;17266:23;;17067:229;;;:::o;17302:307::-;17363:4;17453:18;17445:6;17442:30;17439:2;;;17475:18;;:::i;:::-;17439:2;17513:29;17535:6;17513:29;:::i;:::-;17505:37;;17597:4;17591;17587:15;17579:23;;17368:241;;;:::o;17615:308::-;17677:4;17767:18;17759:6;17756:30;17753:2;;;17789:18;;:::i;:::-;17753:2;17827:29;17849:6;17827:29;:::i;:::-;17819:37;;17911:4;17905;17901:15;17893:23;;17682:241;;;:::o;17929:98::-;17980:6;18014:5;18008:12;17998:22;;17987:40;;;:::o;18033:99::-;18085:6;18119:5;18113:12;18103:22;;18092:40;;;:::o;18138:168::-;18221:11;18255:6;18250:3;18243:19;18295:4;18290:3;18286:14;18271:29;;18233:73;;;;:::o;18312:147::-;18413:11;18450:3;18435:18;;18425:34;;;;:::o;18465:169::-;18549:11;18583:6;18578:3;18571:19;18623:4;18618:3;18614:14;18599:29;;18561:73;;;;:::o;18640:148::-;18742:11;18779:3;18764:18;;18754:34;;;;:::o;18794:305::-;18834:3;18853:20;18871:1;18853:20;:::i;:::-;18848:25;;18887:20;18905:1;18887:20;:::i;:::-;18882:25;;19041:1;18973:66;18969:74;18966:1;18963:81;18960:2;;;19047:18;;:::i;:::-;18960:2;19091:1;19088;19084:9;19077:16;;18838:261;;;;:::o;19105:185::-;19145:1;19162:20;19180:1;19162:20;:::i;:::-;19157:25;;19196:20;19214:1;19196:20;:::i;:::-;19191:25;;19235:1;19225:2;;19240:18;;:::i;:::-;19225:2;19282:1;19279;19275:9;19270:14;;19147:143;;;;:::o;19296:348::-;19336:7;19359:20;19377:1;19359:20;:::i;:::-;19354:25;;19393:20;19411:1;19393:20;:::i;:::-;19388:25;;19581:1;19513:66;19509:74;19506:1;19503:81;19498:1;19491:9;19484:17;19480:105;19477:2;;;19588:18;;:::i;:::-;19477:2;19636:1;19633;19629:9;19618:20;;19344:300;;;;:::o;19650:191::-;19690:4;19710:20;19728:1;19710:20;:::i;:::-;19705:25;;19744:20;19762:1;19744:20;:::i;:::-;19739:25;;19783:1;19780;19777:8;19774:2;;;19788:18;;:::i;:::-;19774:2;19833:1;19830;19826:9;19818:17;;19695:146;;;;:::o;19847:96::-;19884:7;19913:24;19931:5;19913:24;:::i;:::-;19902:35;;19892:51;;;:::o;19949:90::-;19983:7;20026:5;20019:13;20012:21;20001:32;;19991:48;;;:::o;20045:149::-;20081:7;20121:66;20114:5;20110:78;20099:89;;20089:105;;;:::o;20200:126::-;20237:7;20277:42;20270:5;20266:54;20255:65;;20245:81;;;:::o;20332:77::-;20369:7;20398:5;20387:16;;20377:32;;;:::o;20415:154::-;20499:6;20494:3;20489;20476:30;20561:1;20552:6;20547:3;20543:16;20536:27;20466:103;;;:::o;20575:307::-;20643:1;20653:113;20667:6;20664:1;20661:13;20653:113;;;20752:1;20747:3;20743:11;20737:18;20733:1;20728:3;20724:11;20717:39;20689:2;20686:1;20682:10;20677:15;;20653:113;;;20784:6;20781:1;20778:13;20775:2;;;20864:1;20855:6;20850:3;20846:16;20839:27;20775:2;20624:258;;;;:::o;20888:320::-;20932:6;20969:1;20963:4;20959:12;20949:22;;21016:1;21010:4;21006:12;21037:18;21027:2;;21093:4;21085:6;21081:17;21071:27;;21027:2;21155;21147:6;21144:14;21124:18;21121:38;21118:2;;;21174:18;;:::i;:::-;21118:2;20939:269;;;;:::o;21214:281::-;21297:27;21319:4;21297:27;:::i;:::-;21289:6;21285:40;21427:6;21415:10;21412:22;21391:18;21379:10;21376:34;21373:62;21370:2;;;21438:18;;:::i;:::-;21370:2;21478:10;21474:2;21467:22;21257:238;;;:::o;21501:233::-;21540:3;21563:24;21581:5;21563:24;:::i;:::-;21554:33;;21609:66;21602:5;21599:77;21596:2;;;21679:18;;:::i;:::-;21596:2;21726:1;21719:5;21715:13;21708:20;;21544:190;;;:::o;21740:176::-;21772:1;21789:20;21807:1;21789:20;:::i;:::-;21784:25;;21823:20;21841:1;21823:20;:::i;:::-;21818:25;;21862:1;21852:2;;21867:18;;:::i;:::-;21852:2;21908:1;21905;21901:9;21896:14;;21774:142;;;;:::o;21922:180::-;21970:77;21967:1;21960:88;22067:4;22064:1;22057:15;22091:4;22088:1;22081:15;22108:180;22156:77;22153:1;22146:88;22253:4;22250:1;22243:15;22277:4;22274:1;22267:15;22294:180;22342:77;22339:1;22332:88;22439:4;22436:1;22429:15;22463:4;22460:1;22453:15;22480:180;22528:77;22525:1;22518:88;22625:4;22622:1;22615:15;22649:4;22646:1;22639:15;22666:102;22707:6;22758:2;22754:7;22749:2;22742:5;22738:14;22734:28;22724:38;;22714:54;;;:::o;22774:225::-;22914:34;22910:1;22902:6;22898:14;22891:58;22983:8;22978:2;22970:6;22966:15;22959:33;22880:119;:::o;23005:168::-;23145:20;23141:1;23133:6;23129:14;23122:44;23111:62;:::o;23179:155::-;23319:7;23315:1;23307:6;23303:14;23296:31;23285:49;:::o;23340:167::-;23480:19;23476:1;23468:6;23464:14;23457:43;23446:61;:::o;23513:182::-;23653:34;23649:1;23641:6;23637:14;23630:58;23619:76;:::o;23701:166::-;23841:18;23837:1;23829:6;23825:14;23818:42;23807:60;:::o;23873:114::-;23979:8;:::o;23993:122::-;24066:24;24084:5;24066:24;:::i;:::-;24059:5;24056:35;24046:2;;24105:1;24102;24095:12;24046:2;24036:79;:::o;24121:116::-;24191:21;24206:5;24191:21;:::i;:::-;24184:5;24181:32;24171:2;;24227:1;24224;24217:12;24171:2;24161:76;:::o;24243:120::-;24315:23;24332:5;24315:23;:::i;:::-;24308:5;24305:34;24295:2;;24353:1;24350;24343:12;24295:2;24285:78;:::o;24369:122::-;24442:24;24460:5;24442:24;:::i;:::-;24435:5;24432:35;24422:2;;24481:1;24478;24471:12;24422:2;24412:79;:::o
Swarm Source
ipfs://cc7b5b26cfa1a33b2f0b9ae8fc9ec5ea1f60e6f6985db2e4c8f6307a6d9f86c2
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.