ERC-721
Overview
Max Total Supply
1,031 BNB
Holders
334
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 BNBLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Bears
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-22 */ // File: IERC721A.sol // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.7; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // IERC165 // ============================== /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: ERC721A.sol // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.7; /** * @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 tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @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 auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; assembly { // Cast aux without masking. auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = address(uint160(_packedOwnershipOf(tokenId))); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) 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 or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.code.length != 0) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, 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 or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(from) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_BURNED | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // 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/finance/PaymentSplitter.sol // OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol) pragma solidity ^0.8.0; /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. * * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you * to run tests before sending real value to this contract. */ contract PaymentSplitter is Context { event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; mapping(IERC20 => uint256) private _erc20TotalReleased; mapping(IERC20 => mapping(address => uint256)) private _erc20Released; /** * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor(address[] memory payees, uint256[] memory shares_) payable { require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees.length > 0, "PaymentSplitter: no payees"); for (uint256 i = 0; i < payees.length; i++) { _addPayee(payees[i], shares_[i]); } } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive() external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20 * contract. */ function totalReleased(IERC20 token) public view returns (uint256) { return _erc20TotalReleased[token]; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an * IERC20 contract. */ function released(IERC20 token, address account) public view returns (uint256) { return _erc20Released[token][account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address payable account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = address(this).balance + totalReleased(); uint256 payment = _pendingPayment(account, totalReceived, released(account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _released[account] += payment; _totalReleased += payment; Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20 * contract. */ function release(IERC20 token, address account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token); uint256 payment = _pendingPayment(account, totalReceived, released(token, account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _erc20Released[token][account] += payment; _erc20TotalReleased[token] += payment; SafeERC20.safeTransfer(token, account, payment); emit ERC20PaymentReleased(token, account, payment); } /** * @dev internal logic for computing the pending payment of an `account` given the token historical balances and * already released amounts. */ function _pendingPayment( address account, uint256 totalReceived, uint256 alreadyReleased ) private view returns (uint256) { return (totalReceived * _shares[account]) / _totalShares - alreadyReleased; } /** * @dev Add a new payee to the contract. * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(address account, uint256 shares_) private { require(account != address(0), "PaymentSplitter: account is the zero address"); require(shares_ > 0, "PaymentSplitter: shares are 0"); require(_shares[account] == 0, "PaymentSplitter: account already has shares"); _payees.push(account); _shares[account] = shares_; _totalShares = _totalShares + shares_; emit PayeeAdded(account, shares_); } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: Bears.sol pragma solidity ^0.8.7; //@author Abderrahman JAIZE //@BEARS contract Bears is Ownable, ERC721A, PaymentSplitter { using Strings for uint; enum Step { Before, //WhitelistSale, PublicSale, SoldOut, Reveal } string public baseURI; Step public sellingStep; uint private constant MAX_SUPPLY = 6666; uint private constant MAX_WHITELIST = 0; uint private constant MAX_PUBLIC = 6366; uint private constant MAX_GIFT = 300; //uint public wlSalePrice = 0.0025 ether; uint public publicSalePrice = 0.02 ether; bytes32 public merkleRoot; uint public saleStartTime = 1647888924; //mapping(address => uint) public amountNFTsperWalletWhitelistSale; mapping(address => uint) public amountNFTsperWalletPublicSale; uint private teamLength; constructor(address[] memory _team, uint[] memory _teamShares, bytes32 _merkleRoot, string memory _baseURI) ERC721A("Bad News Bears", "BNB") PaymentSplitter(_team, _teamShares) { merkleRoot = _merkleRoot; baseURI = _baseURI; teamLength = _team.length; } modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } /** function whitelistMint(address _account, uint _quantity, bytes32[] calldata _proof) external payable callerIsUser { uint price = wlSalePrice; require(price != 0, "Price is 0"); require(currentTime() >= saleStartTime, "Whitelist Sale has not started yet"); //require(currentTime() < saleStartTime + 300 minutes, "Whitelist Sale is finished"); require(sellingStep == Step.WhitelistSale, "Whitelist sale is not activated"); //require(isWhiteListed(msg.sender, _proof), "Not whitelisted"); require(amountNFTsperWalletWhitelistSale[msg.sender] + _quantity <= 10, "You can only get 10 NFT's on the Sale"); require(totalSupply() + _quantity <= MAX_WHITELIST, "Max supply exceeded"); require(msg.value >= price * _quantity, "Not enought funds"); amountNFTsperWalletWhitelistSale[msg.sender] += _quantity; _safeMint(_account, _quantity); } **/ function publicSaleMint(address _account, uint _quantity) external payable callerIsUser { uint price = publicSalePrice; require(price != 0, "Price is 0"); require(sellingStep == Step.PublicSale, "Public sale is not activated"); require(totalSupply() + _quantity <= MAX_WHITELIST + MAX_PUBLIC, "Max supply exceeded"); require(amountNFTsperWalletPublicSale[msg.sender] + _quantity <= 10, "You can only get 10 NFT's on the Sale"); require(msg.value >= price * _quantity, "Not enought funds"); amountNFTsperWalletPublicSale[msg.sender] += _quantity; _safeMint(_account, _quantity); } function gift(address _to, uint _quantity) external onlyOwner { require(sellingStep > Step.PublicSale, "Gift is after the public sale"); require(totalSupply() + _quantity <= MAX_SUPPLY, "Reached max Supply"); _safeMint(_to, _quantity); } function setSaleStartTime(uint _saleStartTime) external onlyOwner { saleStartTime = _saleStartTime; } function setBaseUri(string memory _baseURI) external onlyOwner { baseURI = _baseURI; } function currentTime() internal view returns(uint) { return block.timestamp; } function setStep(uint _step) external onlyOwner { sellingStep = Step(_step); } function tokenURI(uint _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), "URI query for nonexistent token"); return string(abi.encodePacked(baseURI, _tokenId.toString(), ".json")); } //Whitelist function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner { merkleRoot = _merkleRoot; } function isWhiteListed(address _account, bytes32[] calldata _proof) internal view returns(bool) { return _verify(leaf(_account), _proof); } function leaf(address _account) internal pure returns(bytes32) { return keccak256(abi.encodePacked(_account)); } function _verify(bytes32 _leaf, bytes32[] memory _proof) internal view returns(bool) { return MerkleProof.verify(_proof, merkleRoot, _leaf); } //ReleaseALL function releaseAll() external { for(uint i = 0 ; i < teamLength ; i++) { release(payable(payee(i))); } } receive() override external payable { revert('Only if you mint'); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address[]","name":"_team","type":"address[]"},{"internalType":"uint256[]","name":"_teamShares","type":"uint256[]"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"string","name":"_baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","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":[{"internalType":"address","name":"","type":"address"}],"name":"amountNFTsperWalletPublicSale","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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","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":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releaseAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellingStep","outputs":[{"internalType":"enum Bears.Step","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_saleStartTime","type":"uint256"}],"name":"setSaleStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_step","type":"uint256"}],"name":"setStep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405266470de4df820000601255636238ca1c6014553480156200002457600080fd5b50604051620059593803806200595983398181016040528101906200004a91906200082e565b83836040518060400160405280600e81526020017f426164204e6577732042656172730000000000000000000000000000000000008152506040518060400160405280600381526020017f424e420000000000000000000000000000000000000000000000000000000000815250620000d8620000cc6200025460201b60201c565b6200025c60201b60201c565b8160039080519060200190620000f09291906200055f565b508060049080519060200190620001099291906200055f565b506200011a6200032060201b60201c565b6001819055505050805182511462000169576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001609062000a31565b60405180910390fd5b6000825111620001b0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001a79062000a75565b60405180910390fd5b60005b82518110156200021f5762000209838281518110620001d757620001d662000d7a565b5b6020026020010151838381518110620001f557620001f462000d7a565b5b60200260200101516200032560201b60201c565b8080620002169062000cce565b915050620001b3565b505050816013819055508060109080519060200190620002419291906200055f565b5083516016819055505050505062000f8f565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000398576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200038f9062000a0f565b60405180910390fd5b60008111620003de576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003d59062000a97565b60405180910390fd5b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541462000463576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200045a9062000a53565b60405180910390fd5b600d829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806009546200051a919062000b87565b6009819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac828260405162000553929190620009e2565b60405180910390a15050565b8280546200056d9062000c62565b90600052602060002090601f016020900481019282620005915760008555620005dd565b82601f10620005ac57805160ff1916838001178555620005dd565b82800160010185558215620005dd579182015b82811115620005dc578251825591602001919060010190620005bf565b5b509050620005ec9190620005f0565b5090565b5b808211156200060b576000816000905550600101620005f1565b5090565b600062000626620006208462000ae2565b62000ab9565b905080838252602082019050828560208602820111156200064c576200064b62000ddd565b5b60005b8581101562000680578162000665888262000750565b8452602084019350602083019250506001810190506200064f565b5050509392505050565b6000620006a16200069b8462000b11565b62000ab9565b90508083825260208201905082856020860282011115620006c757620006c662000ddd565b5b60005b85811015620006fb5781620006e0888262000817565b845260208401935060208301925050600181019050620006ca565b5050509392505050565b60006200071c620007168462000b40565b62000ab9565b9050828152602081018484840111156200073b576200073a62000de2565b5b6200074884828562000c2c565b509392505050565b600081519050620007618162000f41565b92915050565b600082601f8301126200077f576200077e62000dd8565b5b8151620007918482602086016200060f565b91505092915050565b600082601f830112620007b257620007b162000dd8565b5b8151620007c48482602086016200068a565b91505092915050565b600081519050620007de8162000f5b565b92915050565b600082601f830112620007fc57620007fb62000dd8565b5b81516200080e84826020860162000705565b91505092915050565b600081519050620008288162000f75565b92915050565b600080600080608085870312156200084b576200084a62000dec565b5b600085015167ffffffffffffffff8111156200086c576200086b62000de7565b5b6200087a8782880162000767565b945050602085015167ffffffffffffffff8111156200089e576200089d62000de7565b5b620008ac878288016200079a565b9350506040620008bf87828801620007cd565b925050606085015167ffffffffffffffff811115620008e357620008e262000de7565b5b620008f187828801620007e4565b91505092959194509250565b620009088162000be4565b82525050565b60006200091d602c8362000b76565b91506200092a8262000e02565b604082019050919050565b60006200094460328362000b76565b9150620009518262000e51565b604082019050919050565b60006200096b602b8362000b76565b9150620009788262000ea0565b604082019050919050565b600062000992601a8362000b76565b91506200099f8262000eef565b602082019050919050565b6000620009b9601d8362000b76565b9150620009c68262000f18565b602082019050919050565b620009dc8162000c22565b82525050565b6000604082019050620009f96000830185620008fd565b62000a086020830184620009d1565b9392505050565b6000602082019050818103600083015262000a2a816200090e565b9050919050565b6000602082019050818103600083015262000a4c8162000935565b9050919050565b6000602082019050818103600083015262000a6e816200095c565b9050919050565b6000602082019050818103600083015262000a908162000983565b9050919050565b6000602082019050818103600083015262000ab281620009aa565b9050919050565b600062000ac562000ad8565b905062000ad3828262000c98565b919050565b6000604051905090565b600067ffffffffffffffff82111562000b005762000aff62000da9565b5b602082029050602081019050919050565b600067ffffffffffffffff82111562000b2f5762000b2e62000da9565b5b602082029050602081019050919050565b600067ffffffffffffffff82111562000b5e5762000b5d62000da9565b5b62000b698262000df1565b9050602081019050919050565b600082825260208201905092915050565b600062000b948262000c22565b915062000ba18362000c22565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000bd95762000bd862000d1c565b5b828201905092915050565b600062000bf18262000c02565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000c4c57808201518184015260208101905062000c2f565b8381111562000c5c576000848401525b50505050565b6000600282049050600182168062000c7b57607f821691505b6020821081141562000c925762000c9162000d4b565b5b50919050565b62000ca38262000df1565b810181811067ffffffffffffffff8211171562000cc55762000cc462000da9565b5b80604052505050565b600062000cdb8262000c22565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000d115762000d1062000d1c565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b62000f4c8162000be4565b811462000f5857600080fd5b50565b62000f668162000bf8565b811462000f7257600080fd5b50565b62000f808162000c22565b811462000f8c57600080fd5b50565b6149ba8062000f9f6000396000f3fe6080604052600436106102345760003560e01c80637cb647591161012e578063b88d4fde116100ab578063d79779b21161006f578063d79779b214610896578063e33b7de3146108d3578063e985e9c5146108fe578063f2fde38b1461093b578063f8dcbddb1461096457610274565b8063b88d4fde1461079f578063c87b56dd146107c8578063cbccefb214610805578063cbce4c9714610830578063ce7c2ac21461085957610274565b80639b6860c8116100f25780639b6860c8146106c9578063a0bcfc7f146106f4578063a22cb4651461071d578063ac5ae11b14610746578063b3c542151461076257610274565b80637cb64759146105d05780638b83209b146105f95780638da5cb5b1461063657806395d89b41146106615780639852595c1461068c57610274565b80633a98ef39116101bc5780635be7fde8116101805780635be7fde8146104fd5780636352211e146105145780636c0360eb1461055157806370a082311461057c578063715018a6146105b957610274565b80633a98ef391461041a578063406072a91461044557806342842e0e1461048257806348b75044146104ab578063525f8a5c146104d457610274565b806318160ddd1161020357806318160ddd1461034757806319165587146103725780631cbaee2d1461039b57806323b872dd146103c65780632eb4a7ab146103ef57610274565b806301ffc9a71461027957806306fdde03146102b6578063081812fc146102e1578063095ea7b31461031e57610274565b36610274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161026b90613e99565b60405180910390fd5b600080fd5b34801561028557600080fd5b506102a0600480360381019061029b919061353c565b61098d565b6040516102ad9190613c46565b60405180910390f35b3480156102c257600080fd5b506102cb610a1f565b6040516102d89190613c97565b60405180910390f35b3480156102ed57600080fd5b506103086004803603810190610303919061364c565b610ab1565b6040516103159190613b8d565b60405180910390f35b34801561032a57600080fd5b50610345600480360381019061034091906134a2565b610b2d565b005b34801561035357600080fd5b5061035c610cd4565b6040516103699190613f19565b60405180910390f35b34801561037e57600080fd5b506103996004803603810190610394919061331f565b610ceb565b005b3480156103a757600080fd5b506103b0610e96565b6040516103bd9190613f19565b60405180910390f35b3480156103d257600080fd5b506103ed60048036038101906103e8919061338c565b610e9c565b005b3480156103fb57600080fd5b50610404610eac565b6040516104119190613c61565b60405180910390f35b34801561042657600080fd5b5061042f610eb2565b60405161043c9190613f19565b60405180910390f35b34801561045157600080fd5b5061046c600480360381019061046791906135c3565b610ebc565b6040516104799190613f19565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a4919061338c565b610f43565b005b3480156104b757600080fd5b506104d260048036038101906104cd91906135c3565b610f63565b005b3480156104e057600080fd5b506104fb60048036038101906104f6919061364c565b61122b565b005b34801561050957600080fd5b506105126112b1565b005b34801561052057600080fd5b5061053b6004803603810190610536919061364c565b6112e5565b6040516105489190613b8d565b60405180910390f35b34801561055d57600080fd5b506105666112f7565b6040516105739190613c97565b60405180910390f35b34801561058857600080fd5b506105a3600480360381019061059e91906132f2565b611385565b6040516105b09190613f19565b60405180910390f35b3480156105c557600080fd5b506105ce61143e565b005b3480156105dc57600080fd5b506105f760048036038101906105f2919061350f565b6114c6565b005b34801561060557600080fd5b50610620600480360381019061061b919061364c565b61154c565b60405161062d9190613b8d565b60405180910390f35b34801561064257600080fd5b5061064b611594565b6040516106589190613b8d565b60405180910390f35b34801561066d57600080fd5b506106766115bd565b6040516106839190613c97565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae91906132f2565b61164f565b6040516106c09190613f19565b60405180910390f35b3480156106d557600080fd5b506106de611698565b6040516106eb9190613f19565b60405180910390f35b34801561070057600080fd5b5061071b60048036038101906107169190613603565b61169e565b005b34801561072957600080fd5b50610744600480360381019061073f9190613462565b611734565b005b610760600480360381019061075b91906134a2565b6118ac565b005b34801561076e57600080fd5b50610789600480360381019061078491906132f2565b611b7f565b6040516107969190613f19565b60405180910390f35b3480156107ab57600080fd5b506107c660048036038101906107c191906133df565b611b97565b005b3480156107d457600080fd5b506107ef60048036038101906107ea919061364c565b611c0a565b6040516107fc9190613c97565b60405180910390f35b34801561081157600080fd5b5061081a611c86565b6040516108279190613c7c565b60405180910390f35b34801561083c57600080fd5b50610857600480360381019061085291906134a2565b611c99565b005b34801561086557600080fd5b50610880600480360381019061087b91906132f2565b611df0565b60405161088d9190613f19565b60405180910390f35b3480156108a257600080fd5b506108bd60048036038101906108b89190613596565b611e39565b6040516108ca9190613f19565b60405180910390f35b3480156108df57600080fd5b506108e8611e82565b6040516108f59190613f19565b60405180910390f35b34801561090a57600080fd5b506109256004803603810190610920919061334c565b611e8c565b6040516109329190613c46565b60405180910390f35b34801561094757600080fd5b50610962600480360381019061095d91906132f2565b611f20565b005b34801561097057600080fd5b5061098b6004803603810190610986919061364c565b612018565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109e857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a185750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a2e90614272565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5a90614272565b8015610aa75780601f10610a7c57610100808354040283529160200191610aa7565b820191906000526020600020905b815481529060010190602001808311610a8a57829003601f168201915b5050505050905090565b6000610abc826120d3565b610af2576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b3882612132565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba0576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bbf612200565b73ffffffffffffffffffffffffffffffffffffffff1614610c2257610beb81610be6612200565b611e8c565b610c21576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610cde612208565b6002546001540303905090565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6490613d39565b60405180910390fd5b6000610d77611e82565b47610d82919061401e565b90506000610d998383610d948661164f565b61220d565b90506000811415610ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd690613db9565b60405180910390fd5b80600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e2e919061401e565b9250508190555080600a6000828254610e47919061401e565b92505081905550610e58838261227b565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610e89929190613ba8565b60405180910390a1505050565b60145481565b610ea783838361236f565b505050565b60135481565b6000600954905090565b6000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610f5e83838360405180602001604052806000815250611b97565b505050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdc90613d39565b60405180910390fd5b6000610ff083611e39565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110299190613b8d565b60206040518083038186803b15801561104157600080fd5b505afa158015611055573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110799190613679565b611083919061401e565b9050600061109b83836110968787610ebc565b61220d565b905060008114156110e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d890613db9565b60405180910390fd5b80600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461116d919061401e565b9250508190555080600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111c3919061401e565b925050819055506111d5848483612719565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a848360405161121d929190613c1d565b60405180910390a250505050565b61123361279f565b73ffffffffffffffffffffffffffffffffffffffff16611251611594565b73ffffffffffffffffffffffffffffffffffffffff16146112a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129e90613e39565b60405180910390fd5b8060148190555050565b60005b6016548110156112e2576112cf6112ca8261154c565b610ceb565b80806112da906142d5565b9150506112b4565b50565b60006112f082612132565b9050919050565b6010805461130490614272565b80601f016020809104026020016040519081016040528092919081815260200182805461133090614272565b801561137d5780601f106113525761010080835404028352916020019161137d565b820191906000526020600020905b81548152906001019060200180831161136057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113ed576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61144661279f565b73ffffffffffffffffffffffffffffffffffffffff16611464611594565b73ffffffffffffffffffffffffffffffffffffffff16146114ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b190613e39565b60405180910390fd5b6114c460006127a7565b565b6114ce61279f565b73ffffffffffffffffffffffffffffffffffffffff166114ec611594565b73ffffffffffffffffffffffffffffffffffffffff1614611542576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153990613e39565b60405180910390fd5b8060138190555050565b6000600d82815481106115625761156161440b565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546115cc90614272565b80601f01602080910402602001604051908101604052809291908181526020018280546115f890614272565b80156116455780601f1061161a57610100808354040283529160200191611645565b820191906000526020600020905b81548152906001019060200180831161162857829003601f168201915b5050505050905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60125481565b6116a661279f565b73ffffffffffffffffffffffffffffffffffffffff166116c4611594565b73ffffffffffffffffffffffffffffffffffffffff161461171a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171190613e39565b60405180910390fd5b806010908051906020019061173092919061309d565b5050565b61173c612200565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117a1576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006117ae612200565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661185b612200565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118a09190613c46565b60405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461191a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191190613dd9565b60405180910390fd5b600060125490506000811415611965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195c90613ed9565b60405180910390fd5b60016003811115611979576119786143ad565b5b601160009054906101000a900460ff16600381111561199b5761199a6143ad565b5b146119db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d290613df9565b60405180910390fd5b6118de60006119ea919061401e565b826119f3610cd4565b6119fd919061401e565b1115611a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3590613cb9565b60405180910390fd5b600a82601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a8b919061401e565b1115611acc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac390613e59565b60405180910390fd5b8181611ad891906140a5565b341015611b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1190613ef9565b60405180910390fd5b81601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b69919061401e565b92505081905550611b7a838361286b565b505050565b60156020528060005260406000206000915090505481565b611ba284848461236f565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611c0457611bcd84848484612889565b611c03576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060611c15826120d3565b611c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4b90613cd9565b60405180910390fd5b6010611c5f836129e9565b604051602001611c70929190613b49565b6040516020818303038152906040529050919050565b601160009054906101000a900460ff1681565b611ca161279f565b73ffffffffffffffffffffffffffffffffffffffff16611cbf611594565b73ffffffffffffffffffffffffffffffffffffffff1614611d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0c90613e39565b60405180910390fd5b60016003811115611d2957611d286143ad565b5b601160009054906101000a900460ff166003811115611d4b57611d4a6143ad565b5b11611d8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8290613d19565b60405180910390fd5b611a0a81611d97610cd4565b611da1919061401e565b1115611de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd990613e19565b60405180910390fd5b611dec828261286b565b5050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600a54905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f2861279f565b73ffffffffffffffffffffffffffffffffffffffff16611f46611594565b73ffffffffffffffffffffffffffffffffffffffff1614611f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9390613e39565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561200c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200390613cf9565b60405180910390fd5b612015816127a7565b50565b61202061279f565b73ffffffffffffffffffffffffffffffffffffffff1661203e611594565b73ffffffffffffffffffffffffffffffffffffffff1614612094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208b90613e39565b60405180910390fd5b8060038111156120a7576120a66143ad565b5b601160006101000a81548160ff021916908360038111156120cb576120ca6143ad565b5b021790555050565b6000816120de612208565b111580156120ed575060015482105b801561212b575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b60008082905080612141612208565b116121c9576001548110156121c85760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156121c6575b60008114156121bc576005600083600190039350838152602001908152602001600020549050612191565b80925050506121fb565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b600081600954600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548561225e91906140a5565b6122689190614074565b61227291906140ff565b90509392505050565b804710156122be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b590613d79565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516122e490613b78565b60006040518083038185875af1925050503d8060008114612321576040519150601f19603f3d011682016040523d82523d6000602084013e612326565b606091505b505090508061236a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236190613d59565b60405180910390fd5b505050565b600061237a82612132565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146123e1576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612402612200565b73ffffffffffffffffffffffffffffffffffffffff16148061243157506124308561242b612200565b611e8c565b5b80612476575061243f612200565b73ffffffffffffffffffffffffffffffffffffffff1661245e84610ab1565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806124af576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612516576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125238585856001612b4a565b6007600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61262086612b50565b1717600560008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831614156126aa5760006001840190506000600560008381526020019081526020016000205414156126a85760015481146126a7578260056000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127128585856001612b5a565b5050505050565b61279a8363a9059cbb60e01b8484604051602401612738929190613c1d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612b60565b505050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612885828260405180602001604052806000815250612c27565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128af612200565b8786866040518563ffffffff1660e01b81526004016128d19493929190613bd1565b602060405180830381600087803b1580156128eb57600080fd5b505af192505050801561291c57506040513d601f19601f820116820180604052508101906129199190613569565b60015b612996573d806000811461294c576040519150601f19603f3d011682016040523d82523d6000602084013e612951565b606091505b5060008151141561298e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612a31576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b45565b600082905060005b60008214612a63578080612a4c906142d5565b915050600a82612a5c9190614074565b9150612a39565b60008167ffffffffffffffff811115612a7f57612a7e61443a565b5b6040519080825280601f01601f191660200182016040528015612ab15781602001600182028036833780820191505090505b5090505b60008514612b3e57600182612aca91906140ff565b9150600a85612ad9919061431e565b6030612ae5919061401e565b60f81b818381518110612afb57612afa61440b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b379190614074565b9450612ab5565b8093505050505b919050565b50505050565b6000819050919050565b50505050565b6000612bc2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612edd9092919063ffffffff16565b9050600081511115612c225780806020019051810190612be291906134e2565b612c21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1890613eb9565b60405180910390fd5b5b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612c95576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612cd0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cdd6000858386612b4a565b600160406001901b178302600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612d4260018514612ef5565b901b60a042901b612d5286612b50565b1717600560008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612e56575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e066000878480600101955087612889565b612e3c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612d97578260015414612e5157600080fd5b612ec1565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612e57575b816001819055505050612ed76000858386612b5a565b50505050565b6060612eec8484600085612eff565b90509392505050565b6000819050919050565b606082471015612f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3b90613d99565b60405180910390fd5b612f4d85613013565b612f8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8390613e79565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612fb59190613b32565b60006040518083038185875af1925050503d8060008114612ff2576040519150601f19603f3d011682016040523d82523d6000602084013e612ff7565b606091505b5091509150613007828286613036565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060831561304657829050613096565b6000835111156130595782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308d9190613c97565b60405180910390fd5b9392505050565b8280546130a990614272565b90600052602060002090601f0160209004810192826130cb5760008555613112565b82601f106130e457805160ff1916838001178555613112565b82800160010185558215613112579182015b828111156131115782518255916020019190600101906130f6565b5b50905061311f9190613123565b5090565b5b8082111561313c576000816000905550600101613124565b5090565b600061315361314e84613f59565b613f34565b90508281526020810184848401111561316f5761316e61446e565b5b61317a848285614230565b509392505050565b600061319561319084613f8a565b613f34565b9050828152602081018484840111156131b1576131b061446e565b5b6131bc848285614230565b509392505050565b6000813590506131d3816148e3565b92915050565b6000813590506131e8816148fa565b92915050565b6000813590506131fd81614911565b92915050565b60008151905061321281614911565b92915050565b60008135905061322781614928565b92915050565b60008135905061323c8161493f565b92915050565b6000815190506132518161493f565b92915050565b600082601f83011261326c5761326b614469565b5b813561327c848260208601613140565b91505092915050565b60008135905061329481614956565b92915050565b600082601f8301126132af576132ae614469565b5b81356132bf848260208601613182565b91505092915050565b6000813590506132d78161496d565b92915050565b6000815190506132ec8161496d565b92915050565b60006020828403121561330857613307614478565b5b6000613316848285016131c4565b91505092915050565b60006020828403121561333557613334614478565b5b6000613343848285016131d9565b91505092915050565b6000806040838503121561336357613362614478565b5b6000613371858286016131c4565b9250506020613382858286016131c4565b9150509250929050565b6000806000606084860312156133a5576133a4614478565b5b60006133b3868287016131c4565b93505060206133c4868287016131c4565b92505060406133d5868287016132c8565b9150509250925092565b600080600080608085870312156133f9576133f8614478565b5b6000613407878288016131c4565b9450506020613418878288016131c4565b9350506040613429878288016132c8565b925050606085013567ffffffffffffffff81111561344a57613449614473565b5b61345687828801613257565b91505092959194509250565b6000806040838503121561347957613478614478565b5b6000613487858286016131c4565b9250506020613498858286016131ee565b9150509250929050565b600080604083850312156134b9576134b8614478565b5b60006134c7858286016131c4565b92505060206134d8858286016132c8565b9150509250929050565b6000602082840312156134f8576134f7614478565b5b600061350684828501613203565b91505092915050565b60006020828403121561352557613524614478565b5b600061353384828501613218565b91505092915050565b60006020828403121561355257613551614478565b5b60006135608482850161322d565b91505092915050565b60006020828403121561357f5761357e614478565b5b600061358d84828501613242565b91505092915050565b6000602082840312156135ac576135ab614478565b5b60006135ba84828501613285565b91505092915050565b600080604083850312156135da576135d9614478565b5b60006135e885828601613285565b92505060206135f9858286016131c4565b9150509250929050565b60006020828403121561361957613618614478565b5b600082013567ffffffffffffffff81111561363757613636614473565b5b6136438482850161329a565b91505092915050565b60006020828403121561366257613661614478565b5b6000613670848285016132c8565b91505092915050565b60006020828403121561368f5761368e614478565b5b600061369d848285016132dd565b91505092915050565b6136af816141e8565b82525050565b6136be81614133565b82525050565b6136cd81614157565b82525050565b6136dc81614163565b82525050565b60006136ed82613fd0565b6136f78185613fe6565b935061370781856020860161423f565b6137108161447d565b840191505092915050565b600061372682613fd0565b6137308185613ff7565b935061374081856020860161423f565b80840191505092915050565b613755816141fa565b82525050565b600061376682613fdb565b6137708185614002565b935061378081856020860161423f565b6137898161447d565b840191505092915050565b600061379f82613fdb565b6137a98185614013565b93506137b981856020860161423f565b80840191505092915050565b600081546137d281614272565b6137dc8186614013565b945060018216600081146137f757600181146138085761383b565b60ff1983168652818601935061383b565b61381185613fbb565b60005b8381101561383357815481890152600182019150602081019050613814565b838801955050505b50505092915050565b6000613851601383614002565b915061385c8261448e565b602082019050919050565b6000613874601f83614002565b915061387f826144b7565b602082019050919050565b6000613897602683614002565b91506138a2826144e0565b604082019050919050565b60006138ba601d83614002565b91506138c58261452f565b602082019050919050565b60006138dd602683614002565b91506138e882614558565b604082019050919050565b6000613900603a83614002565b915061390b826145a7565b604082019050919050565b6000613923601d83614002565b915061392e826145f6565b602082019050919050565b6000613946602683614002565b91506139518261461f565b604082019050919050565b6000613969602b83614002565b91506139748261466e565b604082019050919050565b600061398c601e83614002565b9150613997826146bd565b602082019050919050565b60006139af601c83614002565b91506139ba826146e6565b602082019050919050565b60006139d2601283614002565b91506139dd8261470f565b602082019050919050565b60006139f5600583614013565b9150613a0082614738565b600582019050919050565b6000613a18602083614002565b9150613a2382614761565b602082019050919050565b6000613a3b602583614002565b9150613a468261478a565b604082019050919050565b6000613a5e600083613ff7565b9150613a69826147d9565b600082019050919050565b6000613a81601d83614002565b9150613a8c826147dc565b602082019050919050565b6000613aa4601083614002565b9150613aaf82614805565b602082019050919050565b6000613ac7602a83614002565b9150613ad28261482e565b604082019050919050565b6000613aea600a83614002565b9150613af58261487d565b602082019050919050565b6000613b0d601183614002565b9150613b18826148a6565b602082019050919050565b613b2c816141de565b82525050565b6000613b3e828461371b565b915081905092915050565b6000613b5582856137c5565b9150613b618284613794565b9150613b6c826139e8565b91508190509392505050565b6000613b8382613a51565b9150819050919050565b6000602082019050613ba260008301846136b5565b92915050565b6000604082019050613bbd60008301856136a6565b613bca6020830184613b23565b9392505050565b6000608082019050613be660008301876136b5565b613bf360208301866136b5565b613c006040830185613b23565b8181036060830152613c1281846136e2565b905095945050505050565b6000604082019050613c3260008301856136b5565b613c3f6020830184613b23565b9392505050565b6000602082019050613c5b60008301846136c4565b92915050565b6000602082019050613c7660008301846136d3565b92915050565b6000602082019050613c91600083018461374c565b92915050565b60006020820190508181036000830152613cb1818461375b565b905092915050565b60006020820190508181036000830152613cd281613844565b9050919050565b60006020820190508181036000830152613cf281613867565b9050919050565b60006020820190508181036000830152613d128161388a565b9050919050565b60006020820190508181036000830152613d32816138ad565b9050919050565b60006020820190508181036000830152613d52816138d0565b9050919050565b60006020820190508181036000830152613d72816138f3565b9050919050565b60006020820190508181036000830152613d9281613916565b9050919050565b60006020820190508181036000830152613db281613939565b9050919050565b60006020820190508181036000830152613dd28161395c565b9050919050565b60006020820190508181036000830152613df28161397f565b9050919050565b60006020820190508181036000830152613e12816139a2565b9050919050565b60006020820190508181036000830152613e32816139c5565b9050919050565b60006020820190508181036000830152613e5281613a0b565b9050919050565b60006020820190508181036000830152613e7281613a2e565b9050919050565b60006020820190508181036000830152613e9281613a74565b9050919050565b60006020820190508181036000830152613eb281613a97565b9050919050565b60006020820190508181036000830152613ed281613aba565b9050919050565b60006020820190508181036000830152613ef281613add565b9050919050565b60006020820190508181036000830152613f1281613b00565b9050919050565b6000602082019050613f2e6000830184613b23565b92915050565b6000613f3e613f4f565b9050613f4a82826142a4565b919050565b6000604051905090565b600067ffffffffffffffff821115613f7457613f7361443a565b5b613f7d8261447d565b9050602081019050919050565b600067ffffffffffffffff821115613fa557613fa461443a565b5b613fae8261447d565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614029826141de565b9150614034836141de565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140695761406861434f565b5b828201905092915050565b600061407f826141de565b915061408a836141de565b92508261409a5761409961437e565b5b828204905092915050565b60006140b0826141de565b91506140bb836141de565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140f4576140f361434f565b5b828202905092915050565b600061410a826141de565b9150614115836141de565b9250828210156141285761412761434f565b5b828203905092915050565b600061413e826141be565b9050919050565b6000614150826141be565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006141a482614133565b9050919050565b60008190506141b9826148cf565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006141f38261420c565b9050919050565b6000614205826141ab565b9050919050565b60006142178261421e565b9050919050565b6000614229826141be565b9050919050565b82818337600083830152505050565b60005b8381101561425d578082015181840152602081019050614242565b8381111561426c576000848401525b50505050565b6000600282049050600182168061428a57607f821691505b6020821081141561429e5761429d6143dc565b5b50919050565b6142ad8261447d565b810181811067ffffffffffffffff821117156142cc576142cb61443a565b5b80604052505050565b60006142e0826141de565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143135761431261434f565b5b600182019050919050565b6000614329826141de565b9150614334836141de565b9250826143445761434361437e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4769667420697320616674657220746865207075626c69632073616c65000000600082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f5075626c69632073616c65206973206e6f742061637469766174656400000000600082015250565b7f52656163686564206d617820537570706c790000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f596f752063616e206f6e6c7920676574203130204e46542773206f6e2074686560008201527f2053616c65000000000000000000000000000000000000000000000000000000602082015250565b50565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f4f6e6c7920696620796f75206d696e7400000000000000000000000000000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f5072696365206973203000000000000000000000000000000000000000000000600082015250565b7f4e6f7420656e6f756768742066756e6473000000000000000000000000000000600082015250565b600481106148e0576148df6143ad565b5b50565b6148ec81614133565b81146148f757600080fd5b50565b61490381614145565b811461490e57600080fd5b50565b61491a81614157565b811461492557600080fd5b50565b61493181614163565b811461493c57600080fd5b50565b6149488161416d565b811461495357600080fd5b50565b61495f81614199565b811461496a57600080fd5b50565b614976816141de565b811461498157600080fd5b5056fea26469706673582212202db2715c08db16d7f99fa140eccabecc7f73ca666dead64c06e1109cacd8ed9664736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c026669dbc8de6e1a38d4724f67603fa81432073b94a7593259cb6bbb8e63dbfe50000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000044b8404e56f749afc90797ce387103f095557d82000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d636547354853734d6a73446a4b7a38535a744576484270624d397339323774553752534e51786636367739732f00000000000000000000
Deployed Bytecode
0x6080604052600436106102345760003560e01c80637cb647591161012e578063b88d4fde116100ab578063d79779b21161006f578063d79779b214610896578063e33b7de3146108d3578063e985e9c5146108fe578063f2fde38b1461093b578063f8dcbddb1461096457610274565b8063b88d4fde1461079f578063c87b56dd146107c8578063cbccefb214610805578063cbce4c9714610830578063ce7c2ac21461085957610274565b80639b6860c8116100f25780639b6860c8146106c9578063a0bcfc7f146106f4578063a22cb4651461071d578063ac5ae11b14610746578063b3c542151461076257610274565b80637cb64759146105d05780638b83209b146105f95780638da5cb5b1461063657806395d89b41146106615780639852595c1461068c57610274565b80633a98ef39116101bc5780635be7fde8116101805780635be7fde8146104fd5780636352211e146105145780636c0360eb1461055157806370a082311461057c578063715018a6146105b957610274565b80633a98ef391461041a578063406072a91461044557806342842e0e1461048257806348b75044146104ab578063525f8a5c146104d457610274565b806318160ddd1161020357806318160ddd1461034757806319165587146103725780631cbaee2d1461039b57806323b872dd146103c65780632eb4a7ab146103ef57610274565b806301ffc9a71461027957806306fdde03146102b6578063081812fc146102e1578063095ea7b31461031e57610274565b36610274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161026b90613e99565b60405180910390fd5b600080fd5b34801561028557600080fd5b506102a0600480360381019061029b919061353c565b61098d565b6040516102ad9190613c46565b60405180910390f35b3480156102c257600080fd5b506102cb610a1f565b6040516102d89190613c97565b60405180910390f35b3480156102ed57600080fd5b506103086004803603810190610303919061364c565b610ab1565b6040516103159190613b8d565b60405180910390f35b34801561032a57600080fd5b50610345600480360381019061034091906134a2565b610b2d565b005b34801561035357600080fd5b5061035c610cd4565b6040516103699190613f19565b60405180910390f35b34801561037e57600080fd5b506103996004803603810190610394919061331f565b610ceb565b005b3480156103a757600080fd5b506103b0610e96565b6040516103bd9190613f19565b60405180910390f35b3480156103d257600080fd5b506103ed60048036038101906103e8919061338c565b610e9c565b005b3480156103fb57600080fd5b50610404610eac565b6040516104119190613c61565b60405180910390f35b34801561042657600080fd5b5061042f610eb2565b60405161043c9190613f19565b60405180910390f35b34801561045157600080fd5b5061046c600480360381019061046791906135c3565b610ebc565b6040516104799190613f19565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a4919061338c565b610f43565b005b3480156104b757600080fd5b506104d260048036038101906104cd91906135c3565b610f63565b005b3480156104e057600080fd5b506104fb60048036038101906104f6919061364c565b61122b565b005b34801561050957600080fd5b506105126112b1565b005b34801561052057600080fd5b5061053b6004803603810190610536919061364c565b6112e5565b6040516105489190613b8d565b60405180910390f35b34801561055d57600080fd5b506105666112f7565b6040516105739190613c97565b60405180910390f35b34801561058857600080fd5b506105a3600480360381019061059e91906132f2565b611385565b6040516105b09190613f19565b60405180910390f35b3480156105c557600080fd5b506105ce61143e565b005b3480156105dc57600080fd5b506105f760048036038101906105f2919061350f565b6114c6565b005b34801561060557600080fd5b50610620600480360381019061061b919061364c565b61154c565b60405161062d9190613b8d565b60405180910390f35b34801561064257600080fd5b5061064b611594565b6040516106589190613b8d565b60405180910390f35b34801561066d57600080fd5b506106766115bd565b6040516106839190613c97565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae91906132f2565b61164f565b6040516106c09190613f19565b60405180910390f35b3480156106d557600080fd5b506106de611698565b6040516106eb9190613f19565b60405180910390f35b34801561070057600080fd5b5061071b60048036038101906107169190613603565b61169e565b005b34801561072957600080fd5b50610744600480360381019061073f9190613462565b611734565b005b610760600480360381019061075b91906134a2565b6118ac565b005b34801561076e57600080fd5b50610789600480360381019061078491906132f2565b611b7f565b6040516107969190613f19565b60405180910390f35b3480156107ab57600080fd5b506107c660048036038101906107c191906133df565b611b97565b005b3480156107d457600080fd5b506107ef60048036038101906107ea919061364c565b611c0a565b6040516107fc9190613c97565b60405180910390f35b34801561081157600080fd5b5061081a611c86565b6040516108279190613c7c565b60405180910390f35b34801561083c57600080fd5b50610857600480360381019061085291906134a2565b611c99565b005b34801561086557600080fd5b50610880600480360381019061087b91906132f2565b611df0565b60405161088d9190613f19565b60405180910390f35b3480156108a257600080fd5b506108bd60048036038101906108b89190613596565b611e39565b6040516108ca9190613f19565b60405180910390f35b3480156108df57600080fd5b506108e8611e82565b6040516108f59190613f19565b60405180910390f35b34801561090a57600080fd5b506109256004803603810190610920919061334c565b611e8c565b6040516109329190613c46565b60405180910390f35b34801561094757600080fd5b50610962600480360381019061095d91906132f2565b611f20565b005b34801561097057600080fd5b5061098b6004803603810190610986919061364c565b612018565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109e857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a185750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a2e90614272565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5a90614272565b8015610aa75780601f10610a7c57610100808354040283529160200191610aa7565b820191906000526020600020905b815481529060010190602001808311610a8a57829003601f168201915b5050505050905090565b6000610abc826120d3565b610af2576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b3882612132565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba0576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bbf612200565b73ffffffffffffffffffffffffffffffffffffffff1614610c2257610beb81610be6612200565b611e8c565b610c21576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610cde612208565b6002546001540303905090565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6490613d39565b60405180910390fd5b6000610d77611e82565b47610d82919061401e565b90506000610d998383610d948661164f565b61220d565b90506000811415610ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd690613db9565b60405180910390fd5b80600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e2e919061401e565b9250508190555080600a6000828254610e47919061401e565b92505081905550610e58838261227b565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610e89929190613ba8565b60405180910390a1505050565b60145481565b610ea783838361236f565b505050565b60135481565b6000600954905090565b6000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610f5e83838360405180602001604052806000815250611b97565b505050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdc90613d39565b60405180910390fd5b6000610ff083611e39565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110299190613b8d565b60206040518083038186803b15801561104157600080fd5b505afa158015611055573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110799190613679565b611083919061401e565b9050600061109b83836110968787610ebc565b61220d565b905060008114156110e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d890613db9565b60405180910390fd5b80600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461116d919061401e565b9250508190555080600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111c3919061401e565b925050819055506111d5848483612719565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a848360405161121d929190613c1d565b60405180910390a250505050565b61123361279f565b73ffffffffffffffffffffffffffffffffffffffff16611251611594565b73ffffffffffffffffffffffffffffffffffffffff16146112a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129e90613e39565b60405180910390fd5b8060148190555050565b60005b6016548110156112e2576112cf6112ca8261154c565b610ceb565b80806112da906142d5565b9150506112b4565b50565b60006112f082612132565b9050919050565b6010805461130490614272565b80601f016020809104026020016040519081016040528092919081815260200182805461133090614272565b801561137d5780601f106113525761010080835404028352916020019161137d565b820191906000526020600020905b81548152906001019060200180831161136057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113ed576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61144661279f565b73ffffffffffffffffffffffffffffffffffffffff16611464611594565b73ffffffffffffffffffffffffffffffffffffffff16146114ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b190613e39565b60405180910390fd5b6114c460006127a7565b565b6114ce61279f565b73ffffffffffffffffffffffffffffffffffffffff166114ec611594565b73ffffffffffffffffffffffffffffffffffffffff1614611542576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153990613e39565b60405180910390fd5b8060138190555050565b6000600d82815481106115625761156161440b565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546115cc90614272565b80601f01602080910402602001604051908101604052809291908181526020018280546115f890614272565b80156116455780601f1061161a57610100808354040283529160200191611645565b820191906000526020600020905b81548152906001019060200180831161162857829003601f168201915b5050505050905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60125481565b6116a661279f565b73ffffffffffffffffffffffffffffffffffffffff166116c4611594565b73ffffffffffffffffffffffffffffffffffffffff161461171a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171190613e39565b60405180910390fd5b806010908051906020019061173092919061309d565b5050565b61173c612200565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117a1576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006117ae612200565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661185b612200565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118a09190613c46565b60405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461191a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191190613dd9565b60405180910390fd5b600060125490506000811415611965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195c90613ed9565b60405180910390fd5b60016003811115611979576119786143ad565b5b601160009054906101000a900460ff16600381111561199b5761199a6143ad565b5b146119db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d290613df9565b60405180910390fd5b6118de60006119ea919061401e565b826119f3610cd4565b6119fd919061401e565b1115611a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3590613cb9565b60405180910390fd5b600a82601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a8b919061401e565b1115611acc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac390613e59565b60405180910390fd5b8181611ad891906140a5565b341015611b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1190613ef9565b60405180910390fd5b81601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b69919061401e565b92505081905550611b7a838361286b565b505050565b60156020528060005260406000206000915090505481565b611ba284848461236f565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611c0457611bcd84848484612889565b611c03576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060611c15826120d3565b611c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4b90613cd9565b60405180910390fd5b6010611c5f836129e9565b604051602001611c70929190613b49565b6040516020818303038152906040529050919050565b601160009054906101000a900460ff1681565b611ca161279f565b73ffffffffffffffffffffffffffffffffffffffff16611cbf611594565b73ffffffffffffffffffffffffffffffffffffffff1614611d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0c90613e39565b60405180910390fd5b60016003811115611d2957611d286143ad565b5b601160009054906101000a900460ff166003811115611d4b57611d4a6143ad565b5b11611d8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8290613d19565b60405180910390fd5b611a0a81611d97610cd4565b611da1919061401e565b1115611de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd990613e19565b60405180910390fd5b611dec828261286b565b5050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600a54905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f2861279f565b73ffffffffffffffffffffffffffffffffffffffff16611f46611594565b73ffffffffffffffffffffffffffffffffffffffff1614611f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9390613e39565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561200c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200390613cf9565b60405180910390fd5b612015816127a7565b50565b61202061279f565b73ffffffffffffffffffffffffffffffffffffffff1661203e611594565b73ffffffffffffffffffffffffffffffffffffffff1614612094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208b90613e39565b60405180910390fd5b8060038111156120a7576120a66143ad565b5b601160006101000a81548160ff021916908360038111156120cb576120ca6143ad565b5b021790555050565b6000816120de612208565b111580156120ed575060015482105b801561212b575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b60008082905080612141612208565b116121c9576001548110156121c85760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156121c6575b60008114156121bc576005600083600190039350838152602001908152602001600020549050612191565b80925050506121fb565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b600081600954600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548561225e91906140a5565b6122689190614074565b61227291906140ff565b90509392505050565b804710156122be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b590613d79565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516122e490613b78565b60006040518083038185875af1925050503d8060008114612321576040519150601f19603f3d011682016040523d82523d6000602084013e612326565b606091505b505090508061236a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236190613d59565b60405180910390fd5b505050565b600061237a82612132565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146123e1576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612402612200565b73ffffffffffffffffffffffffffffffffffffffff16148061243157506124308561242b612200565b611e8c565b5b80612476575061243f612200565b73ffffffffffffffffffffffffffffffffffffffff1661245e84610ab1565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806124af576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612516576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125238585856001612b4a565b6007600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61262086612b50565b1717600560008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831614156126aa5760006001840190506000600560008381526020019081526020016000205414156126a85760015481146126a7578260056000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127128585856001612b5a565b5050505050565b61279a8363a9059cbb60e01b8484604051602401612738929190613c1d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612b60565b505050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612885828260405180602001604052806000815250612c27565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128af612200565b8786866040518563ffffffff1660e01b81526004016128d19493929190613bd1565b602060405180830381600087803b1580156128eb57600080fd5b505af192505050801561291c57506040513d601f19601f820116820180604052508101906129199190613569565b60015b612996573d806000811461294c576040519150601f19603f3d011682016040523d82523d6000602084013e612951565b606091505b5060008151141561298e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612a31576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b45565b600082905060005b60008214612a63578080612a4c906142d5565b915050600a82612a5c9190614074565b9150612a39565b60008167ffffffffffffffff811115612a7f57612a7e61443a565b5b6040519080825280601f01601f191660200182016040528015612ab15781602001600182028036833780820191505090505b5090505b60008514612b3e57600182612aca91906140ff565b9150600a85612ad9919061431e565b6030612ae5919061401e565b60f81b818381518110612afb57612afa61440b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b379190614074565b9450612ab5565b8093505050505b919050565b50505050565b6000819050919050565b50505050565b6000612bc2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612edd9092919063ffffffff16565b9050600081511115612c225780806020019051810190612be291906134e2565b612c21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1890613eb9565b60405180910390fd5b5b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612c95576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612cd0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cdd6000858386612b4a565b600160406001901b178302600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612d4260018514612ef5565b901b60a042901b612d5286612b50565b1717600560008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612e56575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e066000878480600101955087612889565b612e3c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612d97578260015414612e5157600080fd5b612ec1565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612e57575b816001819055505050612ed76000858386612b5a565b50505050565b6060612eec8484600085612eff565b90509392505050565b6000819050919050565b606082471015612f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3b90613d99565b60405180910390fd5b612f4d85613013565b612f8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8390613e79565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612fb59190613b32565b60006040518083038185875af1925050503d8060008114612ff2576040519150601f19603f3d011682016040523d82523d6000602084013e612ff7565b606091505b5091509150613007828286613036565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060831561304657829050613096565b6000835111156130595782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308d9190613c97565b60405180910390fd5b9392505050565b8280546130a990614272565b90600052602060002090601f0160209004810192826130cb5760008555613112565b82601f106130e457805160ff1916838001178555613112565b82800160010185558215613112579182015b828111156131115782518255916020019190600101906130f6565b5b50905061311f9190613123565b5090565b5b8082111561313c576000816000905550600101613124565b5090565b600061315361314e84613f59565b613f34565b90508281526020810184848401111561316f5761316e61446e565b5b61317a848285614230565b509392505050565b600061319561319084613f8a565b613f34565b9050828152602081018484840111156131b1576131b061446e565b5b6131bc848285614230565b509392505050565b6000813590506131d3816148e3565b92915050565b6000813590506131e8816148fa565b92915050565b6000813590506131fd81614911565b92915050565b60008151905061321281614911565b92915050565b60008135905061322781614928565b92915050565b60008135905061323c8161493f565b92915050565b6000815190506132518161493f565b92915050565b600082601f83011261326c5761326b614469565b5b813561327c848260208601613140565b91505092915050565b60008135905061329481614956565b92915050565b600082601f8301126132af576132ae614469565b5b81356132bf848260208601613182565b91505092915050565b6000813590506132d78161496d565b92915050565b6000815190506132ec8161496d565b92915050565b60006020828403121561330857613307614478565b5b6000613316848285016131c4565b91505092915050565b60006020828403121561333557613334614478565b5b6000613343848285016131d9565b91505092915050565b6000806040838503121561336357613362614478565b5b6000613371858286016131c4565b9250506020613382858286016131c4565b9150509250929050565b6000806000606084860312156133a5576133a4614478565b5b60006133b3868287016131c4565b93505060206133c4868287016131c4565b92505060406133d5868287016132c8565b9150509250925092565b600080600080608085870312156133f9576133f8614478565b5b6000613407878288016131c4565b9450506020613418878288016131c4565b9350506040613429878288016132c8565b925050606085013567ffffffffffffffff81111561344a57613449614473565b5b61345687828801613257565b91505092959194509250565b6000806040838503121561347957613478614478565b5b6000613487858286016131c4565b9250506020613498858286016131ee565b9150509250929050565b600080604083850312156134b9576134b8614478565b5b60006134c7858286016131c4565b92505060206134d8858286016132c8565b9150509250929050565b6000602082840312156134f8576134f7614478565b5b600061350684828501613203565b91505092915050565b60006020828403121561352557613524614478565b5b600061353384828501613218565b91505092915050565b60006020828403121561355257613551614478565b5b60006135608482850161322d565b91505092915050565b60006020828403121561357f5761357e614478565b5b600061358d84828501613242565b91505092915050565b6000602082840312156135ac576135ab614478565b5b60006135ba84828501613285565b91505092915050565b600080604083850312156135da576135d9614478565b5b60006135e885828601613285565b92505060206135f9858286016131c4565b9150509250929050565b60006020828403121561361957613618614478565b5b600082013567ffffffffffffffff81111561363757613636614473565b5b6136438482850161329a565b91505092915050565b60006020828403121561366257613661614478565b5b6000613670848285016132c8565b91505092915050565b60006020828403121561368f5761368e614478565b5b600061369d848285016132dd565b91505092915050565b6136af816141e8565b82525050565b6136be81614133565b82525050565b6136cd81614157565b82525050565b6136dc81614163565b82525050565b60006136ed82613fd0565b6136f78185613fe6565b935061370781856020860161423f565b6137108161447d565b840191505092915050565b600061372682613fd0565b6137308185613ff7565b935061374081856020860161423f565b80840191505092915050565b613755816141fa565b82525050565b600061376682613fdb565b6137708185614002565b935061378081856020860161423f565b6137898161447d565b840191505092915050565b600061379f82613fdb565b6137a98185614013565b93506137b981856020860161423f565b80840191505092915050565b600081546137d281614272565b6137dc8186614013565b945060018216600081146137f757600181146138085761383b565b60ff1983168652818601935061383b565b61381185613fbb565b60005b8381101561383357815481890152600182019150602081019050613814565b838801955050505b50505092915050565b6000613851601383614002565b915061385c8261448e565b602082019050919050565b6000613874601f83614002565b915061387f826144b7565b602082019050919050565b6000613897602683614002565b91506138a2826144e0565b604082019050919050565b60006138ba601d83614002565b91506138c58261452f565b602082019050919050565b60006138dd602683614002565b91506138e882614558565b604082019050919050565b6000613900603a83614002565b915061390b826145a7565b604082019050919050565b6000613923601d83614002565b915061392e826145f6565b602082019050919050565b6000613946602683614002565b91506139518261461f565b604082019050919050565b6000613969602b83614002565b91506139748261466e565b604082019050919050565b600061398c601e83614002565b9150613997826146bd565b602082019050919050565b60006139af601c83614002565b91506139ba826146e6565b602082019050919050565b60006139d2601283614002565b91506139dd8261470f565b602082019050919050565b60006139f5600583614013565b9150613a0082614738565b600582019050919050565b6000613a18602083614002565b9150613a2382614761565b602082019050919050565b6000613a3b602583614002565b9150613a468261478a565b604082019050919050565b6000613a5e600083613ff7565b9150613a69826147d9565b600082019050919050565b6000613a81601d83614002565b9150613a8c826147dc565b602082019050919050565b6000613aa4601083614002565b9150613aaf82614805565b602082019050919050565b6000613ac7602a83614002565b9150613ad28261482e565b604082019050919050565b6000613aea600a83614002565b9150613af58261487d565b602082019050919050565b6000613b0d601183614002565b9150613b18826148a6565b602082019050919050565b613b2c816141de565b82525050565b6000613b3e828461371b565b915081905092915050565b6000613b5582856137c5565b9150613b618284613794565b9150613b6c826139e8565b91508190509392505050565b6000613b8382613a51565b9150819050919050565b6000602082019050613ba260008301846136b5565b92915050565b6000604082019050613bbd60008301856136a6565b613bca6020830184613b23565b9392505050565b6000608082019050613be660008301876136b5565b613bf360208301866136b5565b613c006040830185613b23565b8181036060830152613c1281846136e2565b905095945050505050565b6000604082019050613c3260008301856136b5565b613c3f6020830184613b23565b9392505050565b6000602082019050613c5b60008301846136c4565b92915050565b6000602082019050613c7660008301846136d3565b92915050565b6000602082019050613c91600083018461374c565b92915050565b60006020820190508181036000830152613cb1818461375b565b905092915050565b60006020820190508181036000830152613cd281613844565b9050919050565b60006020820190508181036000830152613cf281613867565b9050919050565b60006020820190508181036000830152613d128161388a565b9050919050565b60006020820190508181036000830152613d32816138ad565b9050919050565b60006020820190508181036000830152613d52816138d0565b9050919050565b60006020820190508181036000830152613d72816138f3565b9050919050565b60006020820190508181036000830152613d9281613916565b9050919050565b60006020820190508181036000830152613db281613939565b9050919050565b60006020820190508181036000830152613dd28161395c565b9050919050565b60006020820190508181036000830152613df28161397f565b9050919050565b60006020820190508181036000830152613e12816139a2565b9050919050565b60006020820190508181036000830152613e32816139c5565b9050919050565b60006020820190508181036000830152613e5281613a0b565b9050919050565b60006020820190508181036000830152613e7281613a2e565b9050919050565b60006020820190508181036000830152613e9281613a74565b9050919050565b60006020820190508181036000830152613eb281613a97565b9050919050565b60006020820190508181036000830152613ed281613aba565b9050919050565b60006020820190508181036000830152613ef281613add565b9050919050565b60006020820190508181036000830152613f1281613b00565b9050919050565b6000602082019050613f2e6000830184613b23565b92915050565b6000613f3e613f4f565b9050613f4a82826142a4565b919050565b6000604051905090565b600067ffffffffffffffff821115613f7457613f7361443a565b5b613f7d8261447d565b9050602081019050919050565b600067ffffffffffffffff821115613fa557613fa461443a565b5b613fae8261447d565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614029826141de565b9150614034836141de565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140695761406861434f565b5b828201905092915050565b600061407f826141de565b915061408a836141de565b92508261409a5761409961437e565b5b828204905092915050565b60006140b0826141de565b91506140bb836141de565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140f4576140f361434f565b5b828202905092915050565b600061410a826141de565b9150614115836141de565b9250828210156141285761412761434f565b5b828203905092915050565b600061413e826141be565b9050919050565b6000614150826141be565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006141a482614133565b9050919050565b60008190506141b9826148cf565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006141f38261420c565b9050919050565b6000614205826141ab565b9050919050565b60006142178261421e565b9050919050565b6000614229826141be565b9050919050565b82818337600083830152505050565b60005b8381101561425d578082015181840152602081019050614242565b8381111561426c576000848401525b50505050565b6000600282049050600182168061428a57607f821691505b6020821081141561429e5761429d6143dc565b5b50919050565b6142ad8261447d565b810181811067ffffffffffffffff821117156142cc576142cb61443a565b5b80604052505050565b60006142e0826141de565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143135761431261434f565b5b600182019050919050565b6000614329826141de565b9150614334836141de565b9250826143445761434361437e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4769667420697320616674657220746865207075626c69632073616c65000000600082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f5075626c69632073616c65206973206e6f742061637469766174656400000000600082015250565b7f52656163686564206d617820537570706c790000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f596f752063616e206f6e6c7920676574203130204e46542773206f6e2074686560008201527f2053616c65000000000000000000000000000000000000000000000000000000602082015250565b50565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f4f6e6c7920696620796f75206d696e7400000000000000000000000000000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f5072696365206973203000000000000000000000000000000000000000000000600082015250565b7f4e6f7420656e6f756768742066756e6473000000000000000000000000000000600082015250565b600481106148e0576148df6143ad565b5b50565b6148ec81614133565b81146148f757600080fd5b50565b61490381614145565b811461490e57600080fd5b50565b61491a81614157565b811461492557600080fd5b50565b61493181614163565b811461493c57600080fd5b50565b6149488161416d565b811461495357600080fd5b50565b61495f81614199565b811461496a57600080fd5b50565b614976816141de565b811461498157600080fd5b5056fea26469706673582212202db2715c08db16d7f99fa140eccabecc7f73ca666dead64c06e1109cacd8ed9664736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c026669dbc8de6e1a38d4724f67603fa81432073b94a7593259cb6bbb8e63dbfe50000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000044b8404e56f749afc90797ce387103f095557d82000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d636547354853734d6a73446a4b7a38535a744576484270624d397339323774553752534e51786636367739732f00000000000000000000
-----Decoded View---------------
Arg [0] : _team (address[]): 0x44b8404e56f749AFC90797CE387103f095557D82
Arg [1] : _teamShares (uint256[]): 100
Arg [2] : _merkleRoot (bytes32): 0x26669dbc8de6e1a38d4724f67603fa81432073b94a7593259cb6bbb8e63dbfe5
Arg [3] : _baseURI (string): ipfs://QmceG5HSsMjsDjKz8SZtEvHBpbM9s927tU7RSNQxf66w9s/
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 26669dbc8de6e1a38d4724f67603fa81432073b94a7593259cb6bbb8e63dbfe5
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [5] : 00000000000000000000000044b8404e56f749afc90797ce387103f095557d82
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [9] : 697066733a2f2f516d636547354853734d6a73446a4b7a38535a744576484270
Arg [10] : 624d397339323774553752534e51786636367739732f00000000000000000000
Deployed Bytecode Sourcemap
69619:4672:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74252:26;;;;;;;;;;:::i;:::-;;;;;;;;69619:4672;;;;13035:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18048:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20116:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19576:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12089:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64414:566;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70210:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21002:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70176:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62759:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63888:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21243:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65248:641;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72760:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74056:141;;;;;;;;;;;;;:::i;:::-;;17837:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69835:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13714:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68700:103;;;;;;;;;;;;;:::i;:::-;;73465:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64114:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68049:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18217:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63610:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70127:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72883:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20392:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71819:656;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70330:61;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21499:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73191:249;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69865:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72483:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63406:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63196:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62944:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20771:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68958:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73091:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13035:615;13120:4;13435:10;13420:25;;:11;:25;;;;:102;;;;13512:10;13497:25;;:11;:25;;;;13420:102;:179;;;;13589:10;13574:25;;:11;:25;;;;13420:179;13400:199;;13035:615;;;:::o;18048:100::-;18102:13;18135:5;18128:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18048:100;:::o;20116:204::-;20184:7;20209:16;20217:7;20209;:16::i;:::-;20204:64;;20234:34;;;;;;;;;;;;;;20204:64;20288:15;:24;20304:7;20288:24;;;;;;;;;;;;;;;;;;;;;20281:31;;20116:204;;;:::o;19576:474::-;19649:13;19681:27;19700:7;19681:18;:27::i;:::-;19649:61;;19731:5;19725:11;;:2;:11;;;19721:48;;;19745:24;;;;;;;;;;;;;;19721:48;19809:5;19786:28;;:19;:17;:19::i;:::-;:28;;;19782:175;;19834:44;19851:5;19858:19;:17;:19::i;:::-;19834:16;:44::i;:::-;19829:128;;19906:35;;;;;;;;;;;;;;19829:128;19782:175;19996:2;19969:15;:24;19985:7;19969:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;20034:7;20030:2;20014:28;;20023:5;20014:28;;;;;;;;;;;;19638:412;19576:474;;:::o;12089:315::-;12142:7;12370:15;:13;:15::i;:::-;12355:12;;12339:13;;:28;:46;12332:53;;12089:315;:::o;64414:566::-;64509:1;64490:7;:16;64498:7;64490:16;;;;;;;;;;;;;;;;:20;64482:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;64566:21;64614:15;:13;:15::i;:::-;64590:21;:39;;;;:::i;:::-;64566:63;;64640:15;64658:58;64674:7;64683:13;64698:17;64707:7;64698:8;:17::i;:::-;64658:15;:58::i;:::-;64640:76;;64748:1;64737:7;:12;;64729:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64832:7;64810:9;:18;64820:7;64810:18;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;64868:7;64850:14;;:25;;;;;;;:::i;:::-;;;;;;;;64888:35;64906:7;64915;64888:17;:35::i;:::-;64939:33;64955:7;64964;64939:33;;;;;;;:::i;:::-;;;;;;;;64471:509;;64414:566;:::o;70210:38::-;;;;:::o;21002:170::-;21136:28;21146:4;21152:2;21156:7;21136:9;:28::i;:::-;21002:170;;;:::o;70176:25::-;;;;:::o;62759:91::-;62803:7;62830:12;;62823:19;;62759:91;:::o;63888:135::-;63958:7;63985:14;:21;64000:5;63985:21;;;;;;;;;;;;;;;:30;64007:7;63985:30;;;;;;;;;;;;;;;;63978:37;;63888:135;;;;:::o;21243:185::-;21381:39;21398:4;21404:2;21408:7;21381:39;;;;;;;;;;;;:16;:39::i;:::-;21243:185;;;:::o;65248:641::-;65349:1;65330:7;:16;65338:7;65330:16;;;;;;;;;;;;;;;;:20;65322:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;65406:21;65463:20;65477:5;65463:13;:20::i;:::-;65430:5;:15;;;65454:4;65430:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;65406:77;;65494:15;65512:65;65528:7;65537:13;65552:24;65561:5;65568:7;65552:8;:24::i;:::-;65512:15;:65::i;:::-;65494:83;;65609:1;65598:7;:12;;65590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65705:7;65671:14;:21;65686:5;65671:21;;;;;;;;;;;;;;;:30;65693:7;65671:30;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;65753:7;65723:19;:26;65743:5;65723:26;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;65773:47;65796:5;65803:7;65812;65773:22;:47::i;:::-;65857:5;65836:45;;;65864:7;65873;65836:45;;;;;;;:::i;:::-;;;;;;;;65311:578;;65248:641;;:::o;72760:115::-;68280:12;:10;:12::i;:::-;68269:23;;:7;:5;:7::i;:::-;:23;;;68261:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72853:14:::1;72837:13;:30;;;;72760:115:::0;:::o;74056:141::-;74102:6;74098:92;74119:10;;74115:1;:14;74098:92;;;74152:26;74168:8;74174:1;74168:5;:8::i;:::-;74152:7;:26::i;:::-;74132:3;;;;;:::i;:::-;;;;74098:92;;;;74056:141::o;17837:144::-;17901:7;17944:27;17963:7;17944:18;:27::i;:::-;17921:52;;17837:144;;;:::o;69835:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13714:224::-;13778:7;13819:1;13802:19;;:5;:19;;;13798:60;;;13830:28;;;;;;;;;;;;;;13798:60;9053:13;13876:18;:25;13895:5;13876:25;;;;;;;;;;;;;;;;:54;13869:61;;13714:224;;;:::o;68700:103::-;68280:12;:10;:12::i;:::-;68269:23;;:7;:5;:7::i;:::-;:23;;;68261:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68765:30:::1;68792:1;68765:18;:30::i;:::-;68700:103::o:0;73465:106::-;68280:12;:10;:12::i;:::-;68269:23;;:7;:5;:7::i;:::-;:23;;;68261:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73552:11:::1;73539:10;:24;;;;73465:106:::0;:::o;64114:100::-;64165:7;64192;64200:5;64192:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;64185:21;;64114:100;;;:::o;68049:87::-;68095:7;68122:6;;;;;;;;;;;68115:13;;68049:87;:::o;18217:104::-;18273:13;18306:7;18299:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18217:104;:::o;63610:109::-;63666:7;63693:9;:18;63703:7;63693:18;;;;;;;;;;;;;;;;63686:25;;63610:109;;;:::o;70127:40::-;;;;:::o;72883:100::-;68280:12;:10;:12::i;:::-;68269:23;;:7;:5;:7::i;:::-;:23;;;68261:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72967:8:::1;72957:7;:18;;;;;;;;;;;;:::i;:::-;;72883:100:::0;:::o;20392:308::-;20503:19;:17;:19::i;:::-;20491:31;;:8;:31;;;20487:61;;;20531:17;;;;;;;;;;;;;;20487:61;20613:8;20561:18;:39;20580:19;:17;:19::i;:::-;20561:39;;;;;;;;;;;;;;;:49;20601:8;20561:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;20673:8;20637:55;;20652:19;:17;:19::i;:::-;20637:55;;;20683:8;20637:55;;;;;;:::i;:::-;;;;;;;;20392:308;;:::o;71819:656::-;70786:10;70773:23;;:9;:23;;;70765:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;71918:10:::1;71931:15;;71918:28;;71974:1;71965:5;:10;;71957:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;72024:15;72009:30;;;;;;;;:::i;:::-;;:11;;;;;;;;;;;:30;;;;;;;;:::i;:::-;;;72001:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;70024:4;69981:1;72120:26;;;;:::i;:::-;72107:9;72091:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:55;;72083:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;72246:2;72233:9;72189:29;:41;72219:10;72189:41;;;;;;;;;;;;;;;;:53;;;;:::i;:::-;:59;;72181:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;72330:9;72322:5;:17;;;;:::i;:::-;72309:9;:30;;72301:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;72417:9;72372:29;:41;72402:10;72372:41;;;;;;;;;;;;;;;;:54;;;;;;;:::i;:::-;;;;;;;;72437:30;72447:8;72457:9;72437;:30::i;:::-;71907:568;71819:656:::0;;:::o;70330:61::-;;;;;;;;;;;;;;;;;:::o;21499:396::-;21666:28;21676:4;21682:2;21686:7;21666:9;:28::i;:::-;21727:1;21709:2;:14;;;:19;21705:183;;21748:56;21779:4;21785:2;21789:7;21798:5;21748:30;:56::i;:::-;21743:145;;21832:40;;;;;;;;;;;;;;21743:145;21705:183;21499:396;;;;:::o;73191:249::-;73262:13;73296:17;73304:8;73296:7;:17::i;:::-;73288:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;73393:7;73402:19;:8;:17;:19::i;:::-;73376:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;73362:70;;73191:249;;;:::o;69865:23::-;;;;;;;;;;;;;:::o;72483:269::-;68280:12;:10;:12::i;:::-;68269:23;;:7;:5;:7::i;:::-;:23;;;68261:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72578:15:::1;72564:29;;;;;;;;:::i;:::-;;:11;;;;;;;;;;;:29;;;;;;;;:::i;:::-;;;72556:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;69932:4;72662:9;72646:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;72638:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;72719:25;72729:3;72734:9;72719;:25::i;:::-;72483:269:::0;;:::o;63406:105::-;63460:7;63487;:16;63495:7;63487:16;;;;;;;;;;;;;;;;63480:23;;63406:105;;;:::o;63196:119::-;63254:7;63281:19;:26;63301:5;63281:26;;;;;;;;;;;;;;;;63274:33;;63196:119;;;:::o;62944:95::-;62990:7;63017:14;;63010:21;;62944:95;:::o;20771:164::-;20868:4;20892:18;:25;20911:5;20892:25;;;;;;;;;;;;;;;:35;20918:8;20892:35;;;;;;;;;;;;;;;;;;;;;;;;;20885:42;;20771:164;;;;:::o;68958:201::-;68280:12;:10;:12::i;:::-;68269:23;;:7;:5;:7::i;:::-;:23;;;68261:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69067:1:::1;69047:22;;:8;:22;;;;69039:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;69123:28;69142:8;69123:18;:28::i;:::-;68958:201:::0;:::o;73091:92::-;68280:12;:10;:12::i;:::-;68269:23;;:7;:5;:7::i;:::-;:23;;;68261:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73169:5:::1;73164:11;;;;;;;;:::i;:::-;;73150;;:25;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;73091:92:::0;:::o;22150:273::-;22207:4;22263:7;22244:15;:13;:15::i;:::-;:26;;:66;;;;;22297:13;;22287:7;:23;22244:66;:152;;;;;22395:1;9823:8;22348:17;:26;22366:7;22348:26;;;;;;;;;;;;:43;:48;22244:152;22224:172;;22150:273;;;:::o;15352:1129::-;15419:7;15439:12;15454:7;15439:22;;15522:4;15503:15;:13;:15::i;:::-;:23;15499:915;;15556:13;;15549:4;:20;15545:869;;;15594:14;15611:17;:23;15629:4;15611:23;;;;;;;;;;;;15594:40;;15727:1;9823:8;15700:6;:23;:28;15696:699;;;16219:113;16236:1;16226:6;:11;16219:113;;;16279:17;:25;16297:6;;;;;;;16279:25;;;;;;;;;;;;16270:34;;16219:113;;;16365:6;16358:13;;;;;;15696:699;15571:843;15545:869;15499:915;16442:31;;;;;;;;;;;;;;15352:1129;;;;:::o;36132:105::-;36192:7;36219:10;36212:17;;36132:105;:::o;11612:92::-;11668:7;11612:92;:::o;66067:248::-;66213:7;66292:15;66277:12;;66257:7;:16;66265:7;66257:16;;;;;;;;;;;;;;;;66241:13;:32;;;;:::i;:::-;66240:49;;;;:::i;:::-;:67;;;;:::i;:::-;66233:74;;66067:248;;;;;:::o;42925:317::-;43040:6;43015:21;:31;;43007:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43094:12;43112:9;:14;;43134:6;43112:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43093:52;;;43164:7;43156:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;42996:246;42925:317;;:::o;27389:2515::-;27504:27;27534;27553:7;27534:18;:27::i;:::-;27504:57;;27619:4;27578:45;;27594:19;27578:45;;;27574:86;;27632:28;;;;;;;;;;;;;;27574:86;27673:22;27722:4;27699:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;27743:43;27760:4;27766:19;:17;:19::i;:::-;27743:16;:43::i;:::-;27699:87;:147;;;;27827:19;:17;:19::i;:::-;27803:43;;:20;27815:7;27803:11;:20::i;:::-;:43;;;27699:147;27673:174;;27865:17;27860:66;;27891:35;;;;;;;;;;;;;;27860:66;27955:1;27941:16;;:2;:16;;;27937:52;;;27966:23;;;;;;;;;;;;;;27937:52;28002:43;28024:4;28030:2;28034:7;28043:1;28002:21;:43::i;:::-;28118:15;:24;28134:7;28118:24;;;;;;;;;;;;28111:31;;;;;;;;;;;28510:18;:24;28529:4;28510:24;;;;;;;;;;;;;;;;28508:26;;;;;;;;;;;;28579:18;:22;28598:2;28579:22;;;;;;;;;;;;;;;;28577:24;;;;;;;;;;;10105:8;9707:3;28960:15;:41;;28918:21;28936:2;28918:17;:21::i;:::-;:84;:128;28872:17;:26;28890:7;28872:26;;;;;;;;;;;:174;;;;29216:1;10105:8;29166:19;:46;:51;29162:626;;;29238:19;29270:1;29260:7;:11;29238:33;;29427:1;29393:17;:30;29411:11;29393:30;;;;;;;;;;;;:35;29389:384;;;29531:13;;29516:11;:28;29512:242;;29711:19;29678:17;:30;29696:11;29678:30;;;;;;;;;;;:52;;;;29512:242;29389:384;29219:569;29162:626;29835:7;29831:2;29816:27;;29825:4;29816:27;;;;;;;;;;;;29854:42;29875:4;29881:2;29885:7;29894:1;29854:20;:42::i;:::-;27493:2411;;27389:2515;;;:::o;52510:211::-;52627:86;52647:5;52677:23;;;52702:2;52706:5;52654:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52627:19;:86::i;:::-;52510:211;;;:::o;59170:98::-;59223:7;59250:10;59243:17;;59170:98;:::o;69319:191::-;69393:16;69412:6;;;;;;;;;;;69393:25;;69438:8;69429:6;;:17;;;;;;;;;;;;;;;;;;69493:8;69462:40;;69483:8;69462:40;;;;;;;;;;;;69382:128;69319:191;:::o;22507:104::-;22576:27;22586:2;22590:8;22576:27;;;;;;;;;;;;:9;:27::i;:::-;22507:104;;:::o;33601:716::-;33764:4;33810:2;33785:45;;;33831:19;:17;:19::i;:::-;33852:4;33858:7;33867:5;33785:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33781:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34085:1;34068:6;:13;:18;34064:235;;;34114:40;;;;;;;;;;;;;;34064:235;34257:6;34251:13;34242:6;34238:2;34234:15;34227:38;33781:529;33954:54;;;33944:64;;;:6;:64;;;;33937:71;;;33601:716;;;;;;:::o;38672:723::-;38728:13;38958:1;38949:5;:10;38945:53;;;38976:10;;;;;;;;;;;;;;;;;;;;;38945:53;39008:12;39023:5;39008:20;;39039:14;39064:78;39079:1;39071:4;:9;39064:78;;39097:8;;;;;:::i;:::-;;;;39128:2;39120:10;;;;;:::i;:::-;;;39064:78;;;39152:19;39184:6;39174:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39152:39;;39202:154;39218:1;39209:5;:10;39202:154;;39246:1;39236:11;;;;;:::i;:::-;;;39313:2;39305:5;:10;;;;:::i;:::-;39292:2;:24;;;;:::i;:::-;39279:39;;39262:6;39269;39262:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;39342:2;39333:11;;;;;:::i;:::-;;;39202:154;;;39380:6;39366:21;;;;;38672:723;;;;:::o;34965:159::-;;;;;:::o;19137:148::-;19201:14;19262:5;19252:15;;19137:148;;;:::o;35783:158::-;;;;;:::o;55083:716::-;55507:23;55533:69;55561:4;55533:69;;;;;;;;;;;;;;;;;55541:5;55533:27;;;;:69;;;;;:::i;:::-;55507:95;;55637:1;55617:10;:17;:21;55613:179;;;55714:10;55703:30;;;;;;;;;;;;:::i;:::-;55695:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;55613:179;55153:646;55083:716;;:::o;22984:2236::-;23107:20;23130:13;;23107:36;;23172:1;23158:16;;:2;:16;;;23154:48;;;23183:19;;;;;;;;;;;;;;23154:48;23229:1;23217:8;:13;23213:44;;;23239:18;;;;;;;;;;;;;;23213:44;23270:61;23300:1;23304:2;23308:12;23322:8;23270:21;:61::i;:::-;23874:1;9190:2;23845:1;:25;;23844:31;23832:8;:44;23806:18;:22;23825:2;23806:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;9970:3;24275:29;24302:1;24290:8;:13;24275:14;:29::i;:::-;:56;;9707:3;24212:15;:41;;24170:21;24188:2;24170:17;:21::i;:::-;:84;:162;24119:17;:31;24137:12;24119:31;;;;;;;;;;;:213;;;;24349:20;24372:12;24349:35;;24399:11;24428:8;24413:12;:23;24399:37;;24475:1;24457:2;:14;;;:19;24453:635;;24497:313;24553:12;24549:2;24528:38;;24545:1;24528:38;;;;;;;;;;;;24594:69;24633:1;24637:2;24641:14;;;;;;24657:5;24594:30;:69::i;:::-;24589:174;;24699:40;;;;;;;;;;;;;;24589:174;24805:3;24790:12;:18;24497:313;;24891:12;24874:13;;:29;24870:43;;24905:8;;;24870:43;24453:635;;;24954:119;25010:14;;;;;;25006:2;24985:40;;25002:1;24985:40;;;;;;;;;;;;25068:3;25053:12;:18;24954:119;;24453:635;25118:12;25102:13;:28;;;;23583:1559;;25152:60;25181:1;25185:2;25189:12;25203:8;25152:20;:60::i;:::-;23096:2124;22984:2236;;;:::o;44409:229::-;44546:12;44578:52;44600:6;44608:4;44614:1;44617:12;44578:21;:52::i;:::-;44571:59;;44409:229;;;;;:::o;19372:142::-;19430:14;19491:5;19481:15;;19372:142;;;:::o;45529:510::-;45699:12;45757:5;45732:21;:30;;45724:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;45824:18;45835:6;45824:10;:18::i;:::-;45816:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;45890:12;45904:23;45931:6;:11;;45950:5;45957:4;45931:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45889:73;;;;45980:51;45997:7;46006:10;46018:12;45980:16;:51::i;:::-;45973:58;;;;45529:510;;;;;;:::o;41664:326::-;41724:4;41981:1;41959:7;:19;;;:23;41952:30;;41664:326;;;:::o;48215:712::-;48365:12;48394:7;48390:530;;;48425:10;48418:17;;;;48390:530;48559:1;48539:10;:17;:21;48535:374;;;48737:10;48731:17;48798:15;48785:10;48781:2;48777:19;48770:44;48535:374;48880:12;48873:20;;;;;;;;;;;:::i;:::-;;;;;;;;48215:712;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:155::-;1040:5;1078:6;1065:20;1056:29;;1094:41;1129:5;1094:41;:::i;:::-;986:155;;;;:::o;1147:133::-;1190:5;1228:6;1215:20;1206:29;;1244:30;1268:5;1244:30;:::i;:::-;1147:133;;;;:::o;1286:137::-;1340:5;1371:6;1365:13;1356:22;;1387:30;1411:5;1387:30;:::i;:::-;1286:137;;;;:::o;1429:139::-;1475:5;1513:6;1500:20;1491:29;;1529:33;1556:5;1529:33;:::i;:::-;1429:139;;;;:::o;1574:137::-;1619:5;1657:6;1644:20;1635:29;;1673:32;1699:5;1673:32;:::i;:::-;1574:137;;;;:::o;1717:141::-;1773:5;1804:6;1798:13;1789:22;;1820:32;1846:5;1820:32;:::i;:::-;1717:141;;;;:::o;1877:338::-;1932:5;1981:3;1974:4;1966:6;1962:17;1958:27;1948:122;;1989:79;;:::i;:::-;1948:122;2106:6;2093:20;2131:78;2205:3;2197:6;2190:4;2182:6;2178:17;2131:78;:::i;:::-;2122:87;;1938:277;1877:338;;;;:::o;2221:169::-;2282:5;2320:6;2307:20;2298:29;;2336:48;2378:5;2336:48;:::i;:::-;2221:169;;;;:::o;2410:340::-;2466:5;2515:3;2508:4;2500:6;2496:17;2492:27;2482:122;;2523:79;;:::i;:::-;2482:122;2640:6;2627:20;2665:79;2740:3;2732:6;2725:4;2717:6;2713:17;2665:79;:::i;:::-;2656:88;;2472:278;2410:340;;;;:::o;2756:139::-;2802:5;2840:6;2827:20;2818:29;;2856:33;2883:5;2856:33;:::i;:::-;2756:139;;;;:::o;2901:143::-;2958:5;2989:6;2983:13;2974:22;;3005:33;3032:5;3005:33;:::i;:::-;2901:143;;;;:::o;3050:329::-;3109:6;3158:2;3146:9;3137:7;3133:23;3129:32;3126:119;;;3164:79;;:::i;:::-;3126:119;3284:1;3309:53;3354:7;3345:6;3334:9;3330:22;3309:53;:::i;:::-;3299:63;;3255:117;3050:329;;;;:::o;3385:345::-;3452:6;3501:2;3489:9;3480:7;3476:23;3472:32;3469:119;;;3507:79;;:::i;:::-;3469:119;3627:1;3652:61;3705:7;3696:6;3685:9;3681:22;3652:61;:::i;:::-;3642:71;;3598:125;3385:345;;;;:::o;3736:474::-;3804:6;3812;3861:2;3849:9;3840:7;3836:23;3832:32;3829:119;;;3867:79;;:::i;:::-;3829:119;3987:1;4012:53;4057:7;4048:6;4037:9;4033:22;4012:53;:::i;:::-;4002:63;;3958:117;4114:2;4140:53;4185:7;4176:6;4165:9;4161:22;4140:53;:::i;:::-;4130:63;;4085:118;3736:474;;;;;:::o;4216:619::-;4293:6;4301;4309;4358:2;4346:9;4337:7;4333:23;4329:32;4326:119;;;4364:79;;:::i;:::-;4326:119;4484:1;4509:53;4554:7;4545:6;4534:9;4530:22;4509:53;:::i;:::-;4499:63;;4455:117;4611:2;4637:53;4682:7;4673:6;4662:9;4658:22;4637:53;:::i;:::-;4627:63;;4582:118;4739:2;4765:53;4810:7;4801:6;4790:9;4786:22;4765:53;:::i;:::-;4755:63;;4710:118;4216:619;;;;;:::o;4841:943::-;4936:6;4944;4952;4960;5009:3;4997:9;4988:7;4984:23;4980:33;4977:120;;;5016:79;;:::i;:::-;4977:120;5136:1;5161:53;5206:7;5197:6;5186:9;5182:22;5161:53;:::i;:::-;5151:63;;5107:117;5263:2;5289:53;5334:7;5325:6;5314:9;5310:22;5289:53;:::i;:::-;5279:63;;5234:118;5391:2;5417:53;5462:7;5453:6;5442:9;5438:22;5417:53;:::i;:::-;5407:63;;5362:118;5547:2;5536:9;5532:18;5519:32;5578:18;5570:6;5567:30;5564:117;;;5600:79;;:::i;:::-;5564:117;5705:62;5759:7;5750:6;5739:9;5735:22;5705:62;:::i;:::-;5695:72;;5490:287;4841:943;;;;;;;:::o;5790:468::-;5855:6;5863;5912:2;5900:9;5891:7;5887:23;5883:32;5880:119;;;5918:79;;:::i;:::-;5880:119;6038:1;6063:53;6108:7;6099:6;6088:9;6084:22;6063:53;:::i;:::-;6053:63;;6009:117;6165:2;6191:50;6233:7;6224:6;6213:9;6209:22;6191:50;:::i;:::-;6181:60;;6136:115;5790:468;;;;;:::o;6264:474::-;6332:6;6340;6389:2;6377:9;6368:7;6364:23;6360:32;6357:119;;;6395:79;;:::i;:::-;6357:119;6515:1;6540:53;6585:7;6576:6;6565:9;6561:22;6540:53;:::i;:::-;6530:63;;6486:117;6642:2;6668:53;6713:7;6704:6;6693:9;6689:22;6668:53;:::i;:::-;6658:63;;6613:118;6264:474;;;;;:::o;6744:345::-;6811:6;6860:2;6848:9;6839:7;6835:23;6831:32;6828:119;;;6866:79;;:::i;:::-;6828:119;6986:1;7011:61;7064:7;7055:6;7044:9;7040:22;7011:61;:::i;:::-;7001:71;;6957:125;6744:345;;;;:::o;7095:329::-;7154:6;7203:2;7191:9;7182:7;7178:23;7174:32;7171:119;;;7209:79;;:::i;:::-;7171:119;7329:1;7354:53;7399:7;7390:6;7379:9;7375:22;7354:53;:::i;:::-;7344:63;;7300:117;7095:329;;;;:::o;7430:327::-;7488:6;7537:2;7525:9;7516:7;7512:23;7508:32;7505:119;;;7543:79;;:::i;:::-;7505:119;7663:1;7688:52;7732:7;7723:6;7712:9;7708:22;7688:52;:::i;:::-;7678:62;;7634:116;7430:327;;;;:::o;7763:349::-;7832:6;7881:2;7869:9;7860:7;7856:23;7852:32;7849:119;;;7887:79;;:::i;:::-;7849:119;8007:1;8032:63;8087:7;8078:6;8067:9;8063:22;8032:63;:::i;:::-;8022:73;;7978:127;7763:349;;;;:::o;8118:359::-;8192:6;8241:2;8229:9;8220:7;8216:23;8212:32;8209:119;;;8247:79;;:::i;:::-;8209:119;8367:1;8392:68;8452:7;8443:6;8432:9;8428:22;8392:68;:::i;:::-;8382:78;;8338:132;8118:359;;;;:::o;8483:504::-;8566:6;8574;8623:2;8611:9;8602:7;8598:23;8594:32;8591:119;;;8629:79;;:::i;:::-;8591:119;8749:1;8774:68;8834:7;8825:6;8814:9;8810:22;8774:68;:::i;:::-;8764:78;;8720:132;8891:2;8917:53;8962:7;8953:6;8942:9;8938:22;8917:53;:::i;:::-;8907:63;;8862:118;8483:504;;;;;:::o;8993:509::-;9062:6;9111:2;9099:9;9090:7;9086:23;9082:32;9079:119;;;9117:79;;:::i;:::-;9079:119;9265:1;9254:9;9250:17;9237:31;9295:18;9287:6;9284:30;9281:117;;;9317:79;;:::i;:::-;9281:117;9422:63;9477:7;9468:6;9457:9;9453:22;9422:63;:::i;:::-;9412:73;;9208:287;8993:509;;;;:::o;9508:329::-;9567:6;9616:2;9604:9;9595:7;9591:23;9587:32;9584:119;;;9622:79;;:::i;:::-;9584:119;9742:1;9767:53;9812:7;9803:6;9792:9;9788:22;9767:53;:::i;:::-;9757:63;;9713:117;9508:329;;;;:::o;9843:351::-;9913:6;9962:2;9950:9;9941:7;9937:23;9933:32;9930:119;;;9968:79;;:::i;:::-;9930:119;10088:1;10113:64;10169:7;10160:6;10149:9;10145:22;10113:64;:::i;:::-;10103:74;;10059:128;9843:351;;;;:::o;10200:147::-;10295:45;10334:5;10295:45;:::i;:::-;10290:3;10283:58;10200:147;;:::o;10353:118::-;10440:24;10458:5;10440:24;:::i;:::-;10435:3;10428:37;10353:118;;:::o;10477:109::-;10558:21;10573:5;10558:21;:::i;:::-;10553:3;10546:34;10477:109;;:::o;10592:118::-;10679:24;10697:5;10679:24;:::i;:::-;10674:3;10667:37;10592:118;;:::o;10716:360::-;10802:3;10830:38;10862:5;10830:38;:::i;:::-;10884:70;10947:6;10942:3;10884:70;:::i;:::-;10877:77;;10963:52;11008:6;11003:3;10996:4;10989:5;10985:16;10963:52;:::i;:::-;11040:29;11062:6;11040:29;:::i;:::-;11035:3;11031:39;11024:46;;10806:270;10716:360;;;;:::o;11082:373::-;11186:3;11214:38;11246:5;11214:38;:::i;:::-;11268:88;11349:6;11344:3;11268:88;:::i;:::-;11261:95;;11365:52;11410:6;11405:3;11398:4;11391:5;11387:16;11365:52;:::i;:::-;11442:6;11437:3;11433:16;11426:23;;11190:265;11082:373;;;;:::o;11461:145::-;11555:44;11593:5;11555:44;:::i;:::-;11550:3;11543:57;11461:145;;:::o;11612:364::-;11700:3;11728:39;11761:5;11728:39;:::i;:::-;11783:71;11847:6;11842:3;11783:71;:::i;:::-;11776:78;;11863:52;11908:6;11903:3;11896:4;11889:5;11885:16;11863:52;:::i;:::-;11940:29;11962:6;11940:29;:::i;:::-;11935:3;11931:39;11924:46;;11704:272;11612:364;;;;:::o;11982:377::-;12088:3;12116:39;12149:5;12116:39;:::i;:::-;12171:89;12253:6;12248:3;12171:89;:::i;:::-;12164:96;;12269:52;12314:6;12309:3;12302:4;12295:5;12291:16;12269:52;:::i;:::-;12346:6;12341:3;12337:16;12330:23;;12092:267;11982:377;;;;:::o;12389:845::-;12492:3;12529:5;12523:12;12558:36;12584:9;12558:36;:::i;:::-;12610:89;12692:6;12687:3;12610:89;:::i;:::-;12603:96;;12730:1;12719:9;12715:17;12746:1;12741:137;;;;12892:1;12887:341;;;;12708:520;;12741:137;12825:4;12821:9;12810;12806:25;12801:3;12794:38;12861:6;12856:3;12852:16;12845:23;;12741:137;;12887:341;12954:38;12986:5;12954:38;:::i;:::-;13014:1;13028:154;13042:6;13039:1;13036:13;13028:154;;;13116:7;13110:14;13106:1;13101:3;13097:11;13090:35;13166:1;13157:7;13153:15;13142:26;;13064:4;13061:1;13057:12;13052:17;;13028:154;;;13211:6;13206:3;13202:16;13195:23;;12894:334;;12708:520;;12496:738;;12389:845;;;;:::o;13240:366::-;13382:3;13403:67;13467:2;13462:3;13403:67;:::i;:::-;13396:74;;13479:93;13568:3;13479:93;:::i;:::-;13597:2;13592:3;13588:12;13581:19;;13240:366;;;:::o;13612:::-;13754:3;13775:67;13839:2;13834:3;13775:67;:::i;:::-;13768:74;;13851:93;13940:3;13851:93;:::i;:::-;13969:2;13964:3;13960:12;13953:19;;13612:366;;;:::o;13984:::-;14126:3;14147:67;14211:2;14206:3;14147:67;:::i;:::-;14140:74;;14223:93;14312:3;14223:93;:::i;:::-;14341:2;14336:3;14332:12;14325:19;;13984:366;;;:::o;14356:::-;14498:3;14519:67;14583:2;14578:3;14519:67;:::i;:::-;14512:74;;14595:93;14684:3;14595:93;:::i;:::-;14713:2;14708:3;14704:12;14697:19;;14356:366;;;:::o;14728:::-;14870:3;14891:67;14955:2;14950:3;14891:67;:::i;:::-;14884:74;;14967:93;15056:3;14967:93;:::i;:::-;15085:2;15080:3;15076:12;15069:19;;14728:366;;;:::o;15100:::-;15242:3;15263:67;15327:2;15322:3;15263:67;:::i;:::-;15256:74;;15339:93;15428:3;15339:93;:::i;:::-;15457:2;15452:3;15448:12;15441:19;;15100:366;;;:::o;15472:::-;15614:3;15635:67;15699:2;15694:3;15635:67;:::i;:::-;15628:74;;15711:93;15800:3;15711:93;:::i;:::-;15829:2;15824:3;15820:12;15813:19;;15472:366;;;:::o;15844:::-;15986:3;16007:67;16071:2;16066:3;16007:67;:::i;:::-;16000:74;;16083:93;16172:3;16083:93;:::i;:::-;16201:2;16196:3;16192:12;16185:19;;15844:366;;;:::o;16216:::-;16358:3;16379:67;16443:2;16438:3;16379:67;:::i;:::-;16372:74;;16455:93;16544:3;16455:93;:::i;:::-;16573:2;16568:3;16564:12;16557:19;;16216:366;;;:::o;16588:::-;16730:3;16751:67;16815:2;16810:3;16751:67;:::i;:::-;16744:74;;16827:93;16916:3;16827:93;:::i;:::-;16945:2;16940:3;16936:12;16929:19;;16588:366;;;:::o;16960:::-;17102:3;17123:67;17187:2;17182:3;17123:67;:::i;:::-;17116:74;;17199:93;17288:3;17199:93;:::i;:::-;17317:2;17312:3;17308:12;17301:19;;16960:366;;;:::o;17332:::-;17474:3;17495:67;17559:2;17554:3;17495:67;:::i;:::-;17488:74;;17571:93;17660:3;17571:93;:::i;:::-;17689:2;17684:3;17680:12;17673:19;;17332:366;;;:::o;17704:400::-;17864:3;17885:84;17967:1;17962:3;17885:84;:::i;:::-;17878:91;;17978:93;18067:3;17978:93;:::i;:::-;18096:1;18091:3;18087:11;18080:18;;17704:400;;;:::o;18110:366::-;18252:3;18273:67;18337:2;18332:3;18273:67;:::i;:::-;18266:74;;18349:93;18438:3;18349:93;:::i;:::-;18467:2;18462:3;18458:12;18451:19;;18110:366;;;:::o;18482:::-;18624:3;18645:67;18709:2;18704:3;18645:67;:::i;:::-;18638:74;;18721:93;18810:3;18721:93;:::i;:::-;18839:2;18834:3;18830:12;18823:19;;18482:366;;;:::o;18854:398::-;19013:3;19034:83;19115:1;19110:3;19034:83;:::i;:::-;19027:90;;19126:93;19215:3;19126:93;:::i;:::-;19244:1;19239:3;19235:11;19228:18;;18854:398;;;:::o;19258:366::-;19400:3;19421:67;19485:2;19480:3;19421:67;:::i;:::-;19414:74;;19497:93;19586:3;19497:93;:::i;:::-;19615:2;19610:3;19606:12;19599:19;;19258:366;;;:::o;19630:::-;19772:3;19793:67;19857:2;19852:3;19793:67;:::i;:::-;19786:74;;19869:93;19958:3;19869:93;:::i;:::-;19987:2;19982:3;19978:12;19971:19;;19630:366;;;:::o;20002:::-;20144:3;20165:67;20229:2;20224:3;20165:67;:::i;:::-;20158:74;;20241:93;20330:3;20241:93;:::i;:::-;20359:2;20354:3;20350:12;20343:19;;20002:366;;;:::o;20374:::-;20516:3;20537:67;20601:2;20596:3;20537:67;:::i;:::-;20530:74;;20613:93;20702:3;20613:93;:::i;:::-;20731:2;20726:3;20722:12;20715:19;;20374:366;;;:::o;20746:::-;20888:3;20909:67;20973:2;20968:3;20909:67;:::i;:::-;20902:74;;20985:93;21074:3;20985:93;:::i;:::-;21103:2;21098:3;21094:12;21087:19;;20746:366;;;:::o;21118:118::-;21205:24;21223:5;21205:24;:::i;:::-;21200:3;21193:37;21118:118;;:::o;21242:271::-;21372:3;21394:93;21483:3;21474:6;21394:93;:::i;:::-;21387:100;;21504:3;21497:10;;21242:271;;;;:::o;21519:695::-;21797:3;21819:92;21907:3;21898:6;21819:92;:::i;:::-;21812:99;;21928:95;22019:3;22010:6;21928:95;:::i;:::-;21921:102;;22040:148;22184:3;22040:148;:::i;:::-;22033:155;;22205:3;22198:10;;21519:695;;;;;:::o;22220:379::-;22404:3;22426:147;22569:3;22426:147;:::i;:::-;22419:154;;22590:3;22583:10;;22220:379;;;:::o;22605:222::-;22698:4;22736:2;22725:9;22721:18;22713:26;;22749:71;22817:1;22806:9;22802:17;22793:6;22749:71;:::i;:::-;22605:222;;;;:::o;22833:348::-;22962:4;23000:2;22989:9;22985:18;22977:26;;23013:79;23089:1;23078:9;23074:17;23065:6;23013:79;:::i;:::-;23102:72;23170:2;23159:9;23155:18;23146:6;23102:72;:::i;:::-;22833:348;;;;;:::o;23187:640::-;23382:4;23420:3;23409:9;23405:19;23397:27;;23434:71;23502:1;23491:9;23487:17;23478:6;23434:71;:::i;:::-;23515:72;23583:2;23572:9;23568:18;23559:6;23515:72;:::i;:::-;23597;23665:2;23654:9;23650:18;23641:6;23597:72;:::i;:::-;23716:9;23710:4;23706:20;23701:2;23690:9;23686:18;23679:48;23744:76;23815:4;23806:6;23744:76;:::i;:::-;23736:84;;23187:640;;;;;;;:::o;23833:332::-;23954:4;23992:2;23981:9;23977:18;23969:26;;24005:71;24073:1;24062:9;24058:17;24049:6;24005:71;:::i;:::-;24086:72;24154:2;24143:9;24139:18;24130:6;24086:72;:::i;:::-;23833:332;;;;;:::o;24171:210::-;24258:4;24296:2;24285:9;24281:18;24273:26;;24309:65;24371:1;24360:9;24356:17;24347:6;24309:65;:::i;:::-;24171:210;;;;:::o;24387:222::-;24480:4;24518:2;24507:9;24503:18;24495:26;;24531:71;24599:1;24588:9;24584:17;24575:6;24531:71;:::i;:::-;24387:222;;;;:::o;24615:236::-;24715:4;24753:2;24742:9;24738:18;24730:26;;24766:78;24841:1;24830:9;24826:17;24817:6;24766:78;:::i;:::-;24615:236;;;;:::o;24857:313::-;24970:4;25008:2;24997:9;24993:18;24985:26;;25057:9;25051:4;25047:20;25043:1;25032:9;25028:17;25021:47;25085:78;25158:4;25149:6;25085:78;:::i;:::-;25077:86;;24857:313;;;;:::o;25176:419::-;25342:4;25380:2;25369:9;25365:18;25357:26;;25429:9;25423:4;25419:20;25415:1;25404:9;25400:17;25393:47;25457:131;25583:4;25457:131;:::i;:::-;25449:139;;25176:419;;;:::o;25601:::-;25767:4;25805:2;25794:9;25790:18;25782:26;;25854:9;25848:4;25844:20;25840:1;25829:9;25825:17;25818:47;25882:131;26008:4;25882:131;:::i;:::-;25874:139;;25601:419;;;:::o;26026:::-;26192:4;26230:2;26219:9;26215:18;26207:26;;26279:9;26273:4;26269:20;26265:1;26254:9;26250:17;26243:47;26307:131;26433:4;26307:131;:::i;:::-;26299:139;;26026:419;;;:::o;26451:::-;26617:4;26655:2;26644:9;26640:18;26632:26;;26704:9;26698:4;26694:20;26690:1;26679:9;26675:17;26668:47;26732:131;26858:4;26732:131;:::i;:::-;26724:139;;26451:419;;;:::o;26876:::-;27042:4;27080:2;27069:9;27065:18;27057:26;;27129:9;27123:4;27119:20;27115:1;27104:9;27100:17;27093:47;27157:131;27283:4;27157:131;:::i;:::-;27149:139;;26876:419;;;:::o;27301:::-;27467:4;27505:2;27494:9;27490:18;27482:26;;27554:9;27548:4;27544:20;27540:1;27529:9;27525:17;27518:47;27582:131;27708:4;27582:131;:::i;:::-;27574:139;;27301:419;;;:::o;27726:::-;27892:4;27930:2;27919:9;27915:18;27907:26;;27979:9;27973:4;27969:20;27965:1;27954:9;27950:17;27943:47;28007:131;28133:4;28007:131;:::i;:::-;27999:139;;27726:419;;;:::o;28151:::-;28317:4;28355:2;28344:9;28340:18;28332:26;;28404:9;28398:4;28394:20;28390:1;28379:9;28375:17;28368:47;28432:131;28558:4;28432:131;:::i;:::-;28424:139;;28151:419;;;:::o;28576:::-;28742:4;28780:2;28769:9;28765:18;28757:26;;28829:9;28823:4;28819:20;28815:1;28804:9;28800:17;28793:47;28857:131;28983:4;28857:131;:::i;:::-;28849:139;;28576:419;;;:::o;29001:::-;29167:4;29205:2;29194:9;29190:18;29182:26;;29254:9;29248:4;29244:20;29240:1;29229:9;29225:17;29218:47;29282:131;29408:4;29282:131;:::i;:::-;29274:139;;29001:419;;;:::o;29426:::-;29592:4;29630:2;29619:9;29615:18;29607:26;;29679:9;29673:4;29669:20;29665:1;29654:9;29650:17;29643:47;29707:131;29833:4;29707:131;:::i;:::-;29699:139;;29426:419;;;:::o;29851:::-;30017:4;30055:2;30044:9;30040:18;30032:26;;30104:9;30098:4;30094:20;30090:1;30079:9;30075:17;30068:47;30132:131;30258:4;30132:131;:::i;:::-;30124:139;;29851:419;;;:::o;30276:::-;30442:4;30480:2;30469:9;30465:18;30457:26;;30529:9;30523:4;30519:20;30515:1;30504:9;30500:17;30493:47;30557:131;30683:4;30557:131;:::i;:::-;30549:139;;30276:419;;;:::o;30701:::-;30867:4;30905:2;30894:9;30890:18;30882:26;;30954:9;30948:4;30944:20;30940:1;30929:9;30925:17;30918:47;30982:131;31108:4;30982:131;:::i;:::-;30974:139;;30701:419;;;:::o;31126:::-;31292:4;31330:2;31319:9;31315:18;31307:26;;31379:9;31373:4;31369:20;31365:1;31354:9;31350:17;31343:47;31407:131;31533:4;31407:131;:::i;:::-;31399:139;;31126:419;;;:::o;31551:::-;31717:4;31755:2;31744:9;31740:18;31732:26;;31804:9;31798:4;31794:20;31790:1;31779:9;31775:17;31768:47;31832:131;31958:4;31832:131;:::i;:::-;31824:139;;31551:419;;;:::o;31976:::-;32142:4;32180:2;32169:9;32165:18;32157:26;;32229:9;32223:4;32219:20;32215:1;32204:9;32200:17;32193:47;32257:131;32383:4;32257:131;:::i;:::-;32249:139;;31976:419;;;:::o;32401:::-;32567:4;32605:2;32594:9;32590:18;32582:26;;32654:9;32648:4;32644:20;32640:1;32629:9;32625:17;32618:47;32682:131;32808:4;32682:131;:::i;:::-;32674:139;;32401:419;;;:::o;32826:::-;32992:4;33030:2;33019:9;33015:18;33007:26;;33079:9;33073:4;33069:20;33065:1;33054:9;33050:17;33043:47;33107:131;33233:4;33107:131;:::i;:::-;33099:139;;32826:419;;;:::o;33251:222::-;33344:4;33382:2;33371:9;33367:18;33359:26;;33395:71;33463:1;33452:9;33448:17;33439:6;33395:71;:::i;:::-;33251:222;;;;:::o;33479:129::-;33513:6;33540:20;;:::i;:::-;33530:30;;33569:33;33597:4;33589:6;33569:33;:::i;:::-;33479:129;;;:::o;33614:75::-;33647:6;33680:2;33674:9;33664:19;;33614:75;:::o;33695:307::-;33756:4;33846:18;33838:6;33835:30;33832:56;;;33868:18;;:::i;:::-;33832:56;33906:29;33928:6;33906:29;:::i;:::-;33898:37;;33990:4;33984;33980:15;33972:23;;33695:307;;;:::o;34008:308::-;34070:4;34160:18;34152:6;34149:30;34146:56;;;34182:18;;:::i;:::-;34146:56;34220:29;34242:6;34220:29;:::i;:::-;34212:37;;34304:4;34298;34294:15;34286:23;;34008:308;;;:::o;34322:141::-;34371:4;34394:3;34386:11;;34417:3;34414:1;34407:14;34451:4;34448:1;34438:18;34430:26;;34322:141;;;:::o;34469:98::-;34520:6;34554:5;34548:12;34538:22;;34469:98;;;:::o;34573:99::-;34625:6;34659:5;34653:12;34643:22;;34573:99;;;:::o;34678:168::-;34761:11;34795:6;34790:3;34783:19;34835:4;34830:3;34826:14;34811:29;;34678:168;;;;:::o;34852:147::-;34953:11;34990:3;34975:18;;34852:147;;;;:::o;35005:169::-;35089:11;35123:6;35118:3;35111:19;35163:4;35158:3;35154:14;35139:29;;35005:169;;;;:::o;35180:148::-;35282:11;35319:3;35304:18;;35180:148;;;;:::o;35334:305::-;35374:3;35393:20;35411:1;35393:20;:::i;:::-;35388:25;;35427:20;35445:1;35427:20;:::i;:::-;35422:25;;35581:1;35513:66;35509:74;35506:1;35503:81;35500:107;;;35587:18;;:::i;:::-;35500:107;35631:1;35628;35624:9;35617:16;;35334:305;;;;:::o;35645:185::-;35685:1;35702:20;35720:1;35702:20;:::i;:::-;35697:25;;35736:20;35754:1;35736:20;:::i;:::-;35731:25;;35775:1;35765:35;;35780:18;;:::i;:::-;35765:35;35822:1;35819;35815:9;35810:14;;35645:185;;;;:::o;35836:348::-;35876:7;35899:20;35917:1;35899:20;:::i;:::-;35894:25;;35933:20;35951:1;35933:20;:::i;:::-;35928:25;;36121:1;36053:66;36049:74;36046:1;36043:81;36038:1;36031:9;36024:17;36020:105;36017:131;;;36128:18;;:::i;:::-;36017:131;36176:1;36173;36169:9;36158:20;;35836:348;;;;:::o;36190:191::-;36230:4;36250:20;36268:1;36250:20;:::i;:::-;36245:25;;36284:20;36302:1;36284:20;:::i;:::-;36279:25;;36323:1;36320;36317:8;36314:34;;;36328:18;;:::i;:::-;36314:34;36373:1;36370;36366:9;36358:17;;36190:191;;;;:::o;36387:96::-;36424:7;36453:24;36471:5;36453:24;:::i;:::-;36442:35;;36387:96;;;:::o;36489:104::-;36534:7;36563:24;36581:5;36563:24;:::i;:::-;36552:35;;36489:104;;;:::o;36599:90::-;36633:7;36676:5;36669:13;36662:21;36651:32;;36599:90;;;:::o;36695:77::-;36732:7;36761:5;36750:16;;36695:77;;;:::o;36778:149::-;36814:7;36854:66;36847:5;36843:78;36832:89;;36778:149;;;:::o;36933:111::-;36985:7;37014:24;37032:5;37014:24;:::i;:::-;37003:35;;36933:111;;;:::o;37050:129::-;37096:7;37125:5;37114:16;;37131:42;37167:5;37131:42;:::i;:::-;37050:129;;;:::o;37185:126::-;37222:7;37262:42;37255:5;37251:54;37240:65;;37185:126;;;:::o;37317:77::-;37354:7;37383:5;37372:16;;37317:77;;;:::o;37400:134::-;37458:9;37491:37;37522:5;37491:37;:::i;:::-;37478:50;;37400:134;;;:::o;37540:129::-;37597:9;37630:33;37657:5;37630:33;:::i;:::-;37617:46;;37540:129;;;:::o;37675:126::-;37725:9;37758:37;37789:5;37758:37;:::i;:::-;37745:50;;37675:126;;;:::o;37807:113::-;37857:9;37890:24;37908:5;37890:24;:::i;:::-;37877:37;;37807:113;;;:::o;37926:154::-;38010:6;38005:3;38000;37987:30;38072:1;38063:6;38058:3;38054:16;38047:27;37926:154;;;:::o;38086:307::-;38154:1;38164:113;38178:6;38175:1;38172:13;38164:113;;;38263:1;38258:3;38254:11;38248:18;38244:1;38239:3;38235:11;38228:39;38200:2;38197:1;38193:10;38188:15;;38164:113;;;38295:6;38292:1;38289:13;38286:101;;;38375:1;38366:6;38361:3;38357:16;38350:27;38286:101;38135:258;38086:307;;;:::o;38399:320::-;38443:6;38480:1;38474:4;38470:12;38460:22;;38527:1;38521:4;38517:12;38548:18;38538:81;;38604:4;38596:6;38592:17;38582:27;;38538:81;38666:2;38658:6;38655:14;38635:18;38632:38;38629:84;;;38685:18;;:::i;:::-;38629:84;38450:269;38399:320;;;:::o;38725:281::-;38808:27;38830:4;38808:27;:::i;:::-;38800:6;38796:40;38938:6;38926:10;38923:22;38902:18;38890:10;38887:34;38884:62;38881:88;;;38949:18;;:::i;:::-;38881:88;38989:10;38985:2;38978:22;38768:238;38725:281;;:::o;39012:233::-;39051:3;39074:24;39092:5;39074:24;:::i;:::-;39065:33;;39120:66;39113:5;39110:77;39107:103;;;39190:18;;:::i;:::-;39107:103;39237:1;39230:5;39226:13;39219:20;;39012:233;;;:::o;39251:176::-;39283:1;39300:20;39318:1;39300:20;:::i;:::-;39295:25;;39334:20;39352:1;39334:20;:::i;:::-;39329:25;;39373:1;39363:35;;39378:18;;:::i;:::-;39363:35;39419:1;39416;39412:9;39407:14;;39251:176;;;;:::o;39433:180::-;39481:77;39478:1;39471:88;39578:4;39575:1;39568:15;39602:4;39599:1;39592:15;39619:180;39667:77;39664:1;39657:88;39764:4;39761:1;39754:15;39788:4;39785:1;39778:15;39805:180;39853:77;39850:1;39843:88;39950:4;39947:1;39940:15;39974:4;39971:1;39964:15;39991:180;40039:77;40036:1;40029:88;40136:4;40133:1;40126:15;40160:4;40157:1;40150:15;40177:180;40225:77;40222:1;40215:88;40322:4;40319:1;40312:15;40346:4;40343:1;40336:15;40363:180;40411:77;40408:1;40401:88;40508:4;40505:1;40498:15;40532:4;40529:1;40522:15;40549:117;40658:1;40655;40648:12;40672:117;40781:1;40778;40771:12;40795:117;40904:1;40901;40894:12;40918:117;41027:1;41024;41017:12;41041:102;41082:6;41133:2;41129:7;41124:2;41117:5;41113:14;41109:28;41099:38;;41041:102;;;:::o;41149:169::-;41289:21;41285:1;41277:6;41273:14;41266:45;41149:169;:::o;41324:181::-;41464:33;41460:1;41452:6;41448:14;41441:57;41324:181;:::o;41511:225::-;41651:34;41647:1;41639:6;41635:14;41628:58;41720:8;41715:2;41707:6;41703:15;41696:33;41511:225;:::o;41742:179::-;41882:31;41878:1;41870:6;41866:14;41859:55;41742:179;:::o;41927:225::-;42067:34;42063:1;42055:6;42051:14;42044:58;42136:8;42131:2;42123:6;42119:15;42112:33;41927:225;:::o;42158:245::-;42298:34;42294:1;42286:6;42282:14;42275:58;42367:28;42362:2;42354:6;42350:15;42343:53;42158:245;:::o;42409:179::-;42549:31;42545:1;42537:6;42533:14;42526:55;42409:179;:::o;42594:225::-;42734:34;42730:1;42722:6;42718:14;42711:58;42803:8;42798:2;42790:6;42786:15;42779:33;42594:225;:::o;42825:230::-;42965:34;42961:1;42953:6;42949:14;42942:58;43034:13;43029:2;43021:6;43017:15;43010:38;42825:230;:::o;43061:180::-;43201:32;43197:1;43189:6;43185:14;43178:56;43061:180;:::o;43247:178::-;43387:30;43383:1;43375:6;43371:14;43364:54;43247:178;:::o;43431:168::-;43571:20;43567:1;43559:6;43555:14;43548:44;43431:168;:::o;43605:155::-;43745:7;43741:1;43733:6;43729:14;43722:31;43605:155;:::o;43766:182::-;43906:34;43902:1;43894:6;43890:14;43883:58;43766:182;:::o;43954:224::-;44094:34;44090:1;44082:6;44078:14;44071:58;44163:7;44158:2;44150:6;44146:15;44139:32;43954:224;:::o;44184:114::-;;:::o;44304:179::-;44444:31;44440:1;44432:6;44428:14;44421:55;44304:179;:::o;44489:166::-;44629:18;44625:1;44617:6;44613:14;44606:42;44489:166;:::o;44661:229::-;44801:34;44797:1;44789:6;44785:14;44778:58;44870:12;44865:2;44857:6;44853:15;44846:37;44661:229;:::o;44896:160::-;45036:12;45032:1;45024:6;45020:14;45013:36;44896:160;:::o;45062:167::-;45202:19;45198:1;45190:6;45186:14;45179:43;45062:167;:::o;45235:114::-;45317:1;45310:5;45307:12;45297:46;;45323:18;;:::i;:::-;45297:46;45235:114;:::o;45355:122::-;45428:24;45446:5;45428:24;:::i;:::-;45421:5;45418:35;45408:63;;45467:1;45464;45457:12;45408:63;45355:122;:::o;45483:138::-;45564:32;45590:5;45564:32;:::i;:::-;45557:5;45554:43;45544:71;;45611:1;45608;45601:12;45544:71;45483:138;:::o;45627:116::-;45697:21;45712:5;45697:21;:::i;:::-;45690:5;45687:32;45677:60;;45733:1;45730;45723:12;45677:60;45627:116;:::o;45749:122::-;45822:24;45840:5;45822:24;:::i;:::-;45815:5;45812:35;45802:63;;45861:1;45858;45851:12;45802:63;45749:122;:::o;45877:120::-;45949:23;45966:5;45949:23;:::i;:::-;45942:5;45939:34;45929:62;;45987:1;45984;45977:12;45929:62;45877:120;:::o;46003:152::-;46091:39;46124:5;46091:39;:::i;:::-;46084:5;46081:50;46071:78;;46145:1;46142;46135:12;46071:78;46003:152;:::o;46161:122::-;46234:24;46252:5;46234:24;:::i;:::-;46227:5;46224:35;46214:63;;46273:1;46270;46263:12;46214:63;46161:122;:::o
Swarm Source
ipfs://2db2715c08db16d7f99fa140eccabecc7f73ca666dead64c06e1109cacd8ed96
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.